C++中调用python程序
来源:互联网 发布:苏州市人工智能学会 编辑:程序博客网 时间:2024/06/04 01:12
因项目需要,需要在c++中调用python文件,于是在网上查询相关资料,终于实现,大概搞了大半天,所以还是记录下这个过程
1 相关介绍
(1)基本情况
在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可以替代动态链接库形式的接口,这样可以方便地根据需要修改脚本代码,而不用重新编译链接二进制的动态链接库。至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了。
(2)C++调用Python有两种方式
第一种方式:通过找到Python模块,类,方法,构造参数来调用。
第二中方式,就是通过构造出一个Python的脚本,用python引擎来执行。
第一种方式可能更为优雅,符合大多数的反射调用的特点。(如c#的反射机制,c#调用Com+,c#调用javascript脚本等)。
一个问题:两种语言互相调用的时候,需要做数据结构(如基本类型,字符串,整数类型等,以及自定义的类等类型)间的转换,共享内存中的一个对象。比如,如何将C++的对象实例传入python中,并在python中使用。c++和python并不在一个进程中,因此可以使用boost的shared_ptr来实现。Python调用C++,换句话说就是需要把C++封装成Python可以“理解”的类型。同理可知C++怎么去调用Python脚本。
下面这个例子,主要是演示了c++调用python,可以在c++中形成一个python脚本,然后利用PyRun_SimpleString调用;并且,构造一个c++的对象,传入到python中,并在python的脚本中调用其函数。
2 实验环境
(1)vs2017
具体配置见 vs安装配置
(2)clion
配置是修改cmakelist文件,添加:
include_directories(/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7)set(CMAKE_LIBRARY_PATH "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/")link_libraries(python)
3 编写程序
(1)方式一:,通过构造出一个Python的脚本,用python引擎来执行。
①主程序
#include "stdafx.h"#include<Python.h>//前面所做的一切配置都是为了调用这个头文件和相关库#include<iostream>using namespace std;/**g++ -o callpy callpy.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config -lpython2.6**/int main(int argc, char** argv){ // 初始化Python //在使用Python系统前,必须使用Py_Initialize对其 //进行初始化。它会载入Python的内建模块并添加系统路 //径到模块搜索路径中。这个函数没有返回值,检查系统 //是否初始化成功需要使用Py_IsInitialized。 Py_Initialize(); // 检查初始化是否成功 if (!Py_IsInitialized()) { return -1; } // 添加当前路径 //把输入的字符串作为Python代码直接运行,返回0 //表示成功,-1表示有错。大多时候错误都是因为字符串 //中有语法错误。 PyRun_SimpleString("import sys"); PyRun_SimpleString("print('---import sys---')"); PyRun_SimpleString("sys.path.append('./')"); PyRun_SimpleString("import pytest"); PyRun_SimpleString("pytest.add()"); Py_Finalize(); system("pause"); return 0;}
②python程序:pytest.py
#test function def add(): print("hello world")
运行结果:
---import sys---hello world请按任意键继续. . .
(2)方式二:通过找到Python模块,类,方法,构造参数来调用。
这中方法我的电脑上没实验成功,我同学实验成功了。主要参照如下教程的代码:
①浅析 C++ 调用 Python 模块
② C++调用python
③Python实例浅谈之三Python与C/C++相互调用
4 相关注意
(1)pystring_fromstring没有定义
造成这个问题的原因是:python3+中没有这个函数,所以这个实验只能在python2+的环境下进行。
5 相关参考
(1)浅析 C++ 调用 Python 模块
(2) C++调用python
(3)Python实例浅谈之三Python与C/C++相互调用
- Python调用C程序
- python调用C程序
- 【Python】python调用C程序
- 在Python中使用SWIG调用C和C++程序
- C中调用PYTHON
- c中调用python
- C语言调用python程序
- PHP中调用python程序
- Python中调用C++程序
- C++中调用python程序
- MATLAB中调用.C程序
- python中调用c库
- python中调用c库
- C语言中调用python
- python调用c中函数
- Python调用C可执行程序(subprocess)
- python通过swig调用c程序举例
- python中使用subprocess调用外部程序
- Netflix是如何利用内部Spot市场来节约成本的
- ABP 分析之路的开始
- Ext4 在tips中展示Grid中的某一列的所有值
- mongo笔记07( MongoDB 关系)
- HTML语言笔记(二)
- C++中调用python程序
- 关于PDF格式?你了解这些吗
- How to attach to running target w/o reset from Linux JLinkGDBServer
- 使用NodePad++来编辑服务器的配置文件
- Hadoop中的HDFS的存储机制
- idea maven相关参考
- FAST特征点检测算法
- Dubbo详细介绍与安装使用过程
- 百度地图API关于两点之间连接直线上的所有点