Mike Pennington Mike Pennington - 1 month ago 7
Linux Question

Force python to use an older version of module (than what I have installed now)

My employer has a dedicated module1 we use for internal unit / system test; however, the author of this module no longer works here and I have been asked to test some devices with it.

The problem is that

pyfoo
requires an ancient version of
twisted
(v8.2.0) and it imports
twisted
in 33 different files. I tried running
pyfoo
's unit tests under v11.0.0 and I don't even see TCP SYN packets2. Unfortunately, I have already got twisted v11.0.0 installed on my lab linux server and I have my own code that depends on it.

I have been wracking my brain for a way around this, but I can only come up with the following options:

Option A. Install a new version of python, install
virtualenv
, and then install an old version of
twisted
under the
virtualenv
. Only run the tests requiring
pyfoo
under this new version of python.

Option B. Edit all 33 of the files with the following:
DIR = '../'; sys.path.insert(0, DIR)
and install the old version of python in the appropriate directory below the source.

Option C. Attempt to fix
pyfoo
to use v11.0.03

Are there any options I am missing? Is there a more elegant way to solve this problem, besides Option A, above?



END-NOTES:


  1. Let's call it
    pyfoo
    for sake of argument

  2. The unit tests connect to one of our local lab servers and exercises basic telnet functionality

  3. This option is almost a non-starter...
    pyfoo
    is not trivial, and I have a short deadline for this work.


Answer

A better version of option B. would be to replace

import twisted

by

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

which will arrange for the correct version of twisted to be imported, so long as it's installed, and raises an exception otherwise. This is a more portable solution.

This won't work, though (nor would any other variaton of option B), if twisted gets imported before the pkg_resources.require gets called; twisted will already be in sys.modules

OP Edit: Minor syntax correction, per pkg_resources docs