QProcess передает аргументы скрипту Python
from PIL import Image
def porcentaje(path):
im = Image.open(path, "r")
im.show()
width, height = im.size
type = im.mode
format = im.format
pixels=im.getdata()
n = len(pixels)
im=im.load()
nblack = 0
noblack=0
for pixel in pixels:
if pixel < 50:
nblack += 1
else:
noblack+=1
porcentajefinal=(nblack*100)/n
print(porcentajefinal)
return(porcentajefinal)
(porcentaje(path))
mainwindow.cpp (QT Creator)
void MainWindow::on_pushButton_2_clicked()
{
QString path = QFileDialog::getOpenFileName(this,
tr("All Files (*)"));
qDebug()<<path;
QDir dir1("D:/QTCProjects/prueba");
QFile file1("D:/QTCProjects/prueba/2_1.py");
QString script1 = "D:/QTCProjects/prueba/2_1.py";
QFile file2(script1);
qDebug() << dir1.exists() << file1.exists() << file2.exists();
// these all result in true, true true
QProcess *myProcess = new QProcess();
myProcess->start("python.exe D:/QTCProjects/prueba/2_1.py" );
myProcess->waitForFinished(-1);
qDebug() << "myProcess:" << myProcess->readAll(); }
Для этого python требуется переменная с именем path, и я получаю эту переменную в qtcreator с помощью пути Qstring, как я могу передать python эту переменную с помощью Qprocess.
1 ответ
Решение
Если вы хотите передать аргументы скрипту через терминал, используется следующая структура:
python.exe /path/of/your_script.py arg1 arg2 ... argn
Затем, чтобы получить параметр, мы должны использовать sys.argv, который представляет собой список, в котором хранится следующее:
['/path/of/your_script.py', 'arg1', 'arg2', ..., 'argn']
Так что в вашем случае вы должны получить параметр через sys.argv[1]
:
2_1.py
from PIL import Image
import sys
def porcentaje(path):
im = Image.open(path, "r")
im.show()
width, height = im.size
type = im.mode
format = im.format
pixels=im.getdata()
n = len(pixels)
im=im.load()
nblack = 0
noblack=0
for pixel in pixels:
if pixel < 50:
nblack += 1
else:
noblack+=1
porcentajefinal=(nblack*100.0)/n
print(porcentajefinal)
return(porcentajefinal)
path = sys.argv[1]
porcentaje(path)
На стороне Qt python.exe является основной программой, а остальные параметры являются аргументами, поэтому ваш код должен иметь следующую структуру:
void MainWindow::on_pushButton_2_clicked()
{
QString path = QFileDialog::getOpenFileName(this, "All Files (*)");
qDebug()<<path;
if(!path.isEmpty()){
QDir dir("D:/QTCProjects/prueba");
QFileInfo info(dir, "2_1.py");
qDebug() << dir.exists() << info.exists();
QProcess process;
process.start("python.exe", QStringList()<< info.absoluteFilePath() << path);
process.waitForFinished(-1);
qDebug() << "myProcess:" << process.readAll();
}
}