2017-01-31 18 views
0

我有一個Python腳本需要三個文件夾作爲輸入。我正在嘗試創建一個GUI,在其中瀏覽三個文件夾位置,然後以這些參數作爲參數調用Python腳本。我已經創建了GUI並可以瀏覽文件夾位置,但是我似乎遇到了使用QProcess或Python.h調用Python腳本的問題。在QT Creator中使用C++調用Python腳本

QProcess中:

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腳本可以運行?

+0

您應該指定腳本所在的路徑。 QProceas提供了這種可能性。腳本名稱中的空白空間也需要反斜槓。 – Cristi

+0

當我使用QProcess方法時,沒有任何反應,就好像按鈕沒有代碼一樣。我不知道我是否缺少其他東西。 –

+0

我不認爲它找到你的腳本的路徑。看到我的第一條評論。你有沒有試過QProcess :: SetWorkingDirectory? – Cristi

回答

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函數。我不知道這是否是最有效的方法。但它現在工作。如果有更好的方法,讓我知道。