ディレクトリにcdすることなく、コマンドラインでPythonスクリプトを使用するにはどうすればよいですか?PYTHONPATHですか?


157

PYTHONPATHをどのように使用できますか?パスでスクリプトを実行しようとすると、ファイルが見つかりません。スクリプトを保持するディレクトリにcdすると、スクリプトが実行されます。それで、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を使用できないのはなぜですか?


1
この投稿のタイトルを変更できますか?実際にの説明を求めているのではありませんPYTHONPATH
Nico Cernek、

タイトルを編集したのは、グーグルで最初に表示されるためですPYTHONPATH
raphael

回答:


194

あなたは少し混乱していると思います。PYTHONPATHは、Pythonモジュールをインポートするための検索パスを設定します。試行しているように実行するためではありません。

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

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

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

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

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

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

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

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

#!/usr/bin/env python

そしてそれに実行権限を与えます:

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

そうすればgmbx.py、どこからでも簡単に実行できるはずです。


2
ありがとう、友達。私はまだこれを解決しています。スクリプトは、カスタムPYTHONPATHからモジュールをインポートすることに成功しました。そして今、私は違いを理解しています。それはすべてスクリプトとモジュールの違いです。コマンドスクリプト呼び出しとpythonインポート。はい、実際に使用しますexport PATH=$PATH:/home/etc
Randy Skretka 2013

57

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

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

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

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


38

PYTHONPATHimportステートメントにのみ影響し、引数として指定されたpythonファイルのトップレベルPythonインタープリターの検索には影響しません。

PYTHONPATH設定する必要があるのは良い考えではありません-環境変数に依存するものと同様に、異なるマシン間で一貫して物事を複製することは難しいです。Pythonがすでに認識しているシステム依存のパスに( 'pip'またはdistutilsを使用して)インストールできるPython 'パッケージ'を使用することをお勧めします。

https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/-'The Hitchhiker's Guide to Packaging'とhttp://docs.python.org/3/tutorialを読んでください。/modules.html -低レベルでPYTHONPATHやパッケージについて説明します。


ポイントを取る。この特定のケースでは、PYTHONPATHに追加してもうまくいくようです。1台のマシンの1人のユーザーとして、すでに記述されている.pyコードのいくつかを十分に利用して再利用できます。
Randy Skretka 2013

1
正直なところ、ルートアクセスが必要なシステム依存パスにインストールすることは、を使用するよりも良いとは思いませんPYTHONPATH。私pip installは、ルートアクセスがなくて(pipがローカルインストールを実行できることを知っている)ホストでの通常のユーザーであるという主張を主張した初歩的なPythonプログラムに対処しなければならなかった回数はもう数えません。またピップなし。ここに、Pythonソフトウェアを配布するすべての人へのアドバイスがあります。まず、rootアクセスがなく、pipを使用しないコアPythonディストリビューションしか持たないバニラLinuxホストに独自のソフトウェアをインストールしてみてください。
2018

3

PATHとPYTHONPATHは混同していると思います。「スクリプト」を実行するために必要なのは、その親ディレクトリをPATH変数に追加することだけです。これを実行してテストできます

which myscript.py

また、myscripy.pyカスタムモジュールに依存している場合、その親ディレクトリもPYTHONPATH変数に追加する必要があります。残念ながら、Pythonの設計者は明らかに薬物を使用していたため、次のようにreplでインポートをテストしても、スクリプトで使用できるように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

3

あなたの例のようにPYTHONPATHを設定すると、あなたはできるはずです

python -m gmbx

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.