見出し画像

Pythonの自作モジュールをimportしたい(PYTHONPATH, sys.path.append, pth)

Pythonの自作モジュールをインポートする方法をハマったところも込みでまとめてみました。

環境

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.6
BuildVersion:	19G2021

$ python3 --version
Python 3.7.3

使い方

結論から言うと、何もしない・PYTHONPATHに設定する・sys.path.append・pthファイルに設定するを使う方法があった。

何もしない方法

同じディレクトリにモジュールがあるなら

$ ls
mymodule.py		sample.py

モジュールはこんな感じ

$ cat mymodule.py
#!/usr/bin/env python3

def hello():
   print('hello!')


def main():
   exit(0)


if __name__ == '__main__':
   main()

実行ファイルはこんな感じで

$ cat sample.py
#!/usr/bin/env python3

import sys
import mymodule


def main():
   mymodule.hello()


if __name__ == '__main__':
   main()
   

実行できた

$ python3 sample.py
hello!

ただ違うディレクトリにモジュールがあると、エラーとなってしまう。

$ tree
├── modules
│   └── mymodule.py
├── note.md
└──sample.py​
$ python3 sample.py
Traceback (most recent call last):
 File "sample.py", line 6, in <module>
   import mymodule
ModuleNotFoundError: No module named 'mymodule'

PYTHONPATHを指定する方法
そこでPYTHONPATH。モジュールはPYTHONPATHを指定してあげれば、探してくれた

$ export PYTHONPATH="${PYTHONPATH}:/path/to/modules"; python3 sample.py
hello!

よく使うモジュールなら.bashrcにでも書いておけば良さそう。
でも、めったに使わないものだとPATHに書くほどでもないなぁと思ってしまった。

sys.path.appendを使う方法
そんなときはsys.path.appendで実行できた。 PYTHONPATHがなくても

$ echo $PYTHONPATH
### 出力なし

sample.pyにsys.path.appendを追加して

import sys
sys.path.append('./modules')
import mymodule
$ python3 sample.py
hello!

楽ちん!
と思ったらflake8でエラーがでてしまっていた。。 importは最初に書かないといけないらしい。。

$ flake8 sample.py
sample.py:7:1: E402 module level import not at top of file

PEP8に違反するのは微妙だけど、#noqaでエラーを消すしかなさそう。。

import sys
sys.path.append('./modules')
import mymodule # noqa: errors

pthファイルを設定する方法
最後にpthファイルを設定する方法もあった。
どうやらsite-packagesにpthファイルを置くらしい。
site-packagesのディレクトリはgetsitepackeges()で取れる。

$ python3 -c "import site; print (site.getsitepackages())"
['/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']
$ cd /usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages

ここにpthファイルを置いてあげれば

$ cat mymodules.pth
/path/to/modules

呼び出せた!

$ python3 sample.py
hello!

まとめ

いくつか方法があるもののどれも一長一短なので
プロジェクトにあった方法で指定できると良さそう。

この記事が気に入ったらサポートをしてみませんか?