2011-06-22 256 views
8

我的僱主有一個專用模塊我們用於內部單元/系統測試;然而,這個模塊的作者不再在這裏工作,我被要求用它來測試一些設備。強制python使用舊版本的模塊(比我現在安裝的版本)

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

我一直令人頭大我的大腦解決的辦法,但我只能想出以下選項:

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

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

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

有沒有我失蹤的選項?除了上面的選項A之外,還有更好的方法來解決這個問題嗎?


END-NOTES:

  1. 我們稱之爲pyfoo爲便於討論
  2. 單元測試連接到我們的本地實驗室的一臺服務器,並行使基本的telnet功能
  3. 此選項幾乎是一個非首發... pyfoo是不平凡的,我有這個工作的一個簡短的截止日期。
+0

在Linux上?使用'chroot'! :D – tMC

+0

@tMC,我*想*我明白你在說什麼,但讓我明白......你是否建議我在'/ chroot/python/site-packages'中安裝扭曲的0.8.2版本,並且然後在執行測試之前將'chroot'指向該目錄? –

+0

我不知道它是否真的能與你的env一起工作,但將chroot想象成一種虛擬化。要在chroot中運行python,您還必須擁有所有的python依賴的庫,可能是一個proc掛載等。我真的只考慮過它,因爲有人提出了一個真正的VM解決方案。 – tMC

回答

20

一個更好的版本選項B的將是取代

import twisted 

通過

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

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

雖然(如果在調用pkg_resources.require之前進行了扭曲)(如果有任何其他選項B的變體),則這將不起作用; twisted將已經處於sys.modules

OP編輯:小語法修正,每

+1

如果出現以下情況:1)我安裝了兩個版本的軟件包,2 )在調用'require'之前,模塊不在'sys.modules'中,但是我得到了VersionConflict異常(即,我請求了一個版本,但另一個版本已經存在並導致異常)? – Eugen

+0

@Eugen:請問這是一個新問題,還包括重現步驟。 – SingleNegationElimination

+0

我使用這裏描述的解決方法解決了我的問題:[解決方法](http://bugs.python.org/setuptools/issue139)。在導入其他內容之前,必須將\ _ \ _ require \ _ \ _添加到我的模塊中。 – Eugen

1

我不能告訴你什麼是最好的情況,但你也許可以考慮:

選項d:(如帶有Windows 7)在虛擬機中運行它

選擇E:安裝/舊版本的Python扭曲另一臺機器上

+0

這些都是可能的,但安裝另一個虛擬機的時間通常在30分鐘左右(至少對我來說)...我擁有的是VirtualBox ... –

0

如果SingleNegationElimination的解決方案不起作用,要知道,你並不需要更換進口的所有33個實例;您只需在入口點修改sys.path;例如您只能定位您的模塊的__init__.py文件。

在那裏你會插入例如

import sys 
sys.path.insert(0, DIR) 
相關問題