概要
Python のプログラムから絶対 importするときには、sys.path
に書かれているパスの先頭から検索されるので、これに何が入っているかは重要。
Python のプログラム起動方法には何種類かあり、それによりモジュールの検索パスである sys.path
の値が異なる。
参考文献
v3.8.2 版を閲覧
- Python のセットアップと利用, 1. コマンドラインと環境. https://docs.python.org/ja/3/using/cmdline.html
詳細
簡単に言うと
- (A) ファイルなどを直接指定した場合はそれに関連するディレクトリが
sys.path
の先頭に来る - (B)
-m
でモジュール・パッケージを指定した場合はカレントディレクトリが先頭要素になる。カレントディレクトリは空文字列''
で表される。 - (C) 「実行するプログラムの場所」に相当するものがない場合も、カレントディレクトリが先頭になる。
- いずれの場合でも、モジュール名は
"__main__"
という文字列である。
まとめると以下の通り。ディレクトリ (パッケージ) や .zip ファイルを起動できることを自分は知らなかった。また、パターン (A) の場合にも、カレントディレクトリが sys.path
に含まれていると思っちゃう人も多いのではないだろうか。
パターン |
python の後の引数 |
実行されるもの | そのモジュール名 (__name__ ) |
sys.path の先頭要素 |
---|---|---|---|---|
(A) | <.py ファイル> |
そのファイル | __main__ |
<そのファイルのあるディレクトリ> |
(A) | <ディレクトリ> |
<ディレクトリ>/__main__.py |
__main__ |
<ディレクトリ> |
(A) | <.zip ファイル> |
.zip ファイル 内の __main__.py
|
__main__ |
<.zip ファイル> |
(B) | -m <モジュール> |
<モジュール>.py |
__main__ |
カレントディレクトリ (空文字列) |
(B) | -m <パッケージ> |
<パッケージ>/__main__.py |
__main__ |
カレントディレクトリ |
(C) | -c <コマンド> |
<コマンド> | __main__ |
カレントディレクトリ |
(C) | - |
標準入力で渡されるスクリプト | __main__ |
カレントディレクトリ |
-I
使用時の注意
起動オプションで -I
を指定すると、-E -s
を指定したことになり、isolated モード でインタプリタが起動する。
このとき、(-s
の影響により) 上記 先頭要素は sys.path
に追加されない。
したがって基本的には、pip install
でインストールされたモジュールしか (絶対) import できない。
実行スクリプトの隣にあるモジュールであっても import できないので注意すること1。
-
なお、実行スクリプトの隣りにあるモジュールは相対 import もできない。
__main__
モジュールからの相対インポートができないからである。 ↩