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

我的雇主有一个专用模块1用于内部单元/系统testing; 然而,这个模块的作者不再在这里工作,我被要求用它来testing一些设备。

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

我一直在为解决这个问题而绞尽脑汁,但我只能想出以下select:

选项A 安装新版本的python,安装virtualenv ,然后在virtualenv下安装旧版本的twisted 。 在这个新版本的python下只运行需要pyfoo的testing。

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

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

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


END-NOTES:

  1. 为了争论起见,我们称之为pyfoo
  2. unit testing连接到我们的本地实验室服务器之一,并执行基本的远程loginfunction
  3. 这个选项几乎是pyfoopyfoo不是微不足道的,我有这个工作的一个简短的截止date。

Solutions Collecting From Web of "强制python使用旧版本的模块(比我现在安装的)"

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

 import twisted 

通过

 import pkg_resources pkg_resources.require("Twisted==8.2.0") import twisted 

这将安排正确版本的扭曲进口,只要安装,并引发异常,否则。 这是一个更便携的解决方案。

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

操作编辑 :小的语法更正,每个pkg_resources文档

我不能告诉你什么是最适合你的情况,但你可以考虑:

选项D:在虚拟机中运行(例如使用Windows 7)

选项E:在另一台机器上安装老版本的python / twisted

如果SingleNegationElimination的解决方案不起作用,请注意,您不需要替换全部33个导入实例; 你只需要在入口点修改sys.path ; 例如你可以只定位你的模块的__init__.py文件。

在那里你会插入例如

 import sys sys.path.insert(0, DIR)