本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库
1.移植Python解释器
Python环境的目录结构
红色部分是生成路径下解释器运行时依赖
将红色部分拷贝到C++编译主ExE路径下即可,并把需要允许的py文件页考过去(也就是.py文件需和编译生成的.exe文件放在一起)蓝色部分是VS配置编译时依赖,需要添加到vs工程的环境中
除此之外,也可以指定环境:
读取python文件位置
程序最终发布的时候,不需要在客户端机上安装python,只需要拷贝python文件的libs,lib库,include文件夹,dll文件夹等到安装目录下,并使用
Py_SetPythonHome((char*)strPythonLibPath.c_str());指定查找路径
2.VS配置
在vs中进行配置
3.实例
python程序
def testReturn1(s1, s2):
s = s1+s2
return s
def testReturn2(s1):
return s1
C++程序
//***python调用***//
//初始化python模块
Py_Initialize();
// 检查初始化是否成功
if (!Py_IsInitialized())
{
cout << "初始化失败" << endl;
Py_Finalize();
}
PyObject *pModule= PyImport_ImportModule("helloworld");//Python文件名
if (!pModule)
{
cout << "py文件导入失败" << endl;
Py_Finalize();
}
else
{
PyObject*pFunc = PyObject_GetAttrString(pModule, "testReturn1");//Python文件中的函数名
if (!pFunc) {
cout << "函数导入失败" << endl;
Py_Finalize();
}
PyObject *pyParams1 = PyTuple_New(2);
PyTuple_SetItem(pyParams1, 0, Py_BuildValue("s", "hello "));
PyTuple_SetItem(pyParams1, 1, Py_BuildValue("s", "python"));
char * result1;
PyObject*pArg = PyEval_CallObject(pFunc, pyParams1);//调用函数
PyArg_Parse(pArg, "s", &result1);
cout << result1 << endl;
pFunc = PyObject_GetAttrString(pModule, "testReturn2");//Python文件中的函数名
if (!pFunc) {
cout << "函数导入失败" << endl;
Py_Finalize();
}
PyObject* pyParams3 = Py_BuildValue("(i)", 123);
int result2;
pArg = PyEval_CallObject(pFunc, pyParams3);//调用函数
PyArg_Parse(pArg, "i", &result2);
cout << result2 << endl;
}
结果