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

新手上路,请多包涵

我的雇主有一个专用模块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,还有更优雅的方法来解决这个问题吗?


**尾注:**

  1. 让我们称之为 pyfoo 为了争论
  2. 单元测试连接到我们的本地实验室服务器之一并练习基本的 telnet 功能
  3. 这个选项几乎是不可能的…… pyfoo 不是微不足道的,而且我的工作期限很短。

原文由 Mike Pennington 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 406
2 个回答

选项 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 文档 进行轻微语法更正

原文由 SingleNegationElimination 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

在那里你会插入例如

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

原文由 jmetz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题