2012-04-12 44 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生成的扩展。

相关问题