Я пытаюсь создать подпроцесс для графического интерфейса, который будет портировать терминал. Я хочу, чтобы данные, созданные этим терминалом (stdout и stderr), отображались в открывшемся окне, а также в установленном файле журнала. Когда я набираю команду непосредственно в оболочке, она работает как задумано, но когда она предоставляется QProcess в качестве команды запуска, она фактически ничего не записывает в файл.
Например: если у пользователя нет установленных двоичных файлов, он должен написать в bin.log, что команда не найдена. Я установил свое окружение для порожденного QProcess так же, как запущенный родительский процесс (чтобы он мог находить bash и все остальное), и установил рабочий каталог перед вызовом метода QProcess.start (). Я написал тестовый пример, который следует:
gnome-terminal --title 'Sub-Terminal' -e 'bash -c "foo [args to foo] |& tee foo.log"'
В Qt я делаю следующее:
QProcess *child = new QProcess(this);
QString cmd = "gnome-terminal --title 'Sub-Terminal' -e 'bash -c \"foo [args to foo] |& tee foo.log\"'";
child->setProcessEnvironment(<process environment I have created before>);
child->setWorkingDirectory(<current working dir>);
child->start(cmd);
...
Он генерирует терминал, но не записывает никаких данных в foo.log. Я также попробовал следующее:
QProcess *child = new QProcess(this);
QString prog = "gnome-terminal"QStringList args;
args << "-x" << "bash" << "foo" << "[foo's arguments]" << "|&" << "tee" << "foo.log";
// set the process env and working dir
child->start(prog, args);
У кого-нибудь есть совет, как решить эту проблему?
Я попытался перенаправить stdout и stderr, используя QProcess.setStandardErrorFile (foo.log) и QProcess.setStandardOutputFile (foo.log), но похоже, что это перенаправило бы stdout с самого терминала gnome (который не является ничем).
Вы должны предоставить всю команду для выполнения в терминале как один единственный аргумент QProcess
после "-e"
, а также команда, которая будет выполнена в bash как один единственный аргумент для bash:
args << "-e" << "bash -c 'foo [args to foo] |& tee foo.log'";
Это в основном выполняет
bash -c 'foo [args to foo] |& tee foo.log'
в терминале, который сам по себе выполняет
foo [args to foo] |& tee foo.log
в баш.
Вы правы, полагая, что читая результаты gnome-terminal
процесс не работает
Других решений пока нет …