使用默认 API 在 c++ 中调用 python 2.7 函数
Calling a python 2.7 function in c++ using the default api?
假设我有一个函数
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++应用程序中。 为此,您必须:
-
加载 Python DLL。 如何执行此操作取决于系统:
LoadLibrary
在Windows下,dlopen
在Unix下。 如果 Python DLL 是在用于 DLL 的常用路径中(%path%
在 Windows 下,LD_LIBRARY_PATH
在 Unix 下),如果您尝试,这将自动发生调用 Python C 接口中的任何函数。 手动加载将让您在版本等方面进行更多控制。 -
加载库后,您必须调用该函数
Py_Initialize()
初始化它。 您可能想致电Py_SetProgramName()
或Py_SetPythonHome()
首先建立环境。 -
你的函数在一个模块中,所以你必须加载它:
PyImport_ImportModule
. 如果模块不在标准路径中,您必须将其位置添加到sys.path
:使用PyImport_ImportModule
获取模块"sys"
,然后PyObject_GetAttrString
获取属性"path"
。 路径属性是一个列表,因此您可以使用任何列表函数来添加无论需要什么。 -
您的函数是模块的属性,因此您使用
PyObject_GetAttrString
模块以获取功能。 一旦你得到了它,你就把参数打包到一个元组中,或者字典(用于关键字参数),并使用PyObject_Call
调用它。
功能以及所有必要的内容都已记录在案(事实上非常好)在 https://docs.python.org/2/c-api/。 你会对"嵌入 Python"部分特别感兴趣,并且"导入模块",以及更通用的实用程序("对象协议"等)。 您还需要了解一般原则关于 Python/C API 的工作原理——比如参考计数和借用参考与拥有的参考;你可能想读首先是引言中的所有部分。
当然,尽管文档的整体质量很高,但它是不完美。 有几次,我不得不投入到Python中来源弄清楚发生了什么。 (通常,当我得到来自 Python 的错误,以找出它实际上在抱怨什么关于。
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 为什么我无法打开/读取从 Python 调用的 C 扩展名中的 txt 文件?
- 从 Python 调用 c++ 文件
- 如何为从 Python 调用C++启动 GDB?
- 从python调用C++函数,使用cython,使用cythonize
- 为什么在 2019 年我们仍然不能使用 ctypes 从 Python 调用C++?
- 如何使用 python 调用 c++ 函数
- 从 Python 调用 Windows DLL 函数时出错
- 如何从 Python 调用 MPI .so 文件
- 我如何有boost.python调用一个函数来处理对象
- 从Python调用的C++dll
- 通过嵌入式 Python 调用C++代码
- 从 Python 调用 cpp 函数时出现分段错误
- 从Python调用C++64位共享库
- 使用ctypes从Python调用C++方法不起作用
- Boost python,在嵌入时从python调用c ++函数
- 从 Python 调用 C++ opencv 函数(发送一个 cv :: mat 到 C++ 使用 opencv 的 d
- 从 Python 调用自定义C++ dll
- 如何使用Python调用C++代码