'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.
To solve this problem, I have 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:**
- Let's call it
pyfoo
for sake of argument - The unit tests connect to one of our local lab servers and exercises basic telnet functionality
- This option is almost a non-starter...
pyfoo
is not trivial, and I have a short deadline for this work.
Solution 1:[1]
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
Solution 2:[2]
If SingleNegationElimination's solution doesn't work, be aware that you don't need to replace all 33 instances of the import; you only need to modify sys.path
at the entry points; e.g. you could target just your module's __init__.py
files.
There you would insert e.g.
import sys
sys.path.insert(0, DIR)
Solution 3:[3]
I can't tell you what is best in your situation, but you might be able to consider:
Option D: run it in a virtual machine (eg. with Windows 7)
Option E: install old version of python/twisted on another machine
Solution 4:[4]
It took me a bit of trial and error to fix my situation; which involved the accepted answer and it's additional comments (mentioning adding _requires_)
__requires__= 'twisted==8.2.0'
import pkg_resources
pkg_resources.require("twisted==8.2.0")
import twisted
Solution 5:[5]
You should do uninstall and install before import.
First,
!pip uninstall igraph -y
!pip uninstall python-igraph -y
!pip install python-igraph==0.9.6
!pip install cairocffi
Then,
import igraph
print(igraph.__version__)
% 0.9.6
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | SebMa |
Solution 2 | jmetz |
Solution 3 | Gerrat |
Solution 4 | deprekate |
Solution 5 | Lorry |