【问题标题】:Setting up Python path during development在开发过程中设置 Python 路径
【发布时间】:2014-01-31 01:10:34
【问题描述】:

我在 Python 中处理几个不同的程序和包。它们各自在自己的 Git 存储库中开发,但经常需要导入其他包中定义的模块。例如,在开发过程中,目录结构类似于:

src/
|-- project-a/
|   |-- client.py
|   |-- server.py
|   |-- package-a
|       |-- __init__.py
|       |-- module.py
|-- project-b/
|   |-- package-b
|   |   |-- __init__.py
|   |   |-- other_module.py
|   |-- package-c
|       |-- __init__.py
|       |-- third_module.py
|-- project-c/
    |-- server1.py
    |-- server2.py
    |-- package-d/
    |-- package-e/
    |-- package-f/

当它们都安装好后,它们工作正常;它们都已安装,因此每个包都在您的 Python 路径中,您可以根据需要从它们导入。

但是,在开发过程中,我希望其中每个的开发版本都在我的 Python 路径中,而不是安装的版本。进行更改时,我不想安装要更改的每个包来测试它,我希望更改立即生效。这意味着我的 Python 路径需要包含目录project-aproject-b 等。

我们当前的解决方案只是在顶层有一个 environment.bash,您可以在 shell 中获取它并设置PYTHONPATH。这行得通,但我经常忘记这样做;因为这是一个客户端服务器应用程序,在服务器之间进行通信,我需要至少有四个窗口向不同的虚拟机打开才能运行它,而且我经常忘记在其中至少一个中获取 environment.bash,导致我尝试调试奇怪的行为,直到我意识到我导入了错误的东西。

另一种解决方案是在顶级 client.py 或 server.py 中设置 sys.path。这可以很好地直接启动它们,但我还需要为运行 Pylint 或 Sphinx 等工具设置路径,该解决方案不会涵盖这些工具。我还需要一种方法来区分从源代码运行(当我希望路径包含 .../project-b)和运行已安装版本(应该使用标准路径而无需修改)。

另一种选择是使用 Makefile 为各种目标(如 make run-servermake lintmake doc 等)适当地设置 PYTHONPATH。这对于那些不需要任何选项的目标来说是可以的,但是对于运行需要参数的客户端来说会很不方便。 make run-client ARGS='foo bar' 是一种相当麻烦的调用方式。

在开发过程中是否有任何通用的方法来设置 Python 路径,以便我的可执行文件和 Pylint 和 Sphinx 等工具可以适当地选择它,而不会干扰它在安装时的行为?

【问题讨论】:

    标签: python module path development-environment


    【解决方案1】:

    一个简单的解决方案是简单地在单独文件夹中的每个模块的目录中进行符号链接,然后从那里运行。这样一来,Python 就会看到它们都在同一个位置,即使实际的源代码位于不同的存储库中。

    src/
    |-- project-a/
    |   |-- client.py
    |   |-- server.py
    |   |-- package-a
    |       |-- __init__.py
    |       |-- module.py
    |-- project-b/
        |-- package-b
        |   |-- __init__.py
        |   |-- other_module.py
        |-- package-c
            |-- __init__.py
            |-- third_module.py
    run/
    |-- client.py --> ../src/project-a/client.py
    |-- server.py --> ../src/project-a/server.py
    |-- package-a/ --> ../src/project-a/package-a/
    |-- package-b/ --> ../src/project-b/package-b/
    |-- package-c/ --> ../src/project-b/package-c/
    

    【讨论】:

    • 有趣的想法。这是一个潜在的解决方案,尽管这意味着我的工作目录需要是run,而不是project-a,这是我实际正在处理的(其中包含我的Git repo,Makefile,等等)。
    • 是的,但是如果您“打开了 4 个窗口”,那么当您的编辑器窗口位于源目录中时,其他窗口没有理由不能位于 run/ 目录中。
    • 是的。这绝对是一个值得考虑的解决方案,但它感觉有点像 Makefile 解决方案,它是给其他开发人员(和持续集成系统等)的额外设置步骤,以及他们需要的东西在使用依赖于新包的新版本时维护和更新。您可以编写一个脚本来设置“运行”目录,但您需要记住运行它,并在包列表更改时重新运行它。最好是在您检查代码后自动找到正确的路径。
    • 如果您想为其他开发人员提供一些有凝聚力的东西,那么也许多个存储库不是要走的路吗?或者,您可以有一个父存储库,其中包含所有其他作为子模块,并且还包括 run/ 文件夹。
    • 多个存储库在这一点上已经深深嵌入我们的工作流程中,并且是正确的,因为它们是独立的项目。我以前使用过子模块,发现它们通常比它们的价值更痛苦。
    猜你喜欢
    • 2014-06-01
    • 2023-04-11
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多