ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python调用C++程序,C++调用python

2022-06-13 20:33:43  阅读:146  来源: 互联网

标签:调用 Python C++ python usr python3.9


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有