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

时间:2011-06-22 19:07:06

标签: python linux twisted python-import

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

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

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

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

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

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

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

<小时/> 的 END-NOTES:

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

4 个答案:

答案 0 :(得分:29)

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

import twisted

通过

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

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

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

OP编辑:根据pkg_resources docs

进行次要语法修正

答案 1 :(得分:1)

我不能告诉你在你的情况下什么是最好的,但你可能会考虑:

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

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

答案 2 :(得分:1)

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

你会插入例如

  String binarySearch(int x, int[] A, int n)
   {
        if(n==0)
           return ("Not present");
        else
           {
             int mid = n/2;
             if(x==A[mid])
                 return ("Present");
              else if (x<A[mid])
                  return  binarySearch(x, Arrays.copyOfRange(A,0,mid),mid);
               else
                  return binarySearch(x, Arrays.copyOfRange(A,mid,n),n-mid);


       }
       }

答案 3 :(得分:0)

我花了点反复试验才能解决自己的问题;其中包含已接受的答案以及其他注释(提及添加_ 要求 _)

__requires__= 'twisted==8.2.0'
import pkg_resources
pkg_resources.require("twisted==8.2.0")
import twisted