私は現在これを行います:
PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff
PYTHONPATHにすべてのサブディレクトリを含めることができるようにするにはどうすればよいですか?
PYTHONPATH = /home/$USER/....and-all-subdirectories
それは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ディレクトリでのみ行う必要があります。
これは、環境PATH変数が機能する方法ではありません。最上位のディレクトリを指定し、必要に応じてディレクトリツリーを再帰させるのはアプリケーションの責任です。