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

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

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

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

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

Сообщение 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 всегда пуст, хотя внешняя программа запускается!
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

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;

А главное проверить в самой консоли если ли какой-то выхлоп, а то может там и ответа-то нет никакого, а просто молчаливое выполнение.
Linus
новенький
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Сообщение Linus »

В том то и дело, выхлоп есть. Экспериментировал с тем же кодом: так же пусто и на mediaifo... а вот на evtest, ls, uname - в потоке уже есть данные.... что не так с нужными мне утилитами?
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

А если...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

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

Так точно пробовал?

Код: Выделить всё

AProcess.Executable := 'ffmpeg';
  AProcess.Parameters.Add('-i');
  AProcess.Parameters.Add(fname);

Раздельно передать -i и имя файла
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

tema это ещё один повод поиска бага. Более реального. Порой выхлопа нет. Как в винде, так и в лине.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

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;
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Stderr - хм...
а этот выхлоп, как я понял, в потоке ошибок
а слона то и не заметно было. Только: какого лешего выхлоп в ошибки лезет? В принципе - это лирика.
daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Сообщение daesher »

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

А, может, у них вывод не на StdOut, а на StdErr?
Linus
новенький
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Сообщение Linus »

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);  //пусто!!!


Я в догадках, что не так
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Если не хочешь делать как у меня в примере два мемо, чтобы получать данные 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. Поэтому и пусто.
Linus
новенький
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Сообщение Linus »

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


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

сейчас попробую с memo
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Скинь сюда что кажет консоль с такими командами:

Код: Выделить всё

$ mediainfo --Inform="General;%Duration%" твой-файл 1>t1.txt 2>t2.txt
$ cat t1.txt
$ cat t2.txt
Linus
новенький
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

Сообщение Linus »

tema писал(а):Скинь сюда что кажет консоль с такими командами:

Код: Выделить всё

$ mediainfo --Inform="General;%Duration%" твой-файл 1>t1.txt 2>t2.txt
$ cat t1.txt
$ cat t2.txt



Решили пойти от противного) момент..
t1 содержит корректный вывод
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

Значит Output
Ответить