问题描述
我的雇主有一个专用模块,用于内部单元/系统测试;但是,该模块的作者不再在这里工作,并且要求我使用它来测试一些设备.
My employer has a dedicated module we use for internal unit / system test; however, the author of this module no longer works here and I have been asked to test some devices with it.
问题在于pyfoo
需要twisted
的较旧版本(v8.2.0),并且它会在33个不同的文件中导入twisted
.我尝试在v11.0.0下运行pyfoo
的单元测试,但我什至看不到TCP SYN数据包.不幸的是,我已经在实验室linux服务器上安装了 twisted v11.0.0 ,并且我有自己的代码,具体取决于在上面.
The problem is that pyfoo
requires an ancient version of twisted
(v8.2.0) and it imports twisted
in 33 different files. I tried running pyfoo
's unit tests under v11.0.0 and I don't even see TCP SYN packets. Unfortunately, I have already got twisted v11.0.0 installed on my lab linux server and I have my own code that depends on it.
我一直在想办法解决这个问题,但是我只能提出以下选择:
I have been wracking my brain for a way around this, but I can only come up with the following options:
选项A .安装新版本的python,安装virtualenv
,然后在virtualenv
下安装旧版本的twisted
.仅在此新版本的python下运行需要pyfoo
的测试.
Option A. Install a new version of python, install virtualenv
, and then install an old version of twisted
under the virtualenv
. Only run the tests requiring pyfoo
under this new version of python.
选项B .使用以下命令编辑所有33个文件:DIR = '../'; sys.path.insert(0, DIR)
并将旧版本的python安装在源代码下面的相应目录中.
Option B. Edit all 33 of the files with the following: DIR = '../'; sys.path.insert(0, DIR)
and install the old version of python in the appropriate directory below the source.
选项C .尝试修复pyfoo
以使用v11.0.0
Option C. Attempt to fix pyfoo
to use v11.0.0
我有没有其他选择?除了上面的选项A,还有没有更优雅的方法来解决此问题?
Are there any options I am missing? Is there a more elegant way to solve this problem, besides Option A, above?
END-NOTES:
- 为了争辩而将其称为
pyfoo
- 单元测试连接到我们的本地实验室服务器之一,并练习基本的telnet功能
- 这个选项几乎是入门级的...
pyfoo
并非微不足道,而且我的工作期限很短.
- Let's call it
pyfoo
for sake of argument - The unit tests connect to one of our local lab servers and exercises basic telnet functionality
- This option is almost a non-starter...
pyfoo
is not trivial, and I have a short deadline for this work.
推荐答案
选项B的一个更好的版本是替换
A better version of option B. would be to replace
import twisted
作者
import pkg_resources
pkg_resources.require("Twisted==8.2.0")
import twisted
,只要已安装,它将安排正确版本的twist导入,否则会引发异常.这是一种更可移植的解决方案.
which will arrange for the correct version of twisted to be imported, so long as it's installed, and raises an exception otherwise. This is a more portable solution.
但是,如果在pkg_resources.require
调用之前引入了twisted,这将不起作用(选项B的任何其他变量也不会). twisted
将已经在sys.modules
This won't work, though (nor would any other variaton of option B), if twisted gets imported before the pkg_resources.require
gets called; twisted
will already be in sys.modules
OP Edit :根据 pkg_resources
文档
OP Edit: Minor syntax correction, per pkg_resources
docs
这篇关于强制python使用较旧版本的模块(比我现在安装的版本)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!