2012-04-12 46 views
4

我想通過swig將我的C++代碼移植到python。(Swig to python)導入錯誤:動態模塊沒有定義初始化函數

當我在Python(命令行)下建立py,pyd,cxx和lib文件時,我輸入「module Dnld」,它顯示 - >導入錯誤:動態模塊沒有定義初始化函數。 以下是我的代碼,

另外:我添加構建步驟,以避免誤解,謝謝你馬克Tolonen

  1. 文件 - >新建 - >項目 - > Windows控制檯應用程序 - >選擇DLL和空項目(無Unicode)
  2. 將我的SerialComm文件夾添加到項目(包括DownloaderEngine.h Serial.h PortEnumerator.h等)。
  3. 配置屬性 - >的C/C++ - >額外包括directories-> C:\ Python27 \包括
  4. 配置屬性 - >連接器 - >通用>輸出文件 - > $(OUTDIR)\ Dnld.pyd
  5. 配置屬性 - >連接器 - >輸入 - >附加包含directories-> C:\ Python27 \庫\ python27.lib和\ SERIALCOMM \ setupapi.lib
  6. 添加Dnld.i,不要自定義生成
  7. Dnld。 i property page->命令行 - > swig -C++ -python $(InputPath)
  8. Dnld.i屬性頁面 - >輸出 - > $(InputName)_warp.cpp
  9. 建設,創建Dnld_wrap.cxx,Dnld.py
  10. 添加Dnld_wrap.cxx在我的項目,全部重建,創造Dnld.pyd,這就是它

(環境:與VC2008 XP SP3)

//DownloaderEngine.h 
class __declspec(dllexport) CDownloaderEngine 
{ 
public: 
    CDownloaderEngine(); 

    virtual ~CDownloaderEngine(); 

    signed char OpenPort(signed char _ucPort, unsigned long _ulBaudRate, unsigned char _ucParity, 
     unsigned char _ucStopBits,unsigned char _ucData); 

    .... 
}; 

//DownloaderEngine.cpp 
CDownloaderEngine::CDownloaderEngine() 
{ 
    .... 
} 

CDownloaderEngine::~CDownloaderEngine() 
{ 
    .... 
} 

//DownloaderEngine.i 
%module Dnld 

%include <windows.i> 
%include <std_vector.i> 
%include <std_map.i> 
%{ 
    #define SWIG_FILE_WITH_INIT 
    #include ".\SerialComm\DownloaderEngine.h" 
%} 

/* Parse the header file to generate wrappers */ 
%include ".\SerialComm\DownloaderEngine.h" 
+2

+1爲「抱歉打擾」:) – mihai 2012-04-12 10:53:24

+0

嗨,mihai,我的英文不太好(來自臺灣),如果我的語法不正確,我真的很抱歉呢...... :( – user1328842 2012-04-12 10:58:48

+0

有你看這裏:http://www.swig.org/Doc1.3/Python.html?31.2.5。 – 2012-04-12 12:04:13

回答

5

沒有足夠的信息,因爲問題可能在於您如何構建它。例如,與文件您指定,從VS2008命令提示符建設應該是這樣的:

swig -python -c++ DownloaderEngine.i 
cl /LD /W4 /Fe_Dnld.pyd /Ic:\Python27\include downloaderEngine_wrap.cxx -link /LIBPATH:c:\Python27\libs DownloaderEngine.lib 

編輯:您構建步驟看起來正確的,但有一點是.pyd文件有望被命名爲_Dnld.pyd(注意下劃線)。

生成的Dnld.py調用import _Dnld(.pyd),所以您將在您的Python腳本中使用import Dnld(.py)。

例子:

>>> import Dnld 
>>> engine = Dnld.CDownloaderEngine() 
>>> result = engine.OpenPort(...) 

這是我的錯誤,如果我重新命名.pyd無下劃線:

>>> import Dnld 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: dynamic module does not define init function (initDnld) 

所以我敢肯定,這將解決您的問題。我很高興幫助你!

+0

感謝您的回覆,Mark Tolonen ,我已經在我的文章中添加了構建步驟,您可以參考一下嗎?謝謝:) – user1328842 2012-04-13 01:50:10

+0

您好,Mark Tolonen,結果如下(我已更改爲_Dnld.pyd輸出中) ... >>>進口D. NLD 回溯(最近通話最後一個): 文件「」,1號線,在 進口Dnld 導入錯誤:動態模塊沒有定義初始化函數(initDnld) – user1328842 2012-04-13 02:09:06

+0

你是從刪除舊的'Dnld.pyd'輸出目錄?該錯誤來自加載非下劃線版本。 – 2012-04-13 02:11:48

0

這一個花了我一陣子弄清楚。從python.org郵件列表here,似乎問題是python希望模塊Foo提供一個函數initFoo。那麼問題是爲什麼Dnld不提供initDnld。由於swig應該處理大部分內容,這可能是因爲swig不希望完成的庫被稱爲Dnld(如果它期望dnld或D_nld或其他任何內容,它將會失敗,但重命名該文件會修復它)請注意,這適用於python的任何C擴展,包括由pyrex/cython和boost生成的擴展。

相關問題