PYTHONPATH 与 sys.path

2025-03-11 08:50:00
admin
原创
62
摘要:问题描述:我和另一位开发人员对是否应该使用PYTHONPATH或sys.path来允许 Python 在用户(例如,开发)目录中找到 Python 包存在分歧。我们有一个具有典型目录结构的 Python 项目:Project setup.py package __init__....

问题描述:

我和另一位开发人员对是否应该使用PYTHONPATHsys.path来允许 Python 在用户(例如,开发)目录中找到 Python 包存在分歧。

我们有一个具有典型目录结构的 Python 项目:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

在 script.py 中,我们需要执行import package.lib。当包安装在 site-packages 中时,script.py 可以找到package.lib

但是,当从用户目录工作时,还需要做其他事情。我的解决方案是将 my 设置PYTHONPATH为 include "~/Project"。另一位开发人员想将这行代码放在 script.py 的开头:

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

这样 Python 就能找到 的本地副本package.lib

我认为这是一个坏主意,因为这条线只对开发人员或从本地副本运行的人有用,但我无法给出一个很好的理由来说明为什么这是一个坏主意。

我们应该使用PYTOHNPATHsys.path还是两者都可以?


解决方案 1:

如果修改路径的唯一原因是为了让开发人员从他们的工作树中工作,那么您应该使用安装工具为您设置环境。virtualenv 非常流行,如果您使用 setuptools,您只需运行即可setup.py develop在当前的 Python 安装中半安装工作树。

解决方案 2:

我讨厌 PYTHONPATH。我发现按用户设置(尤其是守护进程用户)并跟踪项目文件夹的移动非常麻烦。我更愿意sys.path在独立项目的调用脚本中设置。

但这sys.path.append不是解决问题的方法。您很容易得到重复项,而且它不会对.pth文件进行排序。更好的(更易读的)site.addsitedir:。

而且script.py通常这不是执行此操作的更合适位置,因为它位于您想要在路径上提供的包sys.path。库模块当然不应该接触自身。相反,您通常会在包外有一个 hashbanged 脚本,用于实例化和运行应用程序,并且在这个简单的包装器脚本中,您可以放置​​部署详细信息,例如sys.path-frobbing。

解决方案 3:

总体而言,我认为设置环境变量(如 PYTHONPATH)是一种不好的做法。虽然这对于一次性调试来说可能没问题,但将其作为

常规做法可能不是一个好主意。

使用环境变量会导致出现“它对我有用”的情况,因为其他人

报告代码库中存在问题。此外,人们可能对测试环境也采取同样的做法,导致测试对特定开发人员运行良好,但当其他人启动测试时可能会失败的情况。

解决方案 4:

除了前面提到的许多其他原因之外,你还可以指出硬编码

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

很脆弱,因为它假定了 script.py 的位置——只有当 script.py 位于 Project/package 中时,它才会起作用。如果用户决定将 script.py 移动/复制/符号链接到(几乎)其他任何地方,它就会中断。

解决方案 5:

由于前面提到的原因,无论是黑客攻击PYTHONPATH还是直接使用都不是一个好主意。而对于将当前项目链接到 site-packages 文件夹,实际上有一种比 更好的方法,如下所述:sys.path`python setup.py develop`

pip install --editable path/to/project

如果你的项目根文件夹中还没有 setup.py,那么这个就足以让你开始:

from setuptools import setup
setup('project')

解决方案 6:

我认为,在这种情况下使用 PYTHONPATH 是更好的选择,主要是因为它不会引入(可疑的)不必要的代码。

毕竟,如果你想到这一点,你的用户就不需要那个sys.path东西,因为你的包将被安装到站点包中,因为你将使用一个包装系统。

如果用户选择从您所说的“本地副本”运行,那么我观察到,通常的做法是说明,如果在站点包之外使用,则需要将包手动添加到 PYTHONPATH。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1887  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1425  
  在制造业数字化转型的进程中,PLM(产品生命周期管理)系统、ERP(企业资源计划)系统、MES(制造执行系统)以及 CAD(计算机辅助设计)软件都扮演着至关重要的角色。然而,这些系统和软件各自独立运行时,往往难以发挥出最大的协同效应。实现 PLM 系统与 ERP、MES、CAD 的有效集成,成为提升企业整体竞争力、优化...
plm系统的主要功能模块   3  
  产品生命周期管理(PLM)作为一种先进的管理理念和技术,在电子与半导体行业正发挥着日益重要的作用。随着电子与半导体行业的快速发展,产品更新换代速度加快,市场竞争愈发激烈,企业面临着诸多挑战,如缩短产品上市时间、提高产品质量、降低成本等。而PLM的应用为企业应对这些挑战提供了有效的解决方案,展现出巨大的应用价值。提升产品...
plm项目   4  
  PLM(产品生命周期管理)项目管理软件在现代企业的产品研发、生产与运营中扮演着至关重要的角色。它整合了从产品概念设计到退役的全流程数据与流程,助力企业提升效率、降低成本并增强创新能力。随着科技的飞速发展以及企业需求的不断演变,未来十年 PLM 项目管理软件的发展充满了无限可能,值得深入探讨与预测。智能化与自动化趋势智能...
plm产品全生命周期管理   6  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用