修改 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,虽然不是很了解,但我有这些担忧:
- 这是否存储库的多个副本,或者它是 simlinked? Python 库大小可以忽略不计,但 IT 部门仍然不赞成我们的存储库非常大。
- 相关的,这些库是否保持同步以便每个工具都能修复错误?
- 队友不想运行额外命令,
./gen_test_stimulus
最好,env LD_LIBRARY_PATH=../testlib
也可以。多个命令会面临一些阻力。将 virtualenv 命令包装在 bash 脚本中是解决这个问题的方法吗?
如果这仅仅是为了测试目的,更新您的 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
脚本被 source
ed 时,它作为函数添加到您的 shell 中)。它们通常比修改 PYTHONPATH
更安全(除其他外,它们为 Python 的每个 major.minor 版本使用特定于版本的子目录,所以你不会不小心 运行 2.7 上的 3.6 特定代码),但您确实需要将测试代码编写为真正的包(包含 setup.py
文件和所有文件)以正确管理它们。我个人认为这是值得的(你最终需要学习 Python 打包机制),但它 是 更高的初始技能栏。
我正在(重新)编写 python 支持大型多语言项目的测试工具的一部分,这些工具与项目本身一起存储。在某些时候,很明显可以将某些代码重构到自己的包中。但是应该将其存储在哪里以便在 python 工具之间共享?
在python路径下,有一个公司范围的python-lib目录,但它与数千人共享真正只对几十人重要的东西,更重要的是,不是项目具体。
对于 c 测试工具,我们使用 LD_LIBRARY_PATH
指向我们的测试库,或者指向我们自己构建的库,或者指向一些自动构建输出。我可以修改 sys.path
以包含我想要的任何目录,并且表现得有点像 LD_LIBRARY_PATH
,只是对我的队友来说更容易。
这看起来不像 pythonic。我知道 virtualenv,虽然不是很了解,但我有这些担忧:
- 这是否存储库的多个副本,或者它是 simlinked? Python 库大小可以忽略不计,但 IT 部门仍然不赞成我们的存储库非常大。
- 相关的,这些库是否保持同步以便每个工具都能修复错误?
- 队友不想运行额外命令,
./gen_test_stimulus
最好,env LD_LIBRARY_PATH=../testlib
也可以。多个命令会面临一些阻力。将 virtualenv 命令包装在 bash 脚本中是解决这个问题的方法吗?
如果这仅仅是为了测试目的,更新您的 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
脚本被 source
ed 时,它作为函数添加到您的 shell 中)。它们通常比修改 PYTHONPATH
更安全(除其他外,它们为 Python 的每个 major.minor 版本使用特定于版本的子目录,所以你不会不小心 运行 2.7 上的 3.6 特定代码),但您确实需要将测试代码编写为真正的包(包含 setup.py
文件和所有文件)以正确管理它们。我个人认为这是值得的(你最终需要学习 Python 打包机制),但它 是 更高的初始技能栏。