Python调用C++程序,C++调用python
作者:互联网
1.Python调用C++程序
1、编写C/C++实现程序。
2、将C/C++程序编译成动态库。
3、在Python中调用编译生成的库。
请参考:简单的Python调用C++程序(使用ctypes模块)
python调用C++程序的其他方法:
boost.python:将c/c++的函数接口转换为Python接口有好几种解决方案,不同于C语言的简单直接,C++因使用了大量的面向对象编程的思想导致转换为Python接口时相对比较复杂,boost.python的目标就是为了简单方便地将C++程序转换成Python的接口。
2.C++中使用python程序
2.1.Ubuntu20.04下安装开发版的python库
sudo apt install python3.9-dev
C++程序所需的头文件和库文件分别在/usr/include/和/usr/lib/中
2.2.hello world
// cp.cpp
#include <Python.h>
int main(int argc, char *argv[]) {
Py_Initialize();
PyRun_SimpleString("print('hello world')\n");
Py_Finalize();
return 0;
}
执行命令:
g++ -o cpy cp.cpp -lm -std=c++11 -I /usr/include/python3.9/ -l python3.9
使用-I(大写地i)指定头文件所在路径
虽然编译器会自动地去目录/usr/lib/查找库文件,但我们还是需要使用-l选项指定具体地库python3.9
【问题:/usr/lib/python3.9中几乎都是.py文件,为什么.py文件可以成为库文件】
2.3.调用Python函数string.split()
在C++中如果我们想分割一个字符串,虽然说也是可以实现的,但是应该没有比Python中执行一个string.split()更加方便快捷的方案了,因此我们测试一个用C++调用Python的split函数的功能。
首先编写一个 pysplit.py文件:
# pysplit.py
def sp(string):
return string.split()
cp.cpp中将 pysplit.py当成包进行调用。
// cp.cpp
#include <Python.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
Py_Initialize();
if (!Py_IsInitialized())
{
cout << "Initialize failed!" << endl;
return 0;
}
PyObject* pModule = NULL;
PyObject* pFunc;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
pModule = PyImport_ImportModule("pysplit");
if (pModule == NULL)
{
cout << "Module Not Found!" << endl;
}
pFunc = PyObject_GetAttrString(pModule, "sp");
PyObject* args = Py_BuildValue("s", "Test String Hello Every One !");
PyObject* pRet = PyObject_CallFunctionObjArgs(pFunc, args, NULL);
int size = PyList_Size(pRet);
cout << "List size is: " << size << endl;
for(int i=0;i<size;i++)
{
PyObject* cRet = PyList_GET_ITEM(pRet, i);
char* s;
PyArg_Parse(cRet, "s", &s);
cout << "The " << i << "th term is: " << s << endl;
}
Py_Finalize();
return 0;
}
执行命令:
g++ -o cpy cp.cpp -lm -std=c++11 -I/usr/include/python3.9/ -lpython3.9 && ./cpy
最后,因为从Python中获取的是一个List格式的数据,因此我们首先需要用PyList_GET_ITEM去逐项提取,然后用PyArg_Parse将提取出来的元素保存到一个C++的char字符串中,执行结果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ -o cpy cp.cpp -lm -std=c++11 -I/usr/include/python3.9/ -lpython3.9 && ./cpy
List size is: 6
The 0th term is: Test
The 1th term is: String
The 2th term is: Hello
The 3th term is: Every
The 4th term is: One
The 5th term is: !
说明:
1.代码中使用了sys.path.append('./'),这是因为:即使是在相同的路径下,也需要通过Python的sys将当前目录添加到系统路径中,才能够识别到这个模块。
tuple格式和**args有什么关系??
答:链接
PyObject_CallFunctionObjArgs和PyObject_CallObject的区别?
答:链接
2.4.python中如果有其他模块时
使用Python.h调用python程序
如何使用C++执行python文件:
https://blog.csdn.net/dingyanxxx/article/details/46949405
https://zhuanlan.zhihu.com/p/80637788
https://zhuanlan.zhihu.com/p/79896193
https://docs.python.org/3/extending/embedding.html#embedding-python-in-c
【问题:/usr/lib/python3.9中几乎都是.py文件,为什么.py文件可以成为库文件】
答:主流的用法是把python作为一种文本形式的链接库,在c/c++程序中调用其中定义的函数。什么叫做文本形式的链接库??
什么类型的文件可以作为C++链接库??即可以用于-l后?
标签:调用,Python,C++,python,usr,python3.9 来源: https://www.cnblogs.com/codingbigdog/p/16372215.html