【问题标题】:How to manage Python's sys.path for a project in a system independent way如何以独立于系统的方式管理项目的 Python sys.path
【发布时间】:2020-10-10 21:08:46
【问题描述】:

我有一个像这样的项目目录

/work
    /venv
    /project1
        app.py
        /package1
        /package2
        etc

脚本 app.py 运行我正在处理的项目的位置。当我跑步时 python -m site 来自/project1 目录,正如预期的那样

sys.path = [
    '/work/project1',

加上相关的/lib/pythonX.Y 路径。但是,当运行 app.py(从 project1 中)时,此导入

from package1 import ...

以 ModuleNotFoundError 失败,而 from .package1 import ... 工作正常,因为它告诉 python 搜索 app.py 所在的目录。所以,我将它添加到 app.py 的开头

import sys
print(sys.path)

结果是

sys.path = [
    '/work',

导入到 app.py 时搜索的目录不是/work/project1,而是/workpython -m siteprint(sys.path) 之间存在这种差异的原因是什么?确保 /work/project1 始终是 sys.path 的一部分的最佳方法是什么?

我想避免使用 site.addsitedir() 之类的东西,也许改用 .pth 文件。从我读过的内容来看,虽然 .pth 文件属于 /lib/pythonX.Y/sitepackages,但我还需要此解决方案独立于系统,以便从 github 克隆 /project1 的协作者不必添加自己的 .pth 文件。

【问题讨论】:

    标签: python sys python-venv sys.path


    【解决方案1】:

    我不知道它是否适用于您,但我通过指出我们商店的业务来帮助了很多其他人。我们根本不担心执行时的路径。我们所依赖的只是从初始脚本位置,我们知道所有依赖项在哪里。然后我们通过计算它们相对于包含初始脚本的目录的位置来将目录添加到 sys.path,该目录始终可用。

    我们将此逻辑放在一个名为init.py 的文件中,该文件与主脚本位于同一目录中。如下所示:

    repoPath = os.path.dirname(__file__) + "/../../Development/repo1"
    sys.path.append(repoPath + "/common/common-pyutil")
    sys.path.append(repoPath + "/common/common-pyutil/thirdparty")
    

    然后在主脚本中执行import init。我们的目录中有很多脚本,它们都只是做import init 来修复它们的 sys.path 以查找我们所有的实用程序模块等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-21
      • 2011-01-09
      • 1970-01-01
      • 2012-08-16
      • 2012-06-13
      • 1970-01-01
      • 2012-02-16
      • 2019-05-30
      相关资源
      最近更新 更多