项目场景:
目前正在用c++写一款后台软件,涉及到对某个路径下所有的文件夹信息进行获取,采用C/C++的方式非常麻烦,偶然间看到C++可调用Python的接口来执行,因此笔者也决定尝试一番。
环境安装
1:安装python环境,我这边下载最新版3.10.5(注意要对应mingw位数,比如mingw32就下载python32位)。对安装包直接安装既可,记得勾选设置环境变量。
https://www.python.org/downloads/release/python-3105/
2:找到python安装目录,与项目相关的文件有libs/*lib,include/Python.h等,后续会用到
C++设置
1:头文件引用 #include <Python.h>,记得设置相应的头文件路径
2:库的引用 LIBS += -Lc:/software/python3/app/libs/ -lpython310 -lpython3
3:拷贝python3.dll python310.dll,到对应的exe执行目录下。否则会提示找不到这些文件
Python 接口代码
import sys
import os
def getDir(path):
for root, dirs, files in os.walk(path, topdown=True):
print("当前目录路径:", root)
return
C++接口代码:
int fPython_vInit()
{
int ret = 0;
Py_Initialize();
// 初始化python系统文件路径,保证可以访问到 .py文件
ret = PyRun_SimpleString("import sys");
if (ret != 0){
PR_DEBUG("import sys error");
return ret;
}
ret = PyRun_SimpleString("import os");
if (ret != 0){
PR_DEBUG("import os error");
return ret;
}
// 已当前cpp文件为索引,索引到py文件
ret = PyRun_SimpleString("sys.path.append('./py/')");
if (ret != 0){
PR_DEBUG("import error");
return ret;
}
return ret;
}
void fPython_vDeInit()
{
Py_Finalize();
}
// 获取路径下所有的文件夹
void fPython_nFindDir(char *path)
{
fPython_vInit();
//初始化使用的变量
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pName = NULL;
pModule = PyImport_ImportModule("py");
if( pModule == NULL ){
PR_DEBUG("not found py.");
return;
}
//4、调用函数
pFunc = PyObject_GetAttrString(pModule, "getDir");
if( !pFunc || !PyCallable_Check(pFunc)){
PR_DEBUG("not found func.");
return;
}
PyObject_CallObject(pFunc,NULL);
fPython_vDeInit();
}