我试图通过swig将我的c ++代码移植到python.
当我完成构建py,pyd,cxx和lib文件时,在Python(命令行)下,我键入"module Dnld",它显示 - > import error:动态模块没有定义init函数.以下是我的代码,
进一步:添加我的构建步骤以避免误解,谢谢Mark Tolonen
(环境:带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)
信息不足,因为问题可能在于你如何构建它.例如,使用您指定的文件,从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)
所以我相信这会解决你的问题.我很高兴帮助你!