![見出し画像](https://assets.st-note.com/production/uploads/images/35630075/rectangle_large_type_2_63b0659fc66102d3239090d6ecd9549c.jpeg?width=1200)
Photo by
askad
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!
まとめ
いくつか方法があるもののどれも一長一短なので
プロジェクトにあった方法で指定できると良さそう。