Заставить python использовать более старую версию модуля (чем то, что я установил сейчас) - PullRequest
17 голосов
/ 22 июня 2011

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

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

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

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

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

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

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


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

Ответы [ 3 ]

31 голосов
/ 22 июня 2011

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

import twisted

от

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

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

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

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

1 голос
/ 12 октября 2016

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

Там вы должны вставить, например,

import sys
sys.path.insert(0, DIR)
1 голос
/ 22 июня 2011

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

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

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

...