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

2024-04-19 21:19:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

python someprojectfile.py

我明白了

ImportError: no module named core.'somemodule'

我从所有的进口货中得到这个,我想这是路径的问题。

TLDR编号:

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


Tags: 模块文件项目no代码命令行py路径
3条回答

有几种可能的方法:

  • 将环境变量PYTHONPATH设置为以冒号分隔的目录列表,以搜索导入的模块。
  • 在程序中,使用sys.path.append('/path/to/search')添加希望Python搜索导入模块的目录名。^{}只是Python每次被要求导入模块时搜索的目录列表,您可以根据需要对其进行更改(尽管我不建议删除任何标准目录!)。Python启动时,放在环境变量PYTHONPATH中的任何目录都将插入sys.path
  • 使用^{}将目录添加到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__))

我知道这根线有点老了,但我花了一些时间才真正了解它,所以我想和大家分享。

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

from modules.report import report, reportError

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

python modules/report.py

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

我发现最新的解决方案是在Python搜索路径中附加CWD,在顶部包括:

import sys

sys.path.append(".")

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

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

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

PYTHONPATH=$PYTHONPATH:$HOME/adaifotis/project

除了测试PYTHONPATH环境变量之外,正如David所解释的,您还可以用python进行如下测试:

$ python
>>> import project                      # should work if PYTHONPATH set
>>> import sys
>>> for line in sys.path: print line    # print current python path

。。。

相关问题 更多 >