2009-07-22 54 views
3

當我嘗試將C++共享庫導入到python 2.5的windows版本時,Python「掛起」,我不知道爲什麼。Python導入Swig生成的包裝時掛起

在Linux上,一切正常。我們可以編譯我們所有的C++代碼,生成swig包裝類。它們可以編譯並可以導入並用於python 2.5或2.6。現在,我們試圖使用Cygwin將代碼移植到Windows。

我們可以使用-mno-cygwin將每個C++庫編譯爲共享dll,從而消除了對cygwin1.dll的依賴性。從本質上講,這導致gcc目標是MinGW而不是Cygwin,使得生成的二進制文件可以在Windows中運行,而不依賴於Cygwin。而且,這些共享庫中的每一個都可以鏈接到C++二進制文件中併成功運行。

完成這一步後,我們使用swig爲每個共享庫生成包裝。這些包裝生成,編譯和鏈接沒有問題。

接下來的一步是將生成的python包裝器導入到python中。我們能夠導入除我們兩個圖書館以外的所有圖書館。對於不起作用的兩個,當我們嘗試將.py或.pyd文件導入Windows python(使用Visual C++編譯的版本)時,python掛起。我們不能用ctrl + c或ctrl + d殺死python,唯一的辦法是通過任務管理器殺死它。如果我們將gdb附加到python進程並打印堆棧跟蹤,我們大多會得到垃圾,沒有用處。

接下來,我們嘗試了在* .i文件中定義代碼塊並重新創建swig包裝。這個過程至少允許我將庫導入到Windows python中,但問題是我們不得不註釋掉軟件運行所需的太多函數。一般來說,有三種類型的函數需要註釋掉:靜態函數,虛擬常量函數和常規公共函數,這些函數沒有聲明爲常量。這也是可重現的,如果我們取消註釋這些函數中的任何一個,那麼導入會再次掛起。接下來,我們嘗試將函數提取到一個簡單的hello世界程序中,生成一個swig包裝並將它們導入到python中。這工作。我們完全從頭文件中複製函數。他們在非常小的測試程序中工作,但不在較大的共享庫中工作。我們以完全相同的方式構建它們。

因此,關於爲什麼會發生這種情況,甚至更好的調試技術的任何想法都會非常有用。

這些在gcc 3和4以及python 2.5和2.6上運行良好。 在Windows上,這是我使用的軟件: GCC 3.4.4 痛飲1.39(Windows無法swig.org二進制文件) 蟒蛇2.5.4(Windows可執行文件,包括從python.org /庫)

這些是我用來構建簡單的hello world程序的命令(完整的庫使用相同的選項,由於額外的-I,-L和-l選項,它只是更長的時間)

swig -C++ -python -o test_wrap.cc test.i

GCC -c -mno-cygwin的test.cc

GCC -c -mno-cygwin的test_wrap.cc -I/USR/python25 /包括

dlltool --export-所有--output清晰度_test.def test.o

GCC -mno-cygwin的-shared -s test_wrap.o測試。Ø-L/USR/python25 /庫-lpython25 -lstdC++ -o _TestModule.pyd

謝謝, AJ

回答

1

我已經使用的一種技術是在模塊中插入一個 「硬」 斷點(__asm int 3)初始化函數。然後或者通過調試器運行它,或者只是運行它,並在調用中斷時讓窗口調試器彈出。

你可以從微軟here下載一個漂亮的windows調試器。