C++调用Python
C++调用Python
在毕业设计中需要用到一个深度学习网络的已有算法,但是整个框架是用C++写的,所以需要用C++调用Python,整个过程持续了一周,难受~ 但也学到了不少,在这里记录一下!
文中可能会有一些错误,如果又发现的,麻烦留言,我及时更正,非常感谢!
官方文档
准备工作
环境搭建
- 本机环境:
- Ubuntu18.04
- Anaconda
- 虚拟环境:
- Python 3.6
- numpy 1.17
调用方法
包含头文件以及链接到库
#include<Python.h>
set(PYTHON_INCLUDE_DIRS "/home/jia/Software/anaconda3/envs/Test/include/python3.6m/")
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS})
link_directories(/home/jia/Software/anaconda3/envs/Test/lib/python3.6/config-3.6m-x86_64-linux-gnu)
set(PYTHON_LIBRARIES "/home/jia/Software/anaconda3/envs/Test/lib/libpython3.6m.so")
add_executable(test main.cpp)
target_link_libraries(test ${
PYTHON_LIBRARIES
直接调用简单语句
#include "Python.h"
int main()
{
Py_Initialize(); ## 初始化
PyRun_SimpleString("print 'hello'");
Py_Finalize(); ## 释放资源
}
简单函数调用
- C++代码
#include <iostream>
#include <string>
#include <Python.h>
using namespace std;
int main()
{
/*****************************************
* Python初始化及路径加载
******************************************/
cout << "---------------------初始化Python--------------------" << endl;
Py_Initialize(); // 使用Python系统前,必须使用Py_Initialize对其进行初始化
if ( !Py_IsInitialized() ) //检查初始化是否成功
{
return -1;
}
cout << "---------------------添加路径--------------------" << endl;
// PyRun_SimpleString:这个函数就是执行一条简单的python代码
PyRun_SimpleString("import sys");
PyRun_SimpleString("import os");
//建议用os先获得绝对路径。再将路径加载到python中,不然路径设置的不一定对
//我这里是获得了编译好的可执行文件的上一级路径,也就是工程根目录,这里只要能够讲python脚本的路径加载正确即可
PyRun_SimpleString("sys.path.append(os.path.abspath(os.path.join(os.getcwd(), \"..\"))+'/python/')");
//这里我将路径打印出来,可以查看python脚本的路径是否加载进去了,打印出来的路径有很多,仔细查看
PyRun_SimpleString("print(sys.path)");
/*****************************************
* Python脚本获取以及脚本内的函数获取
******************************************/
cout << "---------------------脚本获取--------------------" << endl;
PyObject *pName,*pModule,*pDict,*pFunc,*pArgs;
pName = PyUnicode_FromString("mypythonfile"); //python3中用这个
pModule