python - 在 QT Creator 中使用 C++ 调用 Python 脚本

标签 python c++ qt

我有一个 Python 脚本,它将三个文件夹作为输入。我正在尝试创建一个 GUI,在其中浏览三个文件夹位置,然后使用这些作为参数调用 Python 脚本。我已经创建了 GUI 并可以浏览文件夹位置,但我似乎无法使用 QProcess 或 Python.h 调用 Python 脚本。

Q进程:

QString arg1 = ui->folder1->text();
QString arg2 = ui->folder2->text();
QString arg3 = ui->folder3->text();

QProcess p;
QString script = "python script.py";
QStringList params;

params << arg1 << arg2 << arg3;
p.start(script, params);
p.waitForFinished(-1);

QString p_stdout = p.readAll();
ui->displayOutput->setText(p_stdout);

Python.h:

QString arg1 = ui->folder1->text();
QString arg2 = ui->folder2->text();
QString arg3 = ui->folder3->text();

const char* args1 = arg1.toUtf8().constData();
const char* args2 = arg2.toUtf8().constData();
const char* args3 = arg3.toUtf8().constData();

PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pResult, *pArgs;

// Initialize Python Interpreter
Py_Initialize();

// Convert python script's name into Python string
pName = PyString_FromString("script");

// Import the file as a Python module
pModule = PyImport_Import(pName);

// Create a dictionary for the contents of the module
pDict = PyModule_GetDict(pModule);

// Arguments
pArgs = PyTuple_New(3);
PyTuple_SetItem(pArgs, 0, PyString_FromString(args1));
PyTuple_SetItem(pArgs, 1, PyString_FromString(args2));
PyTuple_SetItem(pArgs, 2, PyString_FromString(args3));

pFunc = PyDict_GetItemString(pDict, "main");

pResult = PyObject_CallObject(pFunc, pArgs);

Py_Finalize();

我会说当我在调试或发布中运行 Python.h 时,当我按下按钮运行代码时程序崩溃。有没有更好的方法来运行这两种代码而不会遇到问题?

编辑: 它可以使用 QProcess 方法在没有参数的情况下运行,但是当我包含参数时它不会运行,这些参数是文件夹路径。我做了一个函数,将引号放在那些有空格的文件夹中,但它仍然无法运行。有没有办法将文件夹作为参数传递,以便 Python 脚本可以运行?

最佳答案

所以在尝试了不同的方法之后,这就是我在 Windows 上的工作方式

QString cmd_qt = QString("python %1script.py %2 %3 %4").arg(filename1).arg(filename3).arg(filename4).arg(filename5);
const char* cmd = cmd_qt.toLocal8Bit().constData();
system(cmd);

这只是通过命令提示符调用 Python 函数。我不知道这是否是最有效的方法。但它现在有效。如果有更好的方法,请告诉我。

关于python - 在 QT Creator 中使用 C++ 调用 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41960630/

相关文章:

c++ - 将图像加载到opengl纹理qt c++

python - 在满足x个条件后播放音频(Python-Pygame)

python - pandas 时间戳校正

python - 难以在 Lion 上安装 MySQLdb - 导入找不到模块

c++ - 管道优化,这样做有什么意义吗?

c++ - 使用Boost regex lib时C++断言崩溃

python - 应用引擎 + 网站管理员工具

c++ - 在 C++11(或更高版本)中从字节数组反序列化对象的无未定义行为方式是什么?

c++ - QHash 问题

qt - 如何使用 QAbstractTableModel.submit\revert 方法?