1.VS调用python

1.1 安装配置好Python本身的运行环境,以能在命令行下运行py脚本为准,最好用anaconda安装一个python的环境,便于管理

1.2 建立一个VS的工程,然后将其调到release,x64。要是Debug也可以,运行的时候提示需要python的库名不一样,稍微改一下即可。(我用的是debug)

python dll无法运行 python38.dll_开发语言

1.3 在工程中添加调用python的头文件和静态库、动态库等

添加python相关的头文件

将安装的python的根目录下的include文件夹,添加到VS的项目属性->配置属性->C/C++->"附加包含目录"中

python dll无法运行 python38.dll_c++_02

添加python相关的静态库

将python的根目录下的libs文件夹,添加到VS的项目属性->配置属性->链接器->常规->"附加库目录"中

VS的项目属性->配置属性->链接器->输入 里面增加附加依赖项,如果你的工程是debug就需要使用python38_d.lib

python dll无法运行 python38.dll_开发语言_03

python dll无法运行 python38.dll_物联网_04

添加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 dll无法运行 python38.dll_物联网_05

我在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++调用进行测试

图像识别paddle 环境配置参考了下面的博客

https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/windows-pip.html

语音识别whisper 环境配置参考了下面的博客

https://zhuanlan.zhihu.com/p/618598430

安装ffmpeg 转码器 在使用Whisper之前请注意将ffmpeg加入系统的环境变量中,不然会在使用时程序报错。

https://ffmpeg.org/download.html