boost :: python:如何调用一个需要指针的函数?

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)

那么如何传递指针?

Mat*_*ten 4

简短的回答是:你不能。Python没有指针

长答案是:根据用例有各种各样的解决方法。

我注意到您在示例中使用了 int 和 int* 。Int(以及 float、str 和 bool)是一种特殊情况,因为它在 Python 中是不可变的。

假设您传入的对象实际上并不是 int。

有一个包装函数,它将参数作为引用,获取地址并将其传递给实际函数。这将在 python 中无缝运行。


好吧,所以说它确实是一个 int。现在你有问题了。您无法更改传入的 int。如果您尝试相同的解决方案,boost::python 将在运行时抱怨左值。还有几种选择。

假设您不需要在函数退出后查看 int 的样子,并且您知道该函数在函数返回后不会隐藏指针以取消引用:

您的包装器现在应该按值或常量引用获取 int。其他一切都一样。


也许您只需要查看之后的状态(int 是 OUT 周界):

您的包装函数现在将不带参数,并将本地 int 的地址传递给实际函数。它将返回该值。如果您的函数已经有返回值,它现在应该返回一个元组。


输入和输出都很重要,并且您知道该函数在函数返回后不会隐藏指针以取消引用:

将以上两者结合起来。包装器按值获取一个 int 并返回另一个不同的 int。


该函数期望在函数返回后将指针隐藏起来以取消引用:

没有真正好的解决办法。您可以在 C++ 中创建并公开包含 C++ int 的对象。包装器将通过引用获取该对象,提取所包含的 int 的地址并将其传递给实际函数。让对象在Python中保持活动状态(并且不受垃圾收集器的影响)直到库完成它现在是Python编写者的问题,如果他犯了错误,数据就会损坏或者解释器崩溃。