web-dev-qa-db-ja.com

PYTHONPATH環境変数...後ですべてのサブディレクトリを作成するにはどうすればよいですか?

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

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

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

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

それは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のように何も動作しません。この点でのインタープリターによるパッケージのサポートを考えると、あなたが求めていることを達成するためのより良い方法は確かにありますか?

14
Jed Smith

もちろん、シェルを使用して、ディレクトリのサブディレクトリを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ディレクトリでのみ行う必要があります。

1
spinup

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

1
EEAA