Есть приложение на Qt, включающее код такого вида :
QProcess proc;
...
proc.setProgramm("Python34\\python");
proc.setArguments(QStringList{"hello.py"});
proc.setProcessChannelMode(QProcess::MergedChannels);
connect(&proc, &QProcess::readyReadStandardOutput, []() {
QString output = QString(proc.readAllStandardOutput());
...
});
proc.start();
Но readyReadStandardOutput отлавливается только после завершения процесса. В моём случае - требуется проделать определённые действия до завершения (по наличию в выводе определённого текста).
Как это реализовать?
upd. Более подробный код имеет вид :
class Window: public QMainWindow {
...
private:
QVector
void MainWindow::createProcesses() {
for(int i=0;...) {
processes.append(new QProcess());
prepareProcess(&processes[processes.size()-1]);
}
}
void MainWindow::prepareProcess(QProcess* proc) {
proc->setProgramm("Python34\\python");
proc->setArguments(QStringList{"hello.py"});
proc->setProcessChannelMode(QProcess::MergedChannels);
connect(&proc, &QProcess::readyReadStandardOutput, []() {
QString output = QString(proc->readAllStandardOutput());
...
});
proc->start();
}
UPD. А в Qt ли вообще дело? Обнаружил следующее.
При запуске, например ping /t ya.ru результат выводится. Но, с применением например, следующего питоноскрипта - нет
import time
while True:
print("Hello")
time.sleep(1)
Ответ
Дело было не в приложении на Qt, а в буферизации вывода python-ом (https://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print)
Лечится запуском с опцией -u
Комментариев нет:
Отправить комментарий