PYTHONPATH環境変数...その後、すべてのサブディレクトリをどのように作成しますか?


9

私は現在これを行います:

PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff

PYTHONPATHにすべてのサブディレクトリを含めることができるようにするにはどうすればよいですか?

PYTHONPATH = /home/$USER/....and-all-subdirectories

回答:


14

それはPYTHONPATHが機能する方法ではありません。PYTHONPATHは、シェルのPATHとは異なる方法で検索パスを扱います。私がこれを行うとしましょう:

$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py

これはPythonで機能します(sys.path現在のディレクトリが含まれます):

$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> quit()

ただし、サブディレクトリは、ディレクトリにある場合__init__.pyはパッケージとして扱われ、それ以外の場合はPYTHONPATHによって無視されます。

$ mkdir /home/jsmith/python/pkg
$ cd /home/jsmith/python/pkg
$ touch __init__.py c.py d.py
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> import c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named c

そのサブディレクトリにあるものを取得するには、これは機能します:

>>> from pkg import c   # Works
>>> import pkg.c        # Works

PYTHONPATH内のすべてのサブディレクトリが追加されるソリューションをロールするには、すべてのフォルダーをPYTHONPATHに明示的に追加するか、sys.pathプログラムで追加する必要があります。この動作は意図的なものであり、シェルPATHのように動作しません。この点でのインタープリターによるパッケージのサポートを考えると、あなたが求めていることを達成するためのより良い方法は確かにありますか?


3
投稿権限を拒否する前に、各サイトで他のアカウントを確認してください。特に、1つのURLの制限など、最初からやり直すのは面倒です...(私はあなたにもっと参照がありました、OP)
Jed Smith

1

それは環境のPATH変数が機能する方法ではありません-最上位のディレクトリを指定し、必要に応じてディレクトリツリーを再帰させるのはアプリケーションに任されています。


/home/$USER/myfile.pyの下にpythonファイルがある場合、これをインポートできますか?
アレックス、

確かに、どうしてできなかったのですか。
EEAA、

1

もちろん、シェルを使用して、ディレクトリのサブディレクトリをPYTHONPATH変数に追加することができます。現在、.bashrcで次のようなものを使用しています。

export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"

これには、ツリーの深さ2までのユーザーフォルダーのすべてのサブディレクトリが含まれます。findコマンドはディレクトリを見つけ( '-type d')、次のsedコマンドとtrコマンドはPATH変数の通常の方法で出力をフォーマットします。

'-maxdepth 2'を省略すると、ホームフォルダーのすべてのサブディレクトリが含まれます。おそらく、これは$ HOME / repository / python-stuffディレクトリでのみ行う必要があります。

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