簡體   English   中英

強制 python 使用舊版本的模塊(比我現在安裝的版本)

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

我的雇主有一個專門的模塊1 ,我們用於內部單元/系統測試; 然而,這個模塊的作者不再在這里工作,我被要求用它測試一些設備。

問題是pyfoo需要一個古老版本的twisted (v8.2.0) 並且它在 33 個不同的文件中導入twisted 我嘗試在 v11.0.0 下運行pyfoo的單元測試,但我什至沒有看到 TCP SYN packets 2 不幸的是,我已經在我的實驗室 linux 服務器上安裝了twisted v11.0.0 ,並且我有自己的代碼依賴於它。

為了解決這個問題,我只提出了以下選項:

選項A。 安裝新版本的python,安裝virtualenv ,然后在virtualenv下安裝老版本的twisted 僅在 python 的這個新版本下運行需要pyfoo的測試。

選項B。 使用以下內容編輯所有 33 個文件: DIR = '../'; sys.path.insert(0, DIR) DIR = '../'; sys.path.insert(0, DIR)並將舊版本 python 安裝在源碼下的相應目錄中。

選項 C 嘗試修復pyfoo以使用 v11.0.0 3

我缺少任何選項嗎? 除了上面的選項 A 之外,還有更優雅的方法來解決這個問題嗎?


**尾注:**
  1. 為了爭論起見,我們稱它為pyfoo
  2. 單元測試連接到我們的本地實驗室服務器之一並練習基本的 te.net 功能
  3. 這個選項幾乎是一個非啟動器... pyfoo不是微不足道的,我的這項工作的截止日期很短。

選項 B 的更好版本是替換

import twisted

經過

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

這將安排導入正確版本的扭曲,只要它已安裝,否則引發異常。 這是一個更便攜的解決方案。

但是,如果在調用pkg_resources.require之前導入了 twisted ,則這將不起作用(選項 B 的任何其他變體也不會); twisted將已經在sys.modules

OP 編輯:根據pkg_resources文檔進行少量語法更正

如果 SingleNegationElimination 的解決方案不起作用,請注意您不需要替換導入的所有 33 個實例; 您只需要在入口點修改sys.path 例如,您可以僅針對模塊的__init__.py文件。

在那里你會插入例如

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

我無法告訴您在您的情況下什么是最好的,但您可以考慮:

選項 D:在虛擬機中運行(例如使用 Windows 7)

選項 E:在另一台機器上安裝舊版本的 python/twisted

我花了一些試驗和錯誤來解決我的情況。 其中涉及已接受的答案及其附加評論(提到添加 _需要_)

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

    

您應該在導入前卸載並安裝。

第一的,

!pip uninstall igraph -y
!pip uninstall python-igraph -y
!pip install python-igraph==0.9.6
!pip install cairocffi

然后,

import igraph
print(igraph.__version__)
% 0.9.6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM