在 QT Creator 中使用 C++ 调用 Python 脚本
Posted
技术标签:
【中文标题】在 QT Creator 中使用 C++ 调用 Python 脚本【英文标题】:Calling a Python Script using C++ in QT Creator 【发布时间】:2017-01-31 14:54:50 【问题描述】:我有一个 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 脚本可以运行?
【问题讨论】:
您应该指定脚本所在的路径。 QProceas 提供了这种可能性。脚本名称中的空格也可能需要反斜杠。 当我使用QProcess方法时,什么也没有发生,好像按钮没有代码一样。我不知道我是否还缺少其他东西。 我认为它找不到您的脚本的路径。请参阅我的第一条评论。你试过 QProcess::SetWorkingDirectory 吗? 这行得通,但现在我认为问题是其中有空格的文件夹导致它无法运行。 为什么不直接使用 QTPython? 【参考方案1】:所以在尝试了不同的方法之后,这就是我在 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 函数。我不知道这是否是最有效的方法。但它现在有效。如果有更好的方法,请告诉我。
【讨论】:
【参考方案2】:QString script = "python "+ "../folder1/script.py;
const char* cmd = script.toLocal8Bit().constData();
system(cmd);
没有正确读取内容。
输出总是显示无效的 Test_log 目录。
但是当从命令行直接运行 python script.py 时会给出正确的 o/p。 Python 路径在我的环境变量中设置。
log_dir = '../Test_Logs/'
if not os.path.exists(log_dir):
print('Invalid Test_log directory')
exit()
【讨论】:
以上是关于在 QT Creator 中使用 C++ 调用 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章
Visual C++ 编译器 2012 年 11 月 CTP 与 Qt Creator for C++11