qprocess get shell как поведение

Я использую QT в приложении Windows (не знаю, имеет ли это значение) и хочу запустить какой-либо процесс из моего приложения, используя QProcess, (на самом деле через оболочку qtscript, которая использует QProcess)

Кажется, это работает, но у меня есть проблемы при использовании более сложных командных строк, таких как подключение программ с использованием каналов.

Если я запускаю процесс, используя следующие строки программы:

QProcess proc;
QString command = "grep \"false negatives\" test.txt | cut -f2";
proc.start(command);

Команда grep жалуется, что не может найти файл "2". поэтому очевидно, что командная строка не интерпретируется так, как я ожидаю.

если я префикс cmd /C к команде это работает хорошо, но это, очевидно, больше не зависит от ОС и может иметь некоторые дополнительные предостережения относительно параметра командной строки.

Есть ли Qt-подобный способ справиться с этим и заставить Qt использовать некоторый интерпретатор командной строки по умолчанию?

1 ответ

Решение

Есть ли Qt-подобный способ справиться с этим и заставить Qt использовать некоторый интерпретатор командной строки по умолчанию?

Ответ прост: нет интерпретатора командной строки Qt по умолчанию

QString command = "grep \"false negatives\" test.txt | cut -f2";

Эта команда не работает, потому что QProcess берет первый токен (grep) и использует его в качестве команды, затем передает каждый элемент, разделенный пробелом для этой команды. В этом случае команда pipe не является допустимым аргументом для grep и не обрезается, ни -f2.

Я прокомментировал, что ответ на этот вопрос, возможно, был похожим, так как он демонстрирует, как вы можете успешно использовать команду pipe с QProcess; обратите внимание, что аргументы заключены в кавычки.

Поскольку вы не хотите вызывать cmd или * nix-эквивалент, такой как bash, вы можете обработать это с помощью двух вызовов QProcess; первый для команды grep и второй для вырезки, передавая выходные данные из первого вызова QProcess.

Функция QProcess::setStandardOutputProcess делает это проще, позволяя вам создать канал непосредственно между двумя объектами QProcess.

Поэтому вы бы сделали что-то вроде этого:

QProcess proc1;
QProcess proc2;

proc1.setStandardOutputProcess(&process2);

QString cmd1("grep \"false negatives\" test.txt");
QString cmd2("cut -f2");

proc1.start(cmd1);
proc2.start(cmd2);
Другие вопросы по тегам