Russian Qt Forum
Ноябрь 23, 2024, 22:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QProcess, пропадает stderr  (Прочитано 8958 раз)
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.

« Последнее редактирование: Октябрь 02, 2017, 14:58 от Bepec » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Октябрь 01, 2017, 20:56 »

А если так попробовать:
    connect(process, &QProcess::readyReadStandardError, this, &класс::readyReadStandardError);
?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #2 : Октябрь 02, 2017, 00:37 »

Эм...  Ну проверил, эффект тот же.
Стандартные ошибки он передаёт, вроде нет прав или неправильные аргументы. А вот именно ошибки системных утилит он куда то засобачивает.

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

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

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #3 : Октябрь 02, 2017, 10:39 »

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #4 : Октябрь 02, 2017, 13:23 »

Он стартует и просто не отсылает вывод.
Мало того объект создаётся динамически и вообще не уничтожается.

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

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

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

Пока что вижу выход в запуске терминала и общении с ним(одним процессом), посылая туда команды по очереди.
« Последнее редактирование: Октябрь 02, 2017, 13:25 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Октябрь 02, 2017, 13:28 »

Как я понял, консоль и интерпретатор командной строки в нём это две совершенно разные вещи (инопланетяне мля).
Это так везде, даже в венде. Улыбающийся
Командный интерпретатор cmd.exe тоже запускается в связке с терминалом.
Записан
Bepec
Гость
« Ответ #6 : Октябрь 02, 2017, 13:45 »

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

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

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

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Октябрь 02, 2017, 13:48 »

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

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

PS хотя это может быть просто косяк разрабов. Дескать ну его нахрен, писать ошибки системным утилитам, давайте мы им просто забьём коды ошибок, а описывать их будет интерпретатор.
Как всегда куча предположений, а проверить забыл. Улыбающийся
Найдите у себя на машине бинарник cd. Улыбающийся
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #8 : Октябрь 02, 2017, 14:03 »

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

и сигнал QProcess::errorOccurred не вылетает ?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #9 : Октябрь 02, 2017, 14:28 »

Он стартует и просто не отсылает вывод.
Нет, не стартует Подмигивающий Где-то я читал, что QProcess используется для запуска программ, для системных команд (типа cd) он непригоден. По-моему об этом Old и намекал, предлагая найти программу cd. Системную команду нужно запускать в bash скрипте.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #10 : Октябрь 02, 2017, 14:58 »

Нда, столько лет пользовался и не знал.
Ну т.е. остаётся только bash запускать и в нём работать. Иначе походу никак.

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

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

PS кто нить знает примочку, позволяющую создать все приёмные слоты класса на выбор?
« Последнее редактирование: Октябрь 02, 2017, 15:00 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Октябрь 02, 2017, 15:12 »

Предположения на то и предположения, что их надо проверять.
Так почему не проверяете?

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

PS кто нить знает примочку, позволяющую создать все приёмные слоты класса на выбор?
Вы сейчас отдохните и попробуйте задать вопрос еще раз. Улыбающийся
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #12 : Октябрь 02, 2017, 15:47 »

Ну т.е. остаётся только bash запускать и в нём работать. Иначе походу никак.

process.start("/bin/bash", QStringList() << "-c" << "command1;command2;...");
Записан
Bepec
Гость
« Ответ #13 : Октябрь 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 попробую. Хотя скорее всего не подойдёт, некоторые команды могут выдавать ошибки и продолжать выполнение команд не имеет смысла, а то и совсем фатально.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Октябрь 02, 2017, 17:25 »

to Old:
Цитировать
Error вылетает, процесс не стартует.
Так у вас bash не стартует?

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

А лучше взять на работу человека разбирающегося в этом.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.065 секунд. Запросов: 22.