如何在同一程序中調用分別用python 2和python 3寫的多個第三方模塊?

簡化需求如下:我的程序中需要調用2個第三方模塊A和B。A是用python 3.x寫的;而B是用python 2.x寫的。A和B的代碼量都較大,且開發活躍、版本更新較快。

應該如何實現從我的程序中同時調用模塊A和B?

如果有多種方法,哪種方法最簡單可靠?且在後續如果第三方模塊升級(包括B仍然在2.x內升級,和從2.x升級到3.x)後,我的程序的改動量最小?


有三種方案。

一、跑多個進程,使用 IPC 手段來協調(開對匿名套接字做 RPC 之類的)。

二、像 Vim 那樣弄運行時動態鏈接。好麻煩的,還不容易做好兼容。

三、把那個只支持 Python 2.x 的模塊給改成兼容 Python 3.x 的,並且改動要足夠好,然後說服上游讓他們合併。


從實際情況來看,模塊在執行時只會使用你執行程序的解釋器,因此如果兩個模塊開發時針對環境不同,那麼沒有任何好辦法可以讓它通過兩種解釋器分別使用不同模塊。

目前看來有一個辦法是,自己包裝一下兩個模塊,通過MQ、RPC甚至PIPE進行通信,分別使用不同的venv去跑,然後寫個啟動腳本的幹活。

其次就是用py3去跑,並且把py2里的那個模塊改改,想辦法用six/2to3做一下兼容。這樣可能是最省事的。


說下具體是哪個庫吧,如果自己寫的庫,改成另一個版本更好。


有二種解決方法。

1、利用異常

try: # Python 2.7+
from collections import OrderedDict
except ImportError:
from .packages.ordered_dict import OrderedDict
from .packages.six import iterkeys, itervalues, PY3

2、利用sys.version_info

import sys

if (sys.version_info &> (3, 0)):
# Python 3 code in this block
import base64
return base64.b64encode(data).decode()
else:
# Python 2 code in this block
return data.encode("base64")


修改B,使支持py3。或者換一個庫。

現在只支持py2的庫很少了,B要麼以後會升級到支持py3,要麼會不再維護。


做成web服務


將兩個不同版本的python模塊,定義好介面,封裝為兩個動態庫,這樣就可以導出被外部調用了。


推薦閱讀:

為什麼C++讀取文件會比Python慢?
Python3 str在內存中的存儲方式?
自己寫的Python函數,如何調用?
OSX 10.9.4 如何安裝 Python 2.7?
python 3.4 新加入的asyncio是咋通過yield from實現非同步的?

TAG:軟體開發 | Python | Python3x | Python2x |