не могу поймать вывод консольной программы (Линукс)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

не могу поймать вывод консольной программы (Линукс)

Сообщение Linus » 08.03.2017 21:47:06

Собственно вопрос об странности одной, не могу поймать вывод консольной программы

Код: Выделить всё
result:=false;
  proc:=Tprocess.Create(nil);
  proc.Executable:='ffmpeg';
  proc.Parameters.Add('-i "'+fname+'"');
  proc.Options:=[poWaitOnExit, poUsePipes, poNoConsole];
  proc.Execute;

  buf:=TstringList.Create;
  buf.LoadFromStream(proc.Output);

  NeedEl[0]:=true;
  NeedEl[1]:=true;
  len:=0;
  codec:=inttostr(buf.Count);\0  //всегда 0, т.е. поток пуст!?


Проблема в том, что TStringList всегда пуст, хотя внешняя программа запускается!
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: Работа с консолью(Линукс)

Сообщение tema » 08.03.2017 23:02:16

Linus писал(а):Собственно вопрос об странности одной, не могу поймать вывод консольной программы

Код: Выделить всё
result:=false;
  proc:=Tprocess.Create(nil);
  proc.Executable:='ffmpeg';
  proc.Parameters.Add('-i "'+fname+'"');
  proc.Options:=[poWaitOnExit, poUsePipes, poNoConsole];
  proc.Execute;

  buf:=TstringList.Create;
  buf.LoadFromStream(proc.Output);

  NeedEl[0]:=true;
  NeedEl[1]:=true;
  len:=0;
  codec:=inttostr(buf.Count);\0  //всегда 0, т.е. поток пуст!?


Проблема в том, что TStringList всегда пуст, хотя внешняя программа запускается!

Можно попробовать сначала в Memo, чтобы посмотреть, что вываливается.
Ну и эту строчку немного по-другому:
Код: Выделить всё
  AProcess := TProcess.Create(nil);
  AProcess.Executable := 'ffmpeg';
  AProcess.Parameters.Add('-i');
  AProcess.Parameters.Add(fname);
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  memo1.Lines.LoadFromStream(AProcess.Output);
  AProcess.Free;

А главное проверить в самой консоли если ли какой-то выхлоп, а то может там и ответа-то нет никакого, а просто молчаливое выполнение.
tema
постоялец
 
Сообщения: 302
Зарегистрирован: 24.03.2011 20:19:27

Re: Работа с консолью(Линукс)

Сообщение Linus » 09.03.2017 00:26:20

В том то и дело, выхлоп есть. Экспериментировал с тем же кодом: так же пусто и на mediaifo... а вот на evtest, ls, uname - в потоке уже есть данные.... что не так с нужными мне утилитами?
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: Работа с консолью(Линукс)

Сообщение pupsik » 09.03.2017 01:58:36

А если...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
pupsik
энтузиаст
 
Сообщения: 879
Зарегистрирован: 20.08.2014 16:20:13

Re: Работа с консолью(Линукс)

Сообщение tema » 09.03.2017 02:07:32

Linus писал(а):В том то и дело, выхлоп есть. Экспериментировал с тем же кодом: так же пусто и на mediaifo... а вот на evtest, ls, uname - в потоке уже есть данные.... что не так с нужными мне утилитами?

Так точно пробовал?
Код: Выделить всё
AProcess.Executable := 'ffmpeg';
  AProcess.Parameters.Add('-i');
  AProcess.Parameters.Add(fname);

Раздельно передать -i и имя файла
tema
постоялец
 
Сообщения: 302
Зарегистрирован: 24.03.2011 20:19:27

Re: Работа с консолью(Линукс)

Сообщение pupsik » 09.03.2017 02:15:55

tema это ещё один повод поиска бага. Более реального. Порой выхлопа нет. Как в винде, так и в лине.
pupsik
энтузиаст
 
Сообщения: 879
Зарегистрирован: 20.08.2014 16:20:13

Re: Работа с консолью(Линукс)

Сообщение tema » 09.03.2017 04:06:15

Linus писал(а):В том то и дело, выхлоп есть. Экспериментировал с тем же кодом: так же пусто и на mediaifo... а вот на evtest, ls, uname - в потоке уже есть данные.... что не так с нужными мне утилитами?

Проблему подтверждаю. Правда у меня не ffmpeg, а avconv, но там та же проблема присутствует.
Такая команда:
Код: Выделить всё
avconv -i aaa.png

выхлоп в консоли даёт, а в мемо пусто.
На mediainfo у меня всё ок. Выдало в мемо всю информацию о файле как надо. Делал так:
Код: Выделить всё
  AProcess := TProcess.Create(nil);
  AProcess.Executable := 'mediainfo';
  AProcess.Parameters.Add('-f');
  AProcess.Parameters.Add(fname);
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  memo1.Lines.LoadFromStream(AProcess.Output);
  AProcess.Free;


Добавлено спустя 6 минут 24 секунды:
Дошло. AProcess читает стандартный поток, а этот выхлоп, как я понял, в потоке ошибок, т.е., если ты выполнишь эту команду в терминале и сделаешь так:
Код: Выделить всё
avconv -i aaa.png > t.txt

то файл t.txt будет пустой.
Только так или так можно получить инфу в файл:
avconv -i aaa.png 2> t.txt
avconv -i aaa.png &> t.txt


Вот так всё работает:
Код: Выделить всё
  AProcess := TProcess.Create(nil);
  AProcess.Executable := 'avconv';
  AProcess.Parameters.Add('-i');
  AProcess.Parameters.Add(fname);
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  memo1.Lines.LoadFromStream(AProcess.Output);
  memo2.Lines.LoadFromStream(AProcess.Stderr);
  AProcess.Free;
tema
постоялец
 
Сообщения: 302
Зарегистрирован: 24.03.2011 20:19:27

Re: Работа с консолью(Линукс)

Сообщение pupsik » 09.03.2017 11:27:58

Stderr - хм...
а этот выхлоп, как я понял, в потоке ошибок
а слона то и не заметно было. Только: какого лешего выхлоп в ошибки лезет? В принципе - это лирика.
pupsik
энтузиаст
 
Сообщения: 879
Зарегистрирован: 20.08.2014 16:20:13

Re: Работа с консолью(Линукс)

Сообщение daesher » 09.03.2017 12:01:39

Linus писал(а):В том то и дело, выхлоп есть. Экспериментировал с тем же кодом: так же пусто и на mediaifo... а вот на evtest, ls, uname - в потоке уже есть данные.... что не так с нужными мне утилитами?

А, может, у них вывод не на StdOut, а на StdErr?
daesher
постоялец
 
Сообщения: 172
Зарегистрирован: 09.03.2010 22:17:14

Re: Работа с консолью(Линукс)

Сообщение Linus » 09.03.2017 14:25:45

tema писал(а):
Linus писал(а):В том то и дело, выхлоп есть. Экспериментировал с тем же кодом: так же пусто и на mediaifo... а вот на evtest, ls, uname - в потоке уже есть данные.... что не так с нужными мне утилитами?

Так точно пробовал?
Код: Выделить всё
AProcess.Executable := 'ffmpeg';
  AProcess.Parameters.Add('-i');
  AProcess.Parameters.Add(fname);

Раздельно передать -i и имя файла



ПУСТО.

Добавлено спустя 1 минуту 31 секунду:
daesher писал(а):
Linus писал(а):В том то и дело, выхлоп есть. Экспериментировал с тем же кодом: так же пусто и на mediaifo... а вот на evtest, ls, uname - в потоке уже есть данные.... что не так с нужными мне утилитами?

А, может, у них вывод не на StdOut, а на StdErr?


И кто и зачем так пишет?
Код: Выделить всё

proc.Executable:='mediainfo';
  proc.Parameters.Add('--Inform="General;%Duration%"');
  proc.Parameters.Add('"'+fName+'"');

  proc.Options:=[poWaitOnExit, poUsePipes, poNoConsole];
  proc.Execute;

  buf:=TstringList.Create;
  buf.LoadFromStream(proc.Stderr);  //пусто!!!


Я в догадках, что не так
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: Работа с консолью(Линукс)

Сообщение tema » 09.03.2017 15:36:37

Если не хочешь делать как у меня в примере два мемо, чтобы получать данные out и err раздельно, то можно так:
Код: Выделить всё
  proc:=Tprocess.Create(nil);
  proc.Executable:='ffmpeg';
  proc.Parameters.Add('-i');
  proc.Parameters.Add(fname);
  proc.Options := proc.Options + [poWaitOnExit, poUsePipes, poStderrToOutPut];
  proc.Execute;

  buf:=TstringList.Create;
  buf.LoadFromStream(proc.Output);


Добавлено спустя 8 минут 44 секунды:
Linus писал(а):
Код: Выделить всё
proc.Executable:='mediainfo';
  proc.Parameters.Add('--Inform="General;%Duration%"');
  proc.Parameters.Add('"'+fName+'"');

  proc.Options:=[poWaitOnExit, poUsePipes, poNoConsole];
  proc.Execute;

  buf:=TstringList.Create;
  buf.LoadFromStream(proc.Stderr);  //пусто!!!


Я в догадках, что не так

Ну mediainfo пишет не в Stderr, а в Output. Это ffmpeg и avconv пишет в Stderr. Поэтому и пусто.
tema
постоялец
 
Сообщения: 302
Зарегистрирован: 24.03.2011 20:19:27

Re: Работа с консолью(Линукс)

Сообщение Linus » 09.03.2017 20:18:34

Я в догадках, что не так
Ну mediainfo пишет не в Stderr, а в Output. Это ffmpeg и avconv пишет в Stderr. Поэтому и пусто.


и там и там шиш... вот что странно

сейчас попробую с memo
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: не могу поймать вывод консольной программы (Линукс)

Сообщение tema » 09.03.2017 23:46:06

Скинь сюда что кажет консоль с такими командами:
Код: Выделить всё
$ mediainfo --Inform="General;%Duration%" твой-файл 1>t1.txt 2>t2.txt
$ cat t1.txt
$ cat t2.txt
tema
постоялец
 
Сообщения: 302
Зарегистрирован: 24.03.2011 20:19:27

Re: не могу поймать вывод консольной программы (Линукс)

Сообщение Linus » 10.03.2017 00:03:03

tema писал(а):Скинь сюда что кажет консоль с такими командами:
Код: Выделить всё
$ mediainfo --Inform="General;%Duration%" твой-файл 1>t1.txt 2>t2.txt
$ cat t1.txt
$ cat t2.txt



Решили пойти от противного) момент..
t1 содержит корректный вывод
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Re: не могу поймать вывод консольной программы (Линукс)

Сообщение tema » 10.03.2017 00:31:54

Значит Output
tema
постоялец
 
Сообщения: 302
Зарегистрирован: 24.03.2011 20:19:27

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot], Yandex [Bot] и гости: 5

Рейтинг@Mail.ru