web-dev-qa-db-ja.com

PYTHONPATHの使い方

PYTHONPATHをどのように利用できますか?パスでスクリプトを実行しようとすると、ファイルが見つかりません。スクリプトを格納しているディレクトリに移動すると、スクリプトが実行されます。それで、PYTHONPATHは何が良いのでしょうか?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

ファイルディレクトリにcdした後、実行されます。

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

PYTHONPATHを使用できないのはなぜですか?

128
Randy Skretka

私はあなたが少し混乱していると思います。 PYTHONPATHはimporting pythonモジュールの検索パスを設定します。あなたが試しているようなそれらを実行するためのものではありません。

PYTHONPATHモジュールファイルのデフォルトの検索パスを増やします。形式はシェルのPATHと同じです。os.pathsepで区切られた1つ以上のディレクトリパス名(例:Unixではコロン、Windowsではセミコロン)。存在しないディレクトリは黙って無視されます。

通常のディレクトリに加えて、個々のPYTHONPATHエントリは純粋なPythonモジュールを含むzipファイル(ソース形式またはコンパイル形式)を参照することができます。拡張モジュールはzipファイルからインポートできません。

デフォルトの検索パスはインストールに依存しますが、通常はプレフィックス/ lib/pythonversionで始まります(上記のPYTHONHOMEを参照)。常にPYTHONPATHに追加されます。

上記の「インターフェースオプション」で説明したように、PYTHONPATHの前の検索パスに追加のディレクトリが挿入されます。検索パスは、Pythonプログラム内から変数sys.pathとして操作できます。

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

あなたが探しているのはパスです。

export PATH=$PATH:/home/randy/lib/python 

ただし、pythonスクリプトをプログラムとして実行するには、最初の行にPythonの Shebang を設定する必要もあります。このようなものでうまくいくはずです。

#!/usr/bin/env python

それに実行権限を与えます。

chmod +x /home/randy/lib/python/gbmx.py

そうすれば、どこからでもgmbx.pyを実行することができるはずです。

161
Pedro Werneck

あなたはPATHとPYTHONPATHを混同しています。これをする必要があります:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATHは、どのモジュールをロードするかを決定するためにPythonインタプリタによって使用されます。

PATHは、実行する実行可能ファイルを決定するためにシェルによって使用されます。

45
Richard

PYTHONPATHimportステートメントにのみ影響し、引数として与えられたPythonファイルのトップレベルPythonインタプリタのルックアップには影響しません。

環境変数に依存するものと同じように、PYTHONPATHを設定する必要はありません。異なるマシン間で一貫して物事を複製するのは難しいです。 Pythonが既に知っているシステム依存のパスに( 'pip'、またはdistutilsを使用して)インストールできるPythonの 'packages'を使用することをお勧めします。

https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 「包装に関するヒッチハイクガイド」、および http://docs.pythonを読んでください。 .org/3/tutorial/modules.html - PYTHONPATHとパッケージを低レベルで説明しています。

32
codedstructure

私はあなたがPATHとPYTHONPATHを混同していると思います。あなたが 'スクリプト'を実行するためにしなければならないのはあなたのPATH変数にそれの親ディレクトリを追加することだけです。あなたはこれをテストすることができます。

which myscript.py

また、myscripy.pyがカスタムモジュールに依存している場合は、その親ディレクトリもPYTHONPATH変数に追加する必要があります。残念なことに、pythonのデザイナーは明らかに薬物治療を受けていたので、あなたのインポートを以下のように返信してテストしてもあなたのPYTHONPATHがスクリプトでの使用に適切に設定されることを保証するものではありません。 Pythonプログラミングのこの部分は魔法であり、stackoverflowでは適切に答えられません。

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule
2
W4t3randWind

あなたの例のようにPYTHONPATHが設定されていれば、できるはずです。

python -m gmbx

-mオプションは、あなたがPYTHONPATHに追加したものも含めて、Pythonがあなたのモジュールをパスで検索するようにします。 python gmbx.pyのようなインタプリタを実行すると、それは特定のファイルを探し、PYTHONPATHは適用されません。

1
Tigran Saluev