目录
?
实现:
点击按钮,调用Python文件,生成一个压缩文件,证明调用成功
(1)Python文件
test.py
import sys
import zipfile
def compress_file():
with zipfile.ZipFile("testpage.zip", 'w', zipfile.ZIP_DEFLATED) as zipf:
zipf.write("testpage.py")
函数compress_file为压缩函数,将testpage.py文件压缩为testpage.zip,若没有testpage.py文件,同样会生成testpage.zip文件,文件为空
(2)QT C++
(2.1)配置头文件 库文件
INCLUDEPATH += C:\Users\AppData\Local\Programs\Python\Python38\include
LIBS += -LC:\Users\AppData\Local\Programs\Python\Python38\libs -lpython38
(2.2)代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qDebug"
#include "Python.h"
#include <QDir>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
int MainWindow::LoadPython()
{
//此处主要设置exe查找Python依赖的文件夹
//Py_SetPythonHome((wchar_t*)(L"./Python38"));
Py_Initialize();
// 此处必须调用 和Python文件导入的模块一样
qDebug()<<"import sys"<<PyRun_SimpleString("import sys");
qDebug()<<"import zipfile"<<PyRun_SimpleString("import zipfile");
// 该相对路径是build-untitled-Desktop_Qt_5_12_6_MinGW_64_bit-Release下面放py_scripts文件夹
qDebug()<<QDir::currentPath();
//qDebug()<<QCoreApplication::applicationDirPath();
PyRun_SimpleString("sys.path.append('./py_scripts')");
// 加载 python 脚本
PyObject *pModule = PyImport_ImportModule("test"); // 脚本名称,不带.py
if(!pModule)
qDebug()<<"PyImport_ImportModule fail";
else
qDebug()<<"PyImport_ImportModule success";
// 创建函数指针
PyObject* pFunc= PyObject_GetAttrString(pModule,"compress_file"); // 方法名称
if(!pFunc || !PyCallable_Check(pFunc)) // 函数是否创建成功
qDebug()<<"PyObject_GetAttrString fail";
else
qDebug()<<"PyObject_GetAttrString success";
// 调用函数
PyObject_CallObject(pFunc, NULL); // 无参调用
// 并销毁自上次调用Py_Initialize()以来创建并为被销毁的所有子解释器。
Py_Finalize();
return 1;
}
void MainWindow::on_pushButton_clicked()
{
qDebug()<<LoadPython();
}
看注释文件夹不要放错了?
?py_scripts文件夹中放test.py
(2.3)错误
object.h语法错误;
在object.h中把slots改成slots1。Python将slots作为变量,而Qt将slots作为关键字,所以冲突了,再次编译该问题就没有了
(2.4)release模式运行
(2.1)
(1)windeployqt 正常打包
(2)将py_scripts文件夹拷贝到EXE同级目录
(3)将C:\Users\AppData\Local\Programs\Python\Python38里面的Lib 、python38.dll拷贝到exe同级目录(也可以全部拷贝过去,看需要哪些依赖)
(4)最终目录
(2.2)?
也可以打开
//Py_SetPythonHome((wchar_t*)(L"./Python38"));
这句注释
?目录如下
个人感觉(2.1)比较好