1
1

More than 3 years have passed since last update.

【Python】起動方法による sys.path の違い (v3.8.2)

Last updated at Posted at 2020-04-14

概要

Python のプログラムから絶対 importするときには、sys.path に書かれているパスの先頭から検索されるので、これに何が入っているかは重要。
Python のプログラム起動方法には何種類かあり、それによりモジュールの検索パスである sys.path の値が異なる。

参考文献

v3.8.2 版を閲覧

詳細

簡単に言うと

  • (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


  1. なお、実行スクリプトの隣りにあるモジュールは相対 import もできない。__main__ モジュールからの相対インポートができないからである。 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1