gpt4 book ai didi

python - 在开发过程中设置 Python 路径

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:29 25 4
gpt4 key购买 nike

我用 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。那行得通,但我经常忘记这样做;因为这是一个客户端服务器应用程序,在服务器之间进行通信,我需要至少有四个窗口打开不同的 VM 来运行它,而且经常发生我忘记至少在其中一个中获取 environment.bash 的源代码,导致我尝试调试奇怪的行为,直到我意识到我导入了错误的东西。

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

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

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

最佳答案

一个简单的解决方案是简单地将每个模块的目录符号链接(symbolic link)到一个单独的文件夹中,然后从那里运行。这样 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/

关于python - 在开发过程中设置 Python 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21071809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com