【发布时间】: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-a、project-b 等。
我们当前的解决方案只是在顶层有一个 environment.bash,您可以在 shell 中获取它并设置PYTHONPATH。这行得通,但我经常忘记这样做;因为这是一个客户端服务器应用程序,在服务器之间进行通信,我需要至少有四个窗口向不同的虚拟机打开才能运行它,而且我经常忘记在其中至少一个中获取 environment.bash,导致我尝试调试奇怪的行为,直到我意识到我导入了错误的东西。
另一种解决方案是在顶级 client.py 或 server.py 中设置 sys.path。这可以很好地直接启动它们,但我还需要为运行 Pylint 或 Sphinx 等工具设置路径,该解决方案不会涵盖这些工具。我还需要一种方法来区分从源代码运行(当我希望路径包含 . 和 ../project-b)和运行已安装版本(应该使用标准路径而无需修改)。
另一种选择是使用 Makefile 为各种目标(如 make run-server、make lint、make doc 等)适当地设置 PYTHONPATH。这对于那些不需要任何选项的目标来说是可以的,但是对于运行需要参数的客户端来说会很不方便。 make run-client ARGS='foo bar' 是一种相当麻烦的调用方式。
在开发过程中是否有任何通用的方法来设置 Python 路径,以便我的可执行文件和 Pylint 和 Sphinx 等工具可以适当地选择它,而不会干扰它在安装时的行为?
【问题讨论】:
标签: python module path development-environment