我目前正在这样做:
PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff
我怎样才能使 PYTHONPATH 包含所有子目录?
PYTHONPATH = /home/$USER/....and-all-subdirectories
答案1
PYTHONPATH 的工作方式并非如此;PYTHONPATH 对待其搜索路径的方式与 shell 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
以编程方式添加。此行为是有意为之,并且表现为没有什么就像 shell PATH。鉴于解释器在这方面对包的支持,肯定有更好的方法来实现你想要的?
答案2
环境 PATH 变量的工作方式并非如此 - 您为其提供顶级目录,然后由应用程序在需要时递归目录树。
答案3
当然,可以使用 shell 将目录的子目录添加到 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 目录中完成。