编程语言
首页 > 编程语言> > Python调用C++程序,C++调用python

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程序

参考:在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