我目前这样做:
PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff
我怎样才能让PYTHONPATH包含一切子目录?
PYTHONPATH = /home/$USER/....and-all-subdirectories
这不是PYTHONPATH的工作原理。 PYTHONPATH将其searchpath与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中的每个子目录都添加一个解决scheme,您需要以编程方式明确地将每个文件夹添加到PYTHONPATH或sys.path 。 这种行为是故意的, 并不像shell的PATH行为。 鉴于口译员在这方面对软件包的支持,当然有更好的方法来完成你所追求的目标。
这不是环境PATHvariables的工作原理 – 您将其设置为顶层目录,如果需要,则由应用程序对目录树进行recursion。
当然,可以使用shell将目录的子目录添加到PYTHONPATHvariables中。 我目前在我的.bashrc中使用类似于以下内容的内容:
export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"
这将包括您的用户文件夹的所有子目录在树中深度为2。 find命令查找目录('-type d'),以下sed和tr命令以通常的PATHvariables方式格式化输出。
离开'-maxdepth 2'将包括你的home文件夹的所有子目录,这可能是相当多的search。 也许这只能在你的$ HOME / repository / python-stuff目录中完成。