我使用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
。这工作正常,但我经常忘记这样做;由于这是一个客户端服务器应用程序,在服务器之间进行通信,我需要至少有四个窗口打开到不同的VM才能运行它,而且我经常忘记至少在其中一个中使用environment.bash,我尝试调试奇怪的行为,直到我意识到我输入了错误的东西。
另一种解决方案是在顶级client.py或server.py中设置sys.path
。这可以直接启动它们,但我还需要为Pylint或Sphinx等运行工具设置路径,该解决方案无法覆盖。我还需要一种方法来区分从源运行(当我想要包含.
和../project-b
的路径时)和运行已安装的版本(应该使用标准路径而不进行修改)。 / p>
另一种选择是拥有一个Makefile,它可以为PYTHONPATH
,make run-server
,make lint
等各种目标适当设置make doc
。对于那些不需要任何选项的目标来说,这是可以的,但是对于运行带有参数的客户端来说会很不方便。 make run-client ARGS='foo bar'
是一种相当麻烦的调用方式。
在开发过程中是否有任何常用的设置Python路径的方法,以便我的可执行文件和Pylint和Sphinx等工具都可以正确地选择它,而不会干扰它在安装时的行为方式?
答案 0 :(得分:2)
一个简单的解决方案是在单独的文件夹中为每个模块的目录中简单地进行符号链接,然后从那里运行。这样,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/