强制python使用旧版本的模块(比我现在安装的版本)

Mik*_*ton 18 python linux twisted python-import

我的雇主有一个专用模块1,我们用于内部单元/系统测试; 但是,这个模块的作者不再在这里工作,我被要求用它测试一些设备.

问题是pyfoo需要古老版本的twisted(v8.2.0)并且它导入twisted了33个不同的文件.我尝试pyfoo在v11.0.0下运行单元测试,我甚至没有看到TCP SYN数据包2.不幸的是,我已经在我的实验室linux服务器上安装了扭曲的v11.0.0,并且我有自己的代码依赖于它.

为了解决这个问题,我一直在绞尽脑汁,但我只能提出以下选择:

选项A.安装新版本的python,安装virtualenv,然后安装旧版本twistedvirtualenv.只运行pyfoo在这个新版本的python下需要的测试.

选项B.使用以下内容编辑所有33个文件:DIR = '../'; sys.path.insert(0, DIR)并在源代码下面的相应目录中安装旧版本的python.

选项C.尝试修复pyfoo使用v11.0.0 3

我有什么选择吗?除了上面的选项A之外,还有更优雅的方法来解决这个问题吗?


END-NOTES:

  1. 我们pyfoo为了争论而称之为
  2. 单元测试连接到我们的一个本地实验室服务器并执行基本的telnet功能
  3. 这个选项几乎不是首发...... pyfoo这不是一件轻而易举的事,而且这项工作的截止日期很短.

Sin*_*ion 32

选项B的更好版本将是替换

import twisted
Run Code Online (Sandbox Code Playgroud)

通过

import pkg_resources
pkg_resources.require("Twisted==8.2.0")
import twisted
Run Code Online (Sandbox Code Playgroud)

这将安排正确版本的扭曲导入,只要它已安装,否则引发异常.这是一种更便携的解决方案.

但是,如果pkg_resources.require在调用gets之前导入twisted,则这将不起作用(选项B的任何其他变量也不会); twisted已经在sys.modules

OP编辑:每个文档的次要语法更正pkg_resources

  • 如果:1)我安装了一个软件包的两个版本,2)在调用“require”之前,该模块不存在于“sys.modules”中,但我收到版本冲突异常(即我请求一个版本但另一个版本)一个已经存在并导致异常)? (2认同)
  • 我使用此处描述的解决方法解决了我的问题:[workaround](http://bugs.python.org/setuptools/issue139)。在导入其他所有内容之前,必须将 \_\_require\_\_ 添加到我的模块中。 (2认同)
  • 我想我有类似的问题。`pkg_resources.require()` 如果它不能正确地做到这一点的话有点用词不当...... `$ python Python 2.7.6(默认,2014 年 3 月 22 日,22:59:56)[GCC 4.8.2]在 linux2 上键入“help”、“copyright”、“credits”或“license”以获取更多信息。>>> 导入 pkg_resources >>> pkg_resources.require('numpy>=1.9.0') [numpy 1.9.1 (/usr0/local/lib/python2.7/dist-packages)] >>> 导入 numpy; 打印 numpy.__version__ 1.8.2` (2认同)

jme*_*etz 5

如果 SingleNegationElimination 的解决方案不起作用,请注意您不需要替换导入的所有 33 个实例;只需要sys.path在入口点进行修改即可;例如,您可以仅针对模块的__init__.py文件。

在那里你可以插入例如

import sys
sys.path.insert(0, DIR)
Run Code Online (Sandbox Code Playgroud)