使用 SWIG 使用默认值包装 C++ 函数
Using SWIG to Wrap C++ Function With Default Values
我在 say.hpp
中有以下 C++ 函数:
#include <iostream>
void say(const char* text, const uint32_t x = 16, const uint32_t y = 24, const int32_t z = -1) {
std::cout << text << std::endl;
}
这是我的 say.i
:
%module say
%{
#include "say.hpp"
%}
%include "say.hpp"
然后,我构建了共享库:
$ swig -python -c++ -I/usr/include say.i
$ g++ -fPIC -c say_wrap.cxx -I/opt/rh/rh-python38/root/usr/include/python3.8
$ g++ -shared say_wrap.o -o _say.so
然后,我试着调用它:
>>> import say
>>> say.say("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/hc/test/cpp/say.py", line 66, in say
return _say.say(text, x, y, z)
TypeError: Wrong number or type of arguments for overloaded function 'say'.
Possible C/C++ prototypes are:
say(char const *,uint32_t const,uint32_t const,int32_t const)
say(char const *,uint32_t const,uint32_t const)
say(char const *,uint32_t const)
say(char const *)
>>>
函数参数的默认值似乎有问题,因为一旦我删除它们,它就可以工作了。
有什么想法吗?
使用以下 say.i
文件。 SWIG 已经为标准整数类型预写了代码,需要将其包含在内才能理解它们。没有它们,包装器接收默认值作为不透明的 Python 对象,并且不知道如何将它们转换为正确的 C++ 整数类型。
%module say
%{
#include "say.hpp"
%}
%include <stdint.i>
%include "say.hpp"
结果:
>>> import say
>>> say.say('hello')
hello
>>> say.say('hello',1,2,3)
hello
请注意,您也可以直接提供 typedef,但最好使用 stdint.i
:
%module say
%{
#include "say.hpp"
%}
typedef unsigned int uint32_t;
typedef int int32_t;
%include "say.hpp"
我在 say.hpp
中有以下 C++ 函数:
#include <iostream>
void say(const char* text, const uint32_t x = 16, const uint32_t y = 24, const int32_t z = -1) {
std::cout << text << std::endl;
}
这是我的 say.i
:
%module say
%{
#include "say.hpp"
%}
%include "say.hpp"
然后,我构建了共享库:
$ swig -python -c++ -I/usr/include say.i
$ g++ -fPIC -c say_wrap.cxx -I/opt/rh/rh-python38/root/usr/include/python3.8
$ g++ -shared say_wrap.o -o _say.so
然后,我试着调用它:
>>> import say
>>> say.say("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/hc/test/cpp/say.py", line 66, in say
return _say.say(text, x, y, z)
TypeError: Wrong number or type of arguments for overloaded function 'say'.
Possible C/C++ prototypes are:
say(char const *,uint32_t const,uint32_t const,int32_t const)
say(char const *,uint32_t const,uint32_t const)
say(char const *,uint32_t const)
say(char const *)
>>>
函数参数的默认值似乎有问题,因为一旦我删除它们,它就可以工作了。
有什么想法吗?
使用以下 say.i
文件。 SWIG 已经为标准整数类型预写了代码,需要将其包含在内才能理解它们。没有它们,包装器接收默认值作为不透明的 Python 对象,并且不知道如何将它们转换为正确的 C++ 整数类型。
%module say
%{
#include "say.hpp"
%}
%include <stdint.i>
%include "say.hpp"
结果:
>>> import say
>>> say.say('hello')
hello
>>> say.say('hello',1,2,3)
hello
请注意,您也可以直接提供 typedef,但最好使用 stdint.i
:
%module say
%{
#include "say.hpp"
%}
typedef unsigned int uint32_t;
typedef int int32_t;
%include "say.hpp"