将Python搜索路径扩展到其他源

the*_*tro 89 python import search path

我刚刚加入了一个拥有相当大的现有代码库的项目.我们在linux中开发并且不使用和IDE.我们通过命令行运行.我正在试图弄清楚如何在运行项目模块时让python搜索正确的路径.例如,当我运行类似的东西:

python someprojectfile.py
Run Code Online (Sandbox Code Playgroud)

我明白了

ImportError: no module named core.'somemodule'
Run Code Online (Sandbox Code Playgroud)

我得到了所有我的导入,我认为这是路径的问题.

TLDR:

如何~/codez/project/在导入语句期间让Python搜索*.py文件的所有文件和文件夹.

Dav*_*d Z 156

有几种可行的方法可以做到这一点:

  • 将环境变量设置PYTHONPATH为以冒号分隔的目录列表,以搜索导入的模块.
  • 在您的程序中,用于sys.path.append('/path/to/search')添加希望Python搜索导入模块的目录名称.sys.path只是Python每次被要求导入模块时搜索的目录列表,您可以根据需要进行更改(尽管我不建议删除任何标准目录!).在Python启动时,PYTHONPATH将插入环境变量中的任何目录sys.path.
  • 使用site.addsitedir的目录添加到sys.path.这与简单的附加区别在于,当您使用时addsitedir,它还会查找.pth该目录中的文件,并使用它们sys.path根据文件内容添加其他目录.有关详细信息,请参阅文档.

您想要使用哪一种取决于您的情况.请记住,当您将项目分发给其他用户时,他们通常会以这样的方式安装它,即Python的导入器会自动检测Python代码文件(即包通常安装在site-packages目录中),所以如果你搞砸了sys.path你的代码,当代码在另一台计算机上运行时,这可能是不必要的,甚至可能产生不利影响.对于开发,我猜想设置PYTHONPATH通常是最好的方法.

但是,当您使用的东西只能在您自己的计算机上运行时(或者您有非标准设置时,例如有时在Web应用程序框架中),执行类似的操作并不罕见

import sys
from os.path import dirname
sys.path.append(dirname(__file__))
Run Code Online (Sandbox Code Playgroud)

  • 要设置`PYTHONPATH`:在`.bashrc`或你的shell使用的任何启动文件(如果它不是Bash),写`export PYTHONPATH = $ PYTHONPATH:$ HOME/codez/project`.但是如果你有一堆子目录,我会创建一个`.pth`文件并使用`site.addsitedir`.您可以创建一个可以为您调用该函数的模块`sitecustomize`; 尝试将它放在`〜/ .local/lib/python2.6/sitecustomize.py`(替换你的Python版本),以便有希望自动导入. (3认同)

And*_* B. 11

您还应该在这里阅读有关python包的内容:http://docs.python.org/tutorial/modules.html.

从你的例子中,我猜你真的有一个包~/codez/project.__init__.pypython目录中的文件将目录映射到命名空间.如果您的子目录都有一个__init__.py文件,那么您只需要将基本目录添加到您的子目录中PYTHONPATH.例如:

PYTHONPATH = $ PYTHONPATH:$ HOME/adaifotis /项目

除了测试你的PYTHONPATH环境变量之外,正如David解释的那样,你可以在python中测试它,如下所示:

$ python
>>> import project                      # should work if PYTHONPATH set
>>> import sys
>>> for line in sys.path: print line    # print current python path
Run Code Online (Sandbox Code Playgroud)

...


小智 6

我知道这个线程有点旧,但是我花了一些时间才找到它的核心,所以我想分享一下。

在我的项目中,我在父目录中有主脚本,为了区分模块,我将所有支持模块放在一个名为“模块”的子文件夹中。在我的主脚本中,我像这样导入这些模块(对于名为 report.py 的模块):

from modules.report import report, reportError
Run Code Online (Sandbox Code Playgroud)

如果我调用我的主脚本,这会起作用。但是,我想通过main()在每个模块中包含一个并直接调用每个模块来测试每个模块,如下所示:

python modules/report.py
Run Code Online (Sandbox Code Playgroud)

现在 Python 抱怨它找不到“一个名为 modules 的模块”。这里的关键是,默认情况下,Python 在其搜索路径中包含脚本的文件夹,但不包含 CWD。所以这个错误实际上说的是“我找不到模块子文件夹”。这是因为 report.py 模块所在的目录中没有“modules”子目录。

我发现最巧妙的解决方案是在 Python 搜索路径中添加 CWD,方法是将其包含在顶部:

import sys

sys.path.append(".")
Run Code Online (Sandbox Code Playgroud)

现在 Python 搜索 CWD(当前目录),找到“modules”子文件夹,一切正常。