2011-06-22 14 views
8

Mi empleador tiene un módulo dedicado lo usamos para la unidad interna/prueba del sistema; sin embargo, el autor de este módulo ya no funciona aquí y se me ha pedido que pruebe algunos dispositivos con él.Forzar el uso de python de una versión anterior del módulo (que lo que tengo instalado ahora)

El problema es que pyfoo requiere una versión antigua de twisted (v8.2.0) e importa twisted en 33 archivos diferentes. Intenté ejecutar las pruebas unitarias de pyfoo en v11.0.0 y ni siquiera veo paquetes TCP SYN . Desafortunadamente, ya tengo twisted v11.0.0 instalado en mi laboratorio servidor Linux y tengo mi propio código que depende de ello.

que han sido tensas cerebro en busca de una forma de evitar esto, pero sólo se puede llegar a las siguientes opciones:

Opción A. Instale una nueva versión de python, instale virtualenv, y luego instale una versión anterior de twisted bajo el virtualenv. Solo ejecute las pruebas que requieren pyfoo bajo esta nueva versión de python.

Opción B. Edite los 33 archivos con lo siguiente: DIR = '../'; sys.path.insert(0, DIR) e instale la versión anterior de python en el directorio apropiado debajo de la fuente.

Opción C. Intento de fijar pyfoo utilizar v11.0.0

¿Hay alguna opción me falta? ¿Hay una forma más elegante de resolver este problema, además de la Opción A, arriba?


notas finales:

  1. Digamos que es pyfoo para bien del argumento
  2. Las pruebas unitarias se conectan a uno de nuestros servidores de laboratorio locales y ejercicios funcionalidad telnet básica
  3. Esta opción es casi una incógnita ... pyfoo no es trivial, y tengo un plazo corto para este trabajo.
+0

En Linux? ¡Usa 'chroot'! : D – tMC

+0

@tMC, creo * Veo lo que dices, pero déjame ser explícito ... ¿Sugieres que instale la versión 0.8.2 de twisted en '/ chroot/python/site-packages' y luego 'chroot' a ese directorio antes de ejecutar las pruebas? –

+0

No sé si realmente funcionaría con su entorno, pero piense en chroot como una especie de virtualización. Para ejecutar python en un chroot, también tendrás que tener todas las libs de las que depende python, tal vez una montura de proc, etc. Realmente solo pensé en eso porque alguien sugirió una verdadera solución de VM. – tMC

Respuesta

20

Una versión mejorada de la opción B. sería sustituir

import twisted 

por

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

el cual se encargará de la versión correcta de trenzado que se importe, siempre y cuando se instala, y lanza una excepción de lo contrario. Esta es una solución más portátil.

Sin embargo, esto no funcionará (ni tampoco se aplicará ninguna otra variación de la opción B), si se pasa torcido antes de llamar al pkg_resources.require; twisted ya estará en sys.modules

OP Edición: corrección de sintaxis Menor, por

+1

¿Qué pasa si: 1) Tengo dos versiones de un paquete instalado, 2) el módulo no está presente en 'sys.modules' justo antes de la llamada a' require', pero recibo la excepción VersionConflict (es decir, solicito una versión, pero otra ya está presente y causa la excepción). – Eugen

+0

@Eugen: por favor, pregunte eso como una nueva pregunta, y también incluya los pasos para reproducir. – SingleNegationElimination

+0

Resolví mi problema usando la solución descrita aquí: [solución] (http://bugs.python.org/setuptools/issue139). Tuve que agregar \ _ \ _ require \ _ \ _ a mis módulos antes de importar todo lo demás .. – Eugen

1

No te puedo decir lo que es mejor en su situación, pero es posible que pueda tener en cuenta:

Opción D: (. Por ejemplo con Windows 7) ejecutarlo en una máquina virtual

opción E: instalar versión antigua de pitón/torcido en otra máquina

+0

Estos son posibles, pero el tiempo para instalar otra máquina virtual suele ser de alrededor de 30 minutos (al menos para mí) ... todo lo que tengo es VirtualBox ... –

0

Si la solución de SingleNegationElimination no funciona, tenga en cuenta que no es necesario reemplazar los 33 casos de la importación; solo necesita modificar sys.path en los puntos de entrada; p.ej. puede orientar solo los archivos __init__.py de su módulo.

Allí insertaría, p. Ej.

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