(Swig to python)导入错误:动态模块没有定义init函数

use*_*842 5 c++ python swig

我试图通过swig将我的c ++代码移植到python.

当我完成构建py,pyd,cxx和lib文件时,在Python(命令行)下,我键入"module Dnld",它显示 - > import error:动态模块没有定义init函数.以下是我的代码,

进一步:添加我的构建步骤以避免误解,谢谢Mark Tolonen

  1. 文件 - >新建 - >项目 - > Windows控制台应用程序 - >选择DLL和空项目(无unicode)
  2. 将我的SerialComm文件夹添加到项目中(包括DownloaderEngine.h Serial.h PortEnumerator.h等).
  3. 配置属性 - > c/c ++ - >其他包含目录 - > C:\ Python27\include
  4. 配置属性 - >链接器 - >常规 - >输出文件 - > $(OutDir)\ Dnld.pyd
  5. 配置属性 - >链接器 - >输入 - >其他包含目录 - > C:\ Python27\libs\python27.lib和.\ SerialComm\setupapi.lib
  6. 添加Dnld.i,进行自定义构建
  7. Dnld.i属性页面 - >命令行 - > swig -c ++ -python $(InputPath)
  8. Dnld.i属性页面 - >输出 - > $(InputName)_warp.cpp
  9. build,创建Dnld_wrap.cxx,Dnld.py
  10. 在我的项目中添加Dnld_wrap.cxx,重建所有,创建Dnld.pyd,就是这样

(环境:带SP2008的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"
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 6

信息不足,因为问题可能在于你如何构建它.例如,使用您指定的文件,从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
Run Code Online (Sandbox Code Playgroud)

编辑:您的构建步骤看起来是正确的,但有一件事是.pyd文件应该被命名_Dnld.pyd(注意下划线).

生成的Dnld.py调用import _Dnld(.pyd),因此您将import Dnld在Python脚本中使用(.py).

例:

>>> import Dnld
>>> engine = Dnld.CDownloaderEngine()
>>> result = engine.OpenPort(...)
Run Code Online (Sandbox Code Playgroud)

如果我重命名没有下划线的.pyd,这是我得到的错误:

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

所以我相信这会解决你的问题.我很高兴帮助你!