简体   繁体   中英

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

My employer has a dedicated module 1 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 packets 2 . 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) 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.0 3

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 te.net functionality
  3. This option is almost a non-starter... pyfoo is not trivial, and I have a short deadline for this work.

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

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; eg you could target just your module's __init__.py files.

There you would insert eg

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

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

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  

    

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM