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)
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”子文件夹,一切正常。