我有一個程序,它嵌入兩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
這個工作?
該程序允許使用python解釋器進行腳本編寫。它以前只支持Python2,但最近獲得了Python3的支持。這個想法並不是強迫一個選項或另一個選項,特別是因爲存在已經使用Python2接口編寫的腳本。我想它可能會改變,以跟蹤一個接口是否已經加載,然後阻止另一個加載。這仍然可以靈活地與兩個解釋器一起構建,但避免了整個崩潰問題。 :) – jamessan 2010-07-23 17:47:55
這似乎是一個簡單的解決方法,雖然有點有限。更復雜的選擇是將腳本接口與語言綁定分開,通過子進程運行該接口,然後讓每個子進程鏈接到您喜歡的任何版本。它不會很有效率,根據您當前的界面而定,可能完全不切合實際,但考慮到您現在可以減少它,可能是可行的。 – 2010-07-23 18:30:51