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

2025-02-27 09:07:00
admin
原创
23
摘要:问题描述:我刚刚加入了一个项目,该项目的现有代码库相当庞大。我们在 Linux 上进行开发,不使用 IDE。我们通过命令行运行。我正在尝试弄清楚如何让 Python 在运行项目模块时搜索正确的路径。例如,当我运行类似以下内容时:python someprojectfile.py 我明白了ImportError...

问题描述:

我刚刚加入了一个项目,该项目的现有代码库相当庞大。我们在 Linux 上进行开发,不使用 IDE。我们通过命令行运行。我正在尝试弄清楚如何让 Python 在运行项目模块时搜索正确的路径。例如,当我运行类似以下内容时:

python someprojectfile.py

我明白了

ImportError: no module named core.'somemodule'

我所有的导入都遇到了这个问题,我认为这是路径的问题。

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


解决方案 1:

有几种可能的方法可以实现这一点:

  • 将环境变量设置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通常是最好的方法。

然而,当你使用一些只在你自己的电脑上运行的东西时(或者当你有非标准设置时,例如有时在网络应用程序框架中),这样做并不罕见

import sys
from os.path import dirname
sys.path.append(dirname(__file__))

解决方案 2:

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

从您的示例来看,我猜您在 处确实有一个包。python目录中的~/codez/project文件将目录映射到命名空间。如果您的子目录都有一个文件,那么您只需要将基目录添加到。例如:__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

...

解决方案 3:

我知道这个帖子有点老了,但是我花了一些时间才明白这个问题的核心,所以我想分享一下。

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

from modules.report import report, reportError

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

python modules/report.py

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

我发现解决这个问题的最佳方法是将 CWD 附加到 Python 搜索路径中,方法是将其包含在顶部:

import sys

sys.path.append(".")

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

解决方案 4:

我发现最简单的方法是创建一个文件any_name.pth并将其放在文件夹中Libsite-packages。无论在何处安装python,您都应该找到该文件夹​​。

在该文件中,列出要保存要导入的模块的目录。例如,在该文件中创建如下一行:

C:Usersexample...example

通过在 Python 中运行以下命令,你将能够判断它是否有效:

import sys
for line in sys.path:
    print line

您将看到打印出来的目录,以及您还可以导入的其他目录。现在,您可以mymodule.py像下面这样轻松地导入位于该目录中的文件:

import mymodule

这不会导入子文件夹。为此,您可以想象创建一个 Python 脚本来创建一个.pth包含您定义的文件夹的所有子文件夹的文件。也许让它在启动时运行。

解决方案 5:

我读了这个问题是为了寻找答案,但我不喜欢其中任何一个。

所以我写了一个快速而粗糙的解决方案。只需将其放在 sys.path 的某个位置,它就会添加folder(从当前工作目录) 下的任何目录,或添加以下目录abspath

#using.py

import sys, os.path

def all_from(folder='', abspath=None):
    """add all dirs under `folder` to sys.path if any .py files are found.
    Use an abspath if you'd rather do it that way.

    Uses the current working directory as the location of using.py. 
    Keep in mind that os.walk goes *all the way* down the directory tree.
    With that, try not to use this on something too close to '/'

    """
    add = set(sys.path)
    if abspath is None:
        cwd = os.path.abspath(os.path.curdir)
        abspath = os.path.join(cwd, folder)
    for root, dirs, files in os.walk(abspath):
        for f in files:
            if f[-3:] in '.py':
                add.add(root)
                break
    for i in add: sys.path.append(i)

>>> import using, sys, pprint
>>> using.all_from('py') #if in ~, /home/user/py/
>>> pprint.pprint(sys.path)
[
#that was easy
]

我喜欢它,因为我可以有一个文件夹来存放一些随机工具,而不让它们成为包或任何东西的一部分,而且仍然可以用几行代码访问其中的一些(或全部)。

解决方案 6:

第一个任务是找出当前环境从哪里获取其标准库。这就是我要存储 OOP 模块的地方。

Import numpy

numpy.__file__

您将获得一个有关您环境的目录。对于另一台计算机,为 OOP 模块创建一个单独的目录是一个好主意。

Import sys 

sys.path.append('F:/Python/My_libra/')

解决方案 7:

老问题的新选择。
在 Debian 上
安装fail2ban包,看起来好像是硬编码安装在/usr/lib/python3/dist-packages/fail2banpython3 以外的路径上sys.path


> python3
Python 3.7.3 (v3.7.3:ef4ec6ed12, Jun 25 2019, 18:51:50)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/lib/python3.7/site-packages']
>>>

因此,我 (bash) 不仅复制了库,还将其链接到了较新的版本。
原始应用程序的未来更新也将自动应用于链接的版本。

 if [ -d /usr/lib/python3/dist-packages/fail2ban ]
   then
      for d in /usr/lib/python3.*
      do
         [ -d ${d}/fail2ban ] || \n            ln -vs /usr/lib/python3/dist-packages/fail2ban ${d}/
      done
   fi
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1298  
  华为IPD产品开发流程是一套先进且成熟的产品开发管理体系,对众多企业提升产品竞争力有着重要的借鉴意义。它涵盖多个关键要素,这些要素相互关联、相互作用,共同构建起高效、科学的产品开发流程。深入剖析其中的五个核心要素,能让我们更好地理解华为成功背后的产品开发逻辑,为企业的产品创新与发展提供有力的指导。市场管理市场管理是IP...
IPD框架   17  
  华为集成产品开发(IPD)体系作为一套先进的产品开发管理理念和方法,在华为的发展历程中发挥了至关重要的作用。在供应链管理领域,IPD同样展现出巨大的价值,深刻影响着企业的运营效率、产品质量以及市场竞争力。通过将IPD理念融入供应链管理,华为实现了从产品规划到交付的全流程优化,为企业的持续发展奠定了坚实基础。IPD对供应...
IPD集成产品开发流程   19  
  IPD(Integrated Product Development)项目管理作为一种先进的产品开发管理模式,旨在通过整合跨部门资源,实现产品的高效开发与上市。然而,在实际推行过程中,IPD项目管理面临着诸多风险,若处理不当,可能导致项目进度延迟、成本超支甚至项目失败。深入了解这些风险并制定有效的应对策略,对于保障IP...
华为IPD流程   16  
  华为作为全球知名的科技企业,其成功背后的管理模式备受关注。其中,IPD(集成产品开发)产品开发流程对华为的创新发展起到了至关重要的推动作用。IPD不仅仅是一种流程,更是一种先进的管理理念,它将产品开发视为一个系统工程,涵盖了从市场需求分析、产品规划、研发、生产到上市等多个环节,通过整合企业内外部资源,实现高效、协同的产...
IPD流程中PDCP是什么意思   17  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用