PYTHONPATH 环境变量...之后如何创建每个子目录?

PYTHONPATH 环境变量...之后如何创建每个子目录?

我目前正在这样做:

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 目录中完成。

相关内容