Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bepec от Октябрь 01, 2017, 18:40



Название: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 01, 2017, 18:40
Приветствую заглянувших.
Есть - QProcess, создающийся динамически, подцепленный к слотам чтения.
Код:
 QProcess *process = new QProcess;
    connect(process, SIGNAL(readyReadStandardError()), SLOT(readyReadStandardError()));
    connect(process, SIGNAL(readyReadStandardOutput()), SLOT(readyReadStandardOutput()));

В половине случаев данные приходят.
Т.е. к примеру команды ls, cp выдают и ошибки и ожидаемые данные. А вот при попытке получить заведомую ошибку, вроде "cd ывфыв", когда он должен выдать вроде "bash: cd: ывфыв: Нет такого файла или каталога", в ошибках пустота.

Пока у меня только один вариант - это сообщение об ошибки генерится отдельно от команды cd, Но тогда как его получить?

Решение: запускать bash (интерпретатор командной строки) и работать только в нём, подсовывая команды по очереди.  
Причина: cd и множество прочих системных команд - это команды интерпретатора командной строки bash.



Название: Re: QProcess, пропадает stderr
Отправлено: sergek от Октябрь 01, 2017, 20:56
А если так попробовать:
    connect(process, &QProcess::readyReadStandardError, this, &класс::readyReadStandardError);
?


Название: Re: QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 00:37
Эм...  Ну проверил, эффект тот же.
Стандартные ошибки он передаёт, вроде нет прав или неправильные аргументы. А вот именно ошибки системных утилит он куда то засобачивает.

Соединение сигнал-слотовое есть 100%, на оба слота. При Merge output тоже всё проходит, кроме таких ошибок.

Как я уже упомянул, мне кажется что эти "ошибки" выдаёт терминал(не утилита), в зависимости от кода ошибки системной утилиты. Но я недостаточно хорошо знаю linux, чтобы быть уверенным в этом.


Название: Re: QProcess, пропадает stderr
Отправлено: sergek от Октябрь 02, 2017, 10:39
А попробуйте запустить такую команду: "ls ывфыв", и вы увидите то, что ожидали: "error:ls: невозможно получить доступ к ывфыв: Нет такого файла или каталога".
А если еще после
Код:
process->start("cd", (QStringList() << "ывфыв")) 
поставить
Код:
if(!process->waitForStarted())
, то увидите, что процесс просто не стартует.


Название: Re: QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 13:23
Он стартует и просто не отсылает вывод.
Мало того объект создаётся динамически и вообще не уничтожается.

ls ывфыв
Код:
ls: невозможно получить доступ к 'ывфыв': Нет такого файла или каталога

cd ывфыв
Код:
- Не срабатывает ни один из слотов, кроме finished, данные не поступают, сигналов readyReadStandart* не срабатывают.

Немного поискал и выяснил что сообщение
Код:
bash: cd: ывфыв: Нет такого файла или каталога
отсылает именно bash, т.е. интерпретатор командной строки, который просто при запуске процесса cd / ls и прочих, просто не запускается. Что довольно странно, но нормально для линукса. Как я понял, консоль и интерпретатор командной строки в нём это две совершенно разные вещи (инопланетяне мля).

Пока что вижу выход в запуске терминала и общении с ним(одним процессом), посылая туда команды по очереди.


Название: Re: QProcess, пропадает stderr
Отправлено: Old от Октябрь 02, 2017, 13:28
Как я понял, консоль и интерпретатор командной строки в нём это две совершенно разные вещи (инопланетяне мля).
Это так везде, даже в венде. :)
Командный интерпретатор cmd.exe тоже запускается в связке с терминалом.


Название: Re: QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 13:45
Не, там нет такого как "в терминале есть ошибка", а при просто запуске процесса ошибка пропадает нафиг в никуда Оо...
По сути я так понимаю я в линуксе командой cd ывфыф я запускаю процесс на выполнение. Сам процесс не выдаёт никаких ошибок от слова вообще. И это системная, мать её, утилита.

Такой ситуации в винде просто нет. Там каждое приложение имеет свои ошибки и там нет разницы, запускаешь ты в cmd или просто процесс. Что ставит очередной плюс винде по юзабельности.

PS хотя это может быть просто косяк разрабов. Дескать ну его нахрен, писать ошибки системным утилитам, давайте мы им просто забьём коды ошибок, а описывать их будет интерпретатор.


Название: Re: QProcess, пропадает stderr
Отправлено: Old от Октябрь 02, 2017, 13:48
Не, там нет такого как "в терминале есть ошибка", а при просто запуске процесса ошибка пропадает нафиг в никуда Оо...
По сути я так понимаю я в линуксе командой cd ывфыф я запускаю процесс на выполнение. Сам процесс не выдаёт никаких ошибок от слова вообще. И это системная, мать её, утилита.

Такой ситуации в винде просто нет. Там каждое приложение имеет свои ошибки и там нет разницы, запускаешь ты в cmd или просто процесс. Что ставит очередной плюс винде по юзабельности.

PS хотя это может быть просто косяк разрабов. Дескать ну его нахрен, писать ошибки системным утилитам, давайте мы им просто забьём коды ошибок, а описывать их будет интерпретатор.
Как всегда куча предположений, а проверить забыл. :)
Найдите у себя на машине бинарник cd. :)


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: qate от Октябрь 02, 2017, 14:03
А вот при попытке получить заведомую ошибку, вроде "cd ывфыв", когда он должен выдать вроде "bash: cd: ывфыв: Нет такого файла или каталога", в ошибках пустота.

и сигнал QProcess::errorOccurred не вылетает ?


Название: Re: QProcess, пропадает stderr
Отправлено: sergek от Октябрь 02, 2017, 14:28
Он стартует и просто не отсылает вывод.
Нет, не стартует ;) Где-то я читал, что QProcess используется для запуска программ, для системных команд (типа cd) он непригоден. По-моему об этом Old и намекал, предлагая найти программу cd. Системную команду нужно запускать в bash скрипте.


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 14:58
Нда, столько лет пользовался и не знал.
Ну т.е. остаётся только bash запускать и в нём работать. Иначе походу никак.

Предположения на то и предположения, что их надо проверять.

Error вылетает, процесс не стартует.

PS кто нить знает примочку, позволяющую создать все приёмные слоты класса на выбор?


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Old от Октябрь 02, 2017, 15:12
Предположения на то и предположения, что их надо проверять.
Так почему не проверяете?

Error вылетает, процесс не стартует.
Как вы там важно пишете... Код где?

PS кто нить знает примочку, позволяющую создать все приёмные слоты класса на выбор?
Вы сейчас отдохните и попробуйте задать вопрос еще раз. :)


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: qate от Октябрь 02, 2017, 15:47
Ну т.е. остаётся только bash запускать и в нём работать. Иначе походу никак.

process.start("/bin/bash", QStringList() << "-c" << "command1;command2;...");


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 17:19
to Old:
Цитировать
Error вылетает, процесс не стартует.
Это к вопросам sergek и qate.

Не проверял, ибо запарился.

Отдохнул. вопрос не изменился - есть ли утилита позволяющая создать приёмные сигнал слоты, на конкретный QObject. Т.е. в случае с QProcess это
Цитировать
void   error(QProcess::ProcessError error)
void   finished(int exitCode, QProcess::ExitStatus exitStatus)
void   readyReadStandardError()
void   readyReadStandardOutput()
void   started()
void   stateChanged(QProcess::ProcessState newState)
.

to qate попробую. Хотя скорее всего не подойдёт, некоторые команды могут выдавать ошибки и продолжать выполнение команд не имеет смысла, а то и совсем фатально.


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Old от Октябрь 02, 2017, 17:25
to Old:
Цитировать
Error вылетает, процесс не стартует.
Так у вас bash не стартует?

to qate попробую. Хотя скорее всего не подойдёт, некоторые команды могут выдавать ошибки и продолжать выполнение команд не имеет смысла, а то и совсем фатально.
Тогда нужно ";" между командами заменить на "&&".

А лучше взять на работу человека разбирающегося в этом.


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 18:14
Угу.
Прям при первом же случае, когда я что-то не понимаю в своей работе, я буду нанимать разбирающегося человека :D


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Old от Октябрь 02, 2017, 18:23
Угу.
Прям при первом же случае, когда я что-то не понимаю в своей работе, я буду нанимать разбирающегося человека :D
Это совет был скорее не вам, а вашему работадателю.


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 18:29
Угу. Вы были бы прекрасным чиновником.


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: sergek от Октябрь 02, 2017, 19:08
Создаем текстовый файл с именем scr, устанавливаем ему права на выполнение. Содержимое скрипта:
Код:
#!/bin/bash
cd ывфыв
Запускаем процесс
Код:
process->start("./scr");
Вывод в stderr
Код:
./scr: строка 2: cd: ывфыв: Нет такого файла или каталога


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 19:11
Та это и так понятно, но спасибо за старание :)


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: qate от Октябрь 02, 2017, 20:01
Error вылетает, процесс не стартует.

верно, а значение ошибки говорит о невозможности запуска "cd" т.к. это не программа, а встроенная функция командного интерпретатора


Название: Re: [РЕШЕНО] QProcess, пропадает stderr
Отправлено: Bepec от Октябрь 02, 2017, 21:57
Это уже дошло до мине.
А ошибка содержит сообщение что файл не найден.