Заставить python использовать более старую версию модуля (чем то, что я установил сейчас)

у моего работодателя есть специальный модуль1 мы используем для внутреннего отдела тестирования / системы; однако автор этого модуля больше не работает здесь, и меня попросили протестировать некоторые устройства с ней.

проблема в том, что pyfoo требуется древняя версия twisted (v8.2.0) и импортирует twisted в 33 разных файлов. Я пытался бежать pyfooмодульные тесты под v11.0.0 и я даже не вижу TCP SYN пакеты2. К сожалению, у меня уже получил витая В11.0.0 установлен на моем лабораторном сервере linux, и у меня есть свой собственный код, который зависит от него.

я ломал свой мозг, чтобы обойти это, но я могу придумать только следующие варианты:

Вариант A. Установите новую версию python, install virtualenv, а затем установить старую версию twisted под virtualenv. Только запустите тесты, требующие pyfoo под этой новой версией питон.

Вариант B. Отредактируйте все 33 файла следующим образом:DIR = '../'; sys.path.insert(0, DIR) и установите старую версию python в соответствующий каталог под исходным кодом.

Вариант C. Попытка исправить pyfoo использовать v11.0.03

есть ли какие варианты я пропустил? Есть ли более элегантный способ решить эту проблему, кроме варианта, наверху?


КОНЕЦ-ПРИМЕЧАНИЯ:
    давайте его pyfoo для аргументации
  1. модульные тесты подключаются к одному из наших локальных лабораторных серверов и выполняют основные функции telnet
  2. эта опция почти не стартер... pyfoo не тривиально, и у меня есть короткий срок для такой работы.

3 ответов


лучшей версией варианта B. было бы заменить

import twisted

by

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

который организует правильную версию twisted для импорта, пока она установлена, и вызывает исключение в противном случае. Это более портативное решение.

это не сработает, хотя (как и любой другой вариант варианта B), если twisted импортируется до pkg_resources.require вызывается; twisted уже в sys.modules

OP Edit: незначительная синтаксическая коррекция, per pkg_resources docs


Я не могу сказать вам, что является лучшим в вашей ситуации, но вы могли бы рассмотреть:

вариант D: запустите его на виртуальной машине (например. с Windows 7)

вариант E: установите старую версию python / twisted на другую машину


Если решение SingleNegationElimination не работает, имейте в виду, что вам не нужно заменять все 33 экземпляра импорта; вам нужно только изменить sys.path в точках входа; например, вы можете нацелиться только на ваш модуль __init__.py файлы.

там будет вставить, например,

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