我正试图通过swig将我的c++代码移植到python。
当我构建完py、pyd、cxx和lib文件后,在Python(命令行)下输入“module Dnld”,它显示->;导入错误:动态模块没有定义in it函数。 以下是我的代码
进一步:添加我的构建步骤以避免误解,谢谢Mark Tolonen
(环境:XP SP3和VC2008)
//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"
我花了一段时间才弄明白。从python.org邮件列表here来看,问题似乎是python希望模块Foo提供函数initFoo。那么问题是,为什么Dnld不提供initDnld。由于swig应该处理其中的大部分内容,这可能是因为swig不希望完成的库被称为D nld(如果它期望Dnld或D_nld或其他任何东西,它将失败,但是重命名文件会修复它。)请注意,这适用于python的任何C扩展,包括pyrex/cython和boost生成的扩展。
没有足够的信息,因为问题可能出在你如何构建它。例如,对于您指定的文件,从VS2008命令提示符生成应该如下所示:
编辑:您的构建步骤看起来是正确的,但有一件事是.pyd文件应该命名为
_Dnld.pyd
(注意下划线)。生成的
Dnld.py
调用import _Dnld
(The.pyd),因此您将在Python脚本中import Dnld
(The.py)。示例:
如果重命名.pyd时不使用下划线,则会出现以下错误:
所以我相信这会解决你的问题。我很高興幫助你!
作为记录,这里是错误消息的另一个可能原因
在为Python3设置Swig时运行Python2,反之亦然。
相关问题 更多 >
编程相关推荐