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


9

我目前正在这样做:

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

如何使PYTHONPATH包含所有子目录?

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

Answers:


14

这不是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路径。鉴于口译员在这方面对软件包的支持,是否肯定有更好的方法来完成您要执行的任务?


3
伙计,我希望每个站点在拒绝您发布特权之前都会检查您的其他帐户。它从rep开始就很糟糕,尤其是对于一个URL限制之类的东西...(我为您提供了更多参考资料,OP)
Jed Smith

1

这不是环境PATH变量的工作方式-您将其提供给顶级目录,并且由应用程序决定是否需要递归目录树。


因此,如果我在/home/$USER/myfile.py下有一个python文件,可以导入吗?
亚历克斯

当然可以,为什么不呢?
EEAA,2009年

1

当然,可以使用shell将目录的子目录添加到PYTHONPATH变量中。我目前在.bashrc中使用类似于以下内容的内容:

export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"

这将包括用户文件夹的所有子目录,在树中的深度为2。find命令查找目录(“ -d型”),以下sed和tr命令以PATH变量的常用方式格式化输出。

放弃“ -maxdepth 2”将包括主文件夹的所有子目录,这可能要搜索很多。也许只能在$ HOME / repository / python-stuff目录中完成此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.