2010-07-23 57 views
1

我有一個程序,它嵌入兩python2和python3解釋。 libpython共享庫由相應的命令編輯,這些命令提供對解釋器的訪問,並且每個解釋器保持其自己的狀態。動態同時加載兩個版本libpython

這一切工作就好了,如果用戶只使用純Python模塊或內建命令。嘗試加載C擴展(如termios),然後抱怨「未定義的符號:PyExc_TypeError」。發生這種情況是因爲C擴展沒有鏈接到libpython。 Python上游不認爲這是一個problem

爲了解決這個問題,我可以在我的程序中更改dlopen()的調用,使libpython共享庫使用RTLD_GLOBAL。但是,只要我這樣做,試圖在程序的同一會話中同時使用python2和python3解釋器,導致它在調用Py_Initialize的過程中導致ABRT,無論哪個解釋器被第二個調用。只使用其中一個解釋器可以正常工作。

任何想法如何獲得當C擴展將不反對libpython掛鉤,因此需要使用RTLD_GLOBAL這個工作?

回答

1

對不起,但這不會按照您希望的方式工作。解決方案通常包括將每個擴展連接到版本化的libpython符號;或者可以有一個支持命名空間的鏈接器,這樣可以將每個庫映射到不同的名稱空間,而不是全局的。不幸的是,這些選項都不容易應用,所以您可能會堅持使用多進程模型。只需分叉即可,併爲每個版本的Python提供一個流程鏈接。那麼艱難的是如何分享導致你需要兩個不同的Python解釋器的數據。也許關於什麼問題導致問題的描述可能有助於找到更好的解決方案?

+0

該程序允許使用python解釋器進行腳本編寫。它以前只支持Python2,但最近獲得了Python3的支持。這個想法並不是強迫一個選項或另一個選項,特別是因爲存在已經使用Python2接口編寫的腳本。我想它可能會改變,以跟蹤一個接口是否已經加載,然後阻止另一個加載。這仍然可以靈活地與兩個解釋器一起構建,但避免了整個崩潰問題。 :) – jamessan 2010-07-23 17:47:55

+0

這似乎是一個簡單的解決方法,雖然有點有限。更復雜的選擇是將腳本接口與語言綁定分開,通過子進程運行該接口,然後讓每個子進程鏈接到您喜歡的任何版本。它不會很有效率,根據您當前的界面而定,可能完全不切合實際,但考慮到您現在可以減少它,可能是可行的。 – 2010-07-23 18:30:51