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

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

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

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

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

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

Вариант С. Попытка исправить pyfoo использовать v11.0.0 3

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


END-ПРИМЕЧАНИЯ:

  1. Давайте назовем это pyfoo ради аргумента
  2. Модульные тесты подключаются к одному из наших локальных лабораторных серверов и выполняют основные функции telnet
  3. Этот вариант почти не для начинающих... pyfoo не тривиально, и у меня есть короткий срок для этой работы.

5 ответов

Решение

Лучшей версией варианта В. будет замена

import twisted

от

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

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

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

OP Edit: небольшая коррекция синтаксиса, согласно pkg_resources документы

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

Там вы вставите, например,

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

Мне потребовалось немного проб и ошибок, чтобы исправить мою ситуацию; который включал принятый ответ и дополнительные комментарии (упоминание о добавлении _требует_)

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

    

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

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

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

Вы должны удалить и установить перед импортом.

Первый,

      !pip uninstall igraph -y
!pip uninstall python-igraph -y
!pip install python-igraph==0.9.6
!pip install cairocffi

Затем,

      import igraph
print(igraph.__version__)
% 0.9.6
Другие вопросы по тегам