回答:
それは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のように動作しません。この点でのインタープリターによるパッケージのサポートを考えると、あなたが求めていることを達成するためのより良い方法は確かにありますか?
もちろん、シェルを使用して、ディレクトリのサブディレクトリを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ディレクトリでのみ行う必要があります。