Python 使用 SWIG 对 C++ 进行包装。无法识别参数类型
Python wrapper around C++ using SWIG. Argument type not recognised
我正在尝试在 Linux 上使用 SWIG 围绕 C++ 代码构建一个 Python 包装器,但我不确定是否正确创建了包装器。例如,这是一个小问题(在我的大项目中)。
假设我有一个名为 message.cpp
的文件
message.cpp
#include <iostream>
#include "message.hpp"
void warning (std::string message) {
using std::cout;
cout << "\n!! WARNING! " << message << " !!\n";
}
对应的头文件为:
message.hpp
#include <string>
#include <fstream> // file I/O
#include <sstream>
#include <iostream>
void warning (const std::string message);
为了通过 SWIG 传递它,我有以下 SWIG 输入文件:
message.i
%module message
%{
#include "message.hpp"
%}
%include "message.hpp"
从 Linux 终端,我使用以下命令创建包装器:
$ swig -c++ -python message.i
$ g++ -fpic -c message.hpp message_wrap.cxx message.cpp -I/usr/include/python2.7/ -I/usr/include
$ gcc -shared message_wrap.o message.o -o _message.so -lstdc++
命令提示符下的所有 3 个步骤在终端上均无任何错误地通过,并且生成以下文件时没有任何投诉:
message_wrap.cxx
message_wrap.o
message.o
message.py
message.hpp.gch
_message.so
然后我尝试通过在 Linux 终端(保持在同一目录中)输入以下命令来测试 Python 包装器:
$ python
Python 2.7.17
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import _message
>>> _message.warning("SampleMessage")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: in method 'warning', argument 1 of type 'std::string const'
我原以为它只会在终端上显示 WARNING! SampleMessage
行,但它却崩溃了。所以看起来出了点问题。有人可以指导我问题出在哪里吗?
您的声明和实现不匹配(缺少 const
),您应该导入 message
而不是 _message
。综上所述,您缺少的是:
%include "std_string.i"
在 message.hpp
包含之前的 .i 中。这将提供将 Python str
转换为 C++ std::string
.
所需的类型映射
我正在尝试在 Linux 上使用 SWIG 围绕 C++ 代码构建一个 Python 包装器,但我不确定是否正确创建了包装器。例如,这是一个小问题(在我的大项目中)。
假设我有一个名为 message.cpp
的文件message.cpp
#include <iostream>
#include "message.hpp"
void warning (std::string message) {
using std::cout;
cout << "\n!! WARNING! " << message << " !!\n";
}
对应的头文件为:
message.hpp
#include <string>
#include <fstream> // file I/O
#include <sstream>
#include <iostream>
void warning (const std::string message);
为了通过 SWIG 传递它,我有以下 SWIG 输入文件:
message.i
%module message
%{
#include "message.hpp"
%}
%include "message.hpp"
从 Linux 终端,我使用以下命令创建包装器:
$ swig -c++ -python message.i
$ g++ -fpic -c message.hpp message_wrap.cxx message.cpp -I/usr/include/python2.7/ -I/usr/include
$ gcc -shared message_wrap.o message.o -o _message.so -lstdc++
命令提示符下的所有 3 个步骤在终端上均无任何错误地通过,并且生成以下文件时没有任何投诉:
message_wrap.cxx
message_wrap.o
message.o
message.py
message.hpp.gch
_message.so
然后我尝试通过在 Linux 终端(保持在同一目录中)输入以下命令来测试 Python 包装器:
$ python
Python 2.7.17
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import _message
>>> _message.warning("SampleMessage")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: in method 'warning', argument 1 of type 'std::string const'
我原以为它只会在终端上显示 WARNING! SampleMessage
行,但它却崩溃了。所以看起来出了点问题。有人可以指导我问题出在哪里吗?
您的声明和实现不匹配(缺少 const
),您应该导入 message
而不是 _message
。综上所述,您缺少的是:
%include "std_string.i"
在 message.hpp
包含之前的 .i 中。这将提供将 Python str
转换为 C++ std::string
.