如何通过swig在Python3中正确创建C++向量
How can I correctly create a C++ vector in Python3 by swig?
我尝试测试swig库"std_vector.I",但我无法像官方演示那样在Python3中创建向量,以下是一些信息。
swig_test.i
%module swig_test
%{
#include <vector>
void worker(std::vector<int> &v) {
v.push_back(123);
}
%}
%include <std_vector.i>
%template(MyVector) std::vector<int>;
void worker(std::vector<int> &v);
然后我运行:
swig -python -py3 -c++ swig_test.i
它工作正常。然后是设置.py
from distutils.core import setup, Extension
test_module = Extension('_swig_test',
sources=['swig_test_wrap.cxx'],
)
setup(name = 'swig_test',
version = '0.1',
author = "SWIG Docs",
description = """Simple swig test from docs""",
ext_modules = [test_module],
py_modules = ["swig_test"],)
然后运行:
python setup.py build_ext --inplace
它创建了文件"_swig_test.cp38-win_amd64.pyd",我在shell中测试它。
>>> import _swig_test
>>> v = _swig_test.MyVector([1,2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module '_swig_test' has no attribute 'MyVector'
这太奇怪了,它不能正常工作,然后我运行dir
>>> dir(_swig_test)
['MyVector___bool__', 'MyVector___delitem__', 'MyVector___delslice__', 'MyVector___getitem__', 'MyVector___getslice__', 'MyVector___len__', 'MyVector___nonzero__', 'MyVector___setitem__', 'MyVector___setslice__', 'MyVector_append', 'MyVector_assign', 'MyVector_back', 'MyVector_begin', 'MyVector_capacity', 'MyVector_clear', 'MyVector_empty', 'MyVector_end', 'MyVector_erase', 'MyVector_front', 'MyVector_get_allocator', 'MyVector_insert', 'MyVector_iterator', 'MyVector_pop', 'MyVector_pop_back', 'MyVector_push_back', 'MyVector_rbegin', 'MyVector_rend', 'MyVector_reserve', 'MyVector_resize', 'MyVector_size', 'MyVector_swap', 'MyVector_swiginit', 'MyVector_swigregister', 'SWIG_PyInstanceMethod_New', 'SwigPyIterator___add__', 'SwigPyIterator___eq__', 'SwigPyIterator___iadd__', 'SwigPyIterator___isub__', 'SwigPyIterator___ne__', 'SwigPyIterator___next__', 'SwigPyIterator___sub__', 'SwigPyIterator_advance', 'SwigPyIterator_copy', 'SwigPyIterator_decr', 'SwigPyIterator_distance', 'SwigPyIterator_equal', 'SwigPyIterator_incr', 'SwigPyIterator_next', 'SwigPyIterator_previous', 'SwigPyIterator_swigregister', 'SwigPyIterator_value', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'delete_MyVector', 'delete_SwigPyIterator', 'new_MyVector', 'worker']
我尝试添加#define SWIG_FILE_WITH_INIT,但它没有任何用处,我尝试模仿官方演示,它的效果相同。
我该怎么处理?
这里的问题是如何导入和使用您构建的模块。
当您运行SWIG并生成一些C++代码时,它也生成了一些Python。您不想直接访问本机模块,而是想通过生成的python访问它,例如
import swig_test # Note no leading _
v = swig_test.MyVector([1,2,3])
那就行了。
请注意,您也可以通过调用带有-builtin
标志的SWIG来要求SWIG生成纯本机模块,例如:
swig -python -py3 -c++ -builtin swig_test.i
然而,在刚开始的时候,我通常不会建议这样做,因为这会让一堆常见的事情变得更加困难。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息