Phi*_*ipp 6 python pointers boost-python
我有一个函数,它接受一个int指针并通过boost :: python暴露它.如何从python中调用此函数?
在C++中使用boost :: python:
void foo(int* i);
...
def("foo", foo);
Run Code Online (Sandbox Code Playgroud)
在python中:
import foo_ext
i = 12
foo_ext.foo(i)
Run Code Online (Sandbox Code Playgroud)
结果是
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
foo(int)
did not match C++ signature:
foo(int* i)
Run Code Online (Sandbox Code Playgroud)
那么如何传递指针?
简短的回答是:你不能。Python没有指针
长答案是:根据用例有各种各样的解决方法。
我注意到您在示例中使用了 int 和 int* 。Int(以及 float、str 和 bool)是一种特殊情况,因为它在 Python 中是不可变的。
有一个包装函数,它将参数作为引用,获取地址并将其传递给实际函数。这将在 python 中无缝运行。
好吧,所以说它确实是一个 int。现在你有问题了。您无法更改传入的 int。如果您尝试相同的解决方案,boost::python 将在运行时抱怨左值。还有几种选择。
您的包装器现在应该按值或常量引用获取 int。其他一切都一样。
您的包装函数现在将不带参数,并将本地 int 的地址传递给实际函数。它将返回该值。如果您的函数已经有返回值,它现在应该返回一个元组。
将以上两者结合起来。包装器按值获取一个 int 并返回另一个不同的 int。
没有真正好的解决办法。您可以在 C++ 中创建并公开包含 C++ int 的对象。包装器将通过引用获取该对象,提取所包含的 int 的地址并将其传递给实际函数。让对象在Python中保持活动状态(并且不受垃圾收集器的影响)直到库完成它现在是Python编写者的问题,如果他犯了错误,数据就会损坏或者解释器崩溃。