修改 sys.path 是处理项目特定模块的最佳方式

Is modifying sys.path the best way to handle a project specific module

我正在(重新)编写 python 支持大型多语言项目的测试工具的一部分,这些工具与项目本身一起存储。在某些时候,很明显可以将某些代码重构到自己的包中。但是应该将其存储在哪里以便在 python 工具之间共享?

在python路径下,有一个公司范围的python-lib目录,但它与数千人共享真正只对几十人重要的东西,更重要的是,不是项目具体。

对于 c 测试工具,我们使用 LD_LIBRARY_PATH 指向我们的测试库,或者指向我们自己构建的库,或者指向一些自动构建输出。我可以修改 sys.path 以包含我想要的任何目录,并且表现得有点像 LD_LIBRARY_PATH,只是对我的队友来说更容易。

这看起来不像 pythonic。我知道 virtualenv,虽然不是很了解,但我有这些担忧:

如果这仅仅是为了测试目的,更新您的 PYTHONPATH 而 运行ning 测试代码将大致相当于 Python 等同于更新 LD_LIBRARY_PATH 以测试 C 代码.以几乎相同的方式 LD_LIBRARY_PATH 将一些目录推到共享对象查找路径的前面,PYTHONPATH pushes specific directories to the front of sys.path,并且从 Python 开始 运行ning 的那一刻开始(所以你知道在您有时间更新主模块中的 sys.path 之前,不会发生任何奇怪的 site 触发导入。

将它用于生产是不受欢迎的(除其他外,Python 2 和 3 都读取相同的环境变量,因此如果该位置的任何代码与两个版本),但对于测试代码,这并不比调整 LD_LIBRARY_PATH.

更不合理

虚拟环境可能有效,但前提是你能以某种方式在公司范围内发布 virtualenv;他们存储本地库的完整副本,并且(默认情况下)阻止访问其他站点范围内安装的包(以提供干净的环境)。以测试为中心的 virtualenv 可能希望通过允许访问系统模块的开关,因此它可以作为系统的补充,而不是替代。

bash-like shells 中激活 virtualenvs 只是 运行ning source /path/to/virtualenv/bin/activate 的问题,而停用它们只是 运行ning deactivate(当 activate 脚本被 sourceed 时,它作为函数添加到您的 shell 中)。它们通常比修改 PYTHONPATH 更安全(除其他外,它们为 Python 的每个 major.minor 版本使用特定于版本的子目录,所以你不会不小心 运行 2.7 上的 3.6 特定代码),但您确实需要将测试代码编写为真正的包(包含 setup.py 文件和所有文件)以正确管理它们。我个人认为这是值得的(你最终需要学习 Python 打包机制),但它 更高的初始技能栏。