1.VS调用python
1.1 安装配置好Python本身的运行环境,以能在命令行下运行py脚本为准,最好用anaconda安装一个python的环境,便于管理
1.2 建立一个VS的工程,然后将其调到release,x64。要是Debug也可以,运行的时候提示需要python的库名不一样,稍微改一下即可。(我用的是debug)
1.3 在工程中添加调用python的头文件和静态库、动态库等
添加python相关的头文件
将安装的python的根目录下的include文件夹,添加到VS的项目属性->配置属性->C/C++->"附加包含目录"中
添加python相关的静态库
将python的根目录下的libs文件夹,添加到VS的项目属性->配置属性->链接器->常规->"附加库目录"中
VS的项目属性->配置属性->链接器->输入 里面增加附加依赖项,如果你的工程是debug就需要使用python38_d.lib
添加python相关的动态库
将python的根目录下的python38.dll放到工程的debug目录(生成exe目录)下,方便运行的时候可以找到dll,也可以增加dll的路径
1.4 工程的属性配置好之后,在使用之前 : #inlcude <python.h>,这个头文件是python提供了一个供C/C++使用的API
step1:设置python解释器的环境 , Py_SetPythonHome(L"pyPath");
step2:初始化,Py_Initialize();
step3: 调用python语句 , PyRun_SimpleString(“ py ”);一次调用一句
step4: 使用后释放python解释器的使用 Py_Finalize();
// 调用python 解释器
Py_SetPythonHome(L"E://usePy//cUsePython//py3_8A"); // 添加Python环境路径
Py_Initialize();
if (Py_IsInitialized())
std::cout << "Init Success 1" << std::endl;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('E:../py')"); // 添加python文件的import路径,更推荐使用相对路径
PyRun_SimpleString("print(sys.version)\n");
// PyRun_SimpleString("import temp"); 可以包含上面路径里面自己写的python文件
// PyRun_SimpleString("temp.fun()");
// 调用结束 释放python 解释器
Py_Finalize();
我在python时候使用图像识别的时候可以正常运行,最后我用VS调用一个利用piddle的图像识别python程序的时候,报错找不到cv2,检查了python环境里面在 $(python环境)\Lib\site-packages\cv2 库都是存在的,最后没办法用C++调用命令行来使用python了。
2.C++调用命令行
system 和popen 调用命令行
当要对执行结果的输出处理的时候最好使用popen来获取执行指令的返回结果。
#include <cstdlib>
system("python ./merge/Spine/test_v3.py"); // 调用执行test_v3.py
#include <cstdio>
int main() {
FILE* pipe = popen("command arg1 arg2", "r");
if (pipe) {
char buffer[128];
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != NULL)
// 处理命令输出
printf("%s", buffer);
}
pclose(pipe);
}
return 0;
}
3.QT调用python
QT可以使用上面类似两种方式来调用python
最后选择了用命令行来调用python
在Qt中调用命令行可以使用QProcess类。QProcess类提供了一个接口,可以执行外部命令并与其进行交互。
以下是一个简单的示例,演示如何在Qt中调用命令行并获取输出,由于QT默认是UTF-8编码,windows是GBK编码,中间需要做一下转码。
cpp
复制代码
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
// 创建QProcess对象
QProcess process;
// 设置执行的命令和参数
QString program = "echo";
QStringList arguments;
arguments << "Hello, World!";
启动进程并传递命和参数
process.start(program, arguments);
// 等待进程完成
process.waitForFinished();
// 读取令行输出
QByteArray byteArr =process.readAllStandardOutput();
QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
QString gbkString = gbkCodec->toUnicode(byteArr);
qDebug() << gbkString;
// 打印输出结果
qDebug() << "Output: " << gbkString;
return app.exec();
}
4.使用anaconda 配置使用的图像识别paddle 和语音识别 whisper的环境,先在python环境测试,然后再用C++调用进行测试
https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/windows-pip.html
https://zhuanlan.zhihu.com/p/618598430
安装ffmpeg 转码器 在使用Whisper之前请注意将ffmpeg加入系统的环境变量中,不然会在使用时程序报错。
https://ffmpeg.org/download.html