我的雇主有一个专用模块 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:
pyfoo
pyfoo
并非无足轻重,而且这项工作的截止日期很短。答案 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