使用默认 API 在 c++ 中调用 python 2.7 函数

Calling a python 2.7 function in c++ using the default api?

本文关键字:python 调用 函数 c++ 默认 API      更新时间:2023-10-16

假设我有一个函数

def pyfunc():
    print("ayy lmao")
    return 4

我想用 c++ 调用它

int j = (int)python.pyfunc();

我到底该怎么做?

你可能想看看这个:https://docs.python.org/2/extending/extending.html

为了从C++调用 Python 函数,您必须嵌入 Python在您的C++应用程序中。 为此,您必须:

  1. 加载 Python DLL。 如何执行此操作取决于系统: LoadLibrary在Windows下,dlopen在Unix下。 如果 Python DLL 是在用于 DLL 的常用路径中(%path%在 Windows 下, LD_LIBRARY_PATH在 Unix 下),如果您尝试,这将自动发生调用 Python C 接口中的任何函数。 手动加载将让您在版本等方面进行更多控制。

  2. 加载库后,您必须调用该函数 Py_Initialize()初始化它。 您可能想致电 Py_SetProgramName()Py_SetPythonHome()首先建立环境。

  3. 你的函数在一个模块中,所以你必须加载它: PyImport_ImportModule . 如果模块不在标准路径中,您必须将其位置添加到sys.path:使用 PyImport_ImportModule获取模块"sys",然后 PyObject_GetAttrString获取属性"path" 。 路径属性是一个列表,因此您可以使用任何列表函数来添加无论需要什么。

  4. 您的函数是模块的属性,因此您使用 PyObject_GetAttrString模块以获取功能。 一旦你得到了它,你就把参数打包到一个元组中,或者字典(用于关键字参数),并使用PyObject_Call调用它。

所有

功能以及所有必要的内容都已记录在案(事实上非常好)在 https://docs.python.org/2/c-api/。 你会对"嵌入 Python"部分特别感兴趣,并且"导入模块",以及更通用的实用程序("对象协议"等)。 您还需要了解一般原则关于 Python/C API 的工作原理——比如参考计数和借用参考与拥有的参考;你可能想读首先是引言中的所有部分。

当然,尽管文档的整体质量很高,但它是不完美。 有几次,我不得不投入到Python中来源弄清楚发生了什么。 (通常,当我得到来自 Python 的错误,以找出它实际上在抱怨什么关于。