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

2025-02-27 09:07:00
admin
原创
75
摘要:问题描述:我刚刚加入了一个项目,该项目的现有代码库相当庞大。我们在 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3018  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1880  
  PLM(产品生命周期管理)系统在企业产品研发、生产与管理过程中发挥着至关重要的作用。它能够整合产品全生命周期中的各类数据与流程,提升企业的协同效率、降低成本并加速产品上市。然而,不同企业由于业务模式、产品特性以及管理理念的差异,对PLM系统有着个性化的需求。如何实现这些个性化需求,成为企业在实施PLM系统定制开发时面临...
免费plm软件   0  
  在企业的发展进程中,跨地域协同工作变得愈发普遍和重要。不同地区的团队需要紧密合作,以实现资源共享、提高效率和创新能力。而产品生命周期管理(PLM)系统在这一过程中发挥着关键作用,尤其是其分布式架构,为跨地域协同提供了强大的支持。PLM系统概述PLM系统是一种用于管理产品从概念设计到退役全生命周期过程中所有数据和流程的软...
免费plm管理软件   0  
  在企业项目管理中,资源平衡是确保项目顺利推进、提高效率与效益的关键环节。产品生命周期管理(PLM)系统作为整合产品全生命周期信息与流程的重要工具,为实现资源平衡提供了强大的支持。通过合理运用PLM系统,企业能够优化资源分配、提升协同效率,从而在激烈的市场竞争中占据优势。接下来,我们将深入探讨如何借助PLM系统实现资源平...
plm系统   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用