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

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

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

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

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

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

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

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


КОНЕЧНЫЕ ПРИМЕЧАНИЯ:

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

person This    schedule 22.06.2011    source источник
comment
@tMC, думаю, я понимаю, о чем вы говорите, но позвольте мне быть откровенным... Вы предлагаете мне установить версию 0.8.2 скручивания в /chroot/python/site-packages, а затем chroot в этот каталог перед выполнением? тесты?   -  person This    schedule 22.06.2011
comment
Я не знаю, будет ли это действительно работать с вашей средой, но думайте о chroot как о своего рода виртуализации. Чтобы запустить python в chroot, вам также понадобятся все библиотеки, от которых зависит python, возможно, монтирование proc и т. Д. Я действительно подумал об этом только потому, что кто-то предложил реальное решение для виртуальной машины.   -  person tMC    schedule 22.06.2011
comment
В идеальном мире правильным решением было бы постоянное обновление до новых искажённых версий (8.2, затем 9.0, 10.0 и последняя 11.0) и запуск тестов для обнаружения и исправления сбоев по мере их появления (и, таким образом, усреднение стоимость содержания). Вот почему была выполнена непрерывная интеграция (например, Jenkins).   -  person Cédric Julien    schedule 23.06.2011
comment
@Cedric: конечно, это было бы идеально, но, похоже, происходит то, что мошеннические приложения проникают в производство, далеко за пределы компетенции инженеров и менеджеров, которые несут ответственность за его поддержку для всех промежуточные годы. Кажется, что каждую неделю обнаруживается новое мошенническое приложение, которое не находится под управлением SCM, которое не отслеживается в системе продажи билетов, а первоначальный разработчик уже давно ушел.   -  person SingleNegationElimination    schedule 23.06.2011


Ответы (4)


Лучшим вариантом варианта Б. было бы заменить

import twisted

by

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

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

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

OP Edit: небольшая коррекция синтаксиса согласно pkg_resources docs

person SingleNegationElimination    schedule 22.06.2011
comment
Что делать, если: 1) у меня установлены две версии пакета, 2) модуль отсутствует в sys.modules непосредственно перед вызовом require, но я получаю исключение VersionConflict (т. е. я запрашиваю одну версию, но другая уже присутствует и вызывает исключение)? - person Eugen; 13.11.2013
comment
@Eugen: пожалуйста, задайте это как новый вопрос, а также включите шаги для воспроизведения. - person SingleNegationElimination; 13.11.2013
comment
Я решил свою проблему, используя обходной путь, описанный здесь: обходной путь. Пришлось добавить __require__ в мои модули, прежде чем импортировать все остальное. - person Eugen; 13.11.2013
comment
Я думаю, что у меня похожая проблема. pkg_resources.require() немного неправильное название, если оно не может сделать это правильно... $ python Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import pkg_resources >>> pkg_resources.require('numpy>=1.9.0') [numpy 1.9.1 (/usr0/local/lib/python2.7/dist-packages)] >>> import numpy; print numpy.__version__ 1.8.2 - person eqzx; 16.12.2014
comment
@eqzx: задайте новый вопрос для получения помощи. - person SingleNegationElimination; 16.12.2014
comment
@SingleNegationElimination - я согласен с eqzx, вы не отвечаете на вопрос; то, что вы предлагаете, похоже, вообще не обеспечивает импорт правильной версии, а просто перечисляет ее, а затем импортирует более старую версию... - person jmetz; 12.10.2016

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

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

import sys
sys.path.insert(0, DIR)
person jmetz    schedule 12.10.2016

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

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

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

person Gerrat    schedule 22.06.2011
comment
Это возможно, но время для установки другой виртуальной машины обычно составляет около 30 минут (по крайней мере, для меня)... все, что у меня есть, это VirtualBox... - person This; 22.06.2011

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

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

    
person deprekate    schedule 18.08.2020