2015-11-05 53 views
0

我需要下一個情況的幫助。有一個項目需要兩個版本的一個庫。讓這個庫爲lib,其版本:liboldlibnew。這些庫不能通過pypi訪問,即它們都在它們自己的文件夾中。讓這些文件夾的路徑爲/path/to/libold/path/to/libnew在一個Python項目中使用一個庫的兩個版本

在我的項目中,我需要來自這兩個庫的類的實例,但我不能同時導入它們,但只有舊的或新的lib。
我嘗試下一個方法:

import sys 
sys.path.insert(0,'path/to/libold') 
import lib as libold 
sys.path.pop(0) 
sys.path.insert(0,'path/to/libnew') 
import lib as libnew 

執行此命令,並libold表示libnew相同的庫,libold後。

我也試過importlib和imp並得到了相同的結果。

如何執行導入2個版本的lib?

+0

爲什麼不導入你需要的類? –

+0

「lib」是指python模塊還是C擴展?它是一個包含許多.py文件的包嗎? – tdelaney

+0

您是否測試過'sys.path.insert(0,'path/to/libnew');導入lib爲libnew'實際導入新版本?沒有違法意圖。它看起來像我的代碼應該工作,所以我只是想確定。 – saulspatz

回答

0

Python將導入的模塊添加到sys.modules。當你編寫import lib as libnew時,sys.modules['lib']已經存在,因此新的lib不會被導入。

導入新的lib,你應該從sys.modules刪除舊的,像這樣:

import sys 
sys.path.insert(0, 'path/to/libold') 
import lib as libold 
sys.path.pop(0) 
del sys.modules['lib'] 
sys.path.insert(0, 'path/to/libnew') 
import lib as libnew 

但是,這樣做可能會遇到嚴重問題。特別是,如果舊的lib試圖導入一個子模塊(比如說,例如lib.submodule),它會取而代之。出於這個原因,在刪除sys.modules['lib']之前以及導入新的之前,最好導入舊庫的所有子模塊。

但是,這是一個骯髒的黑客,而不是一個真正的解決方案。在Python中,模塊和包由名稱標識,而不是由路徑標識。這就是它的工作方式,一直都很有效,而且你無能爲力。

請考慮使用multiprocessing來代替這些「限制」。用multiprocessing你可以運行兩個進程:一個使用舊的lib,另一個使用新的。 multiprocessing爲您提供了許多工具來簡化進程間通信。

相關問題