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

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

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

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

Сообщение Linus » 10.03.2017 12:38:10

tema писал(а):Значит Output


ну так все равно пусто

Если по-старинке
Код: Выделить всё
proc.CommandLine:='mediainfo --Inform="General;%Duration%" "'+fName+'"'; \0

то вывод есть, но он игнорирует "General;%Duration%", те неожиданное дает ВСЕ.

Код: Выделить всё
proc.Executable:='mediainfo';
  proc.Parameters.Add('--Inform="General;%Duration%"');
  proc.Parameters.Add('"'+fName+'"');\0

Пусто

Код: Выделить всё
proc.Executable:='mediainfo';
  proc.Parameters.Add('--Inform="General;%Duration%" "+fName+"');

Не получает имя файла, соответственно вывод ошибки в поток StErr
Linus
новенький
 
Сообщения: 47
Зарегистрирован: 11.01.2013 22:01:28

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

Сообщение tema » 10.03.2017 21:26:23

Linus писал(а):
tema писал(а):Значит Output

ну так все равно пусто

Почему ты упорно имя файла в кавычках передаёшь? Ни в одном моём примере нет двойных кавычек... А у меня все программы, которые я тут в коде пишу работают.
Проверил
Код: Выделить всё
proc.Executable:='mediainfo';
  proc.Parameters.Add('--Inform="General;%Duration%"');
  proc.Parameters.Add(fName);
  proc.Options:=[poWaitOnExit, poUsePipes, poNoConsole];
  proc.Execute;

Действительно выводится куча информации, вместо одного числа. Видимо, дело в двойных кавычках или в знаке ; или в знаке %. Что-то из этого.
Единственный способ это обойти - сделать так:
Создаёшь файл в каталоге программы. Называешь его mi.sh
Код: Выделить всё
#!/bin/sh
mediainfo --Inform="General;%Duration%" $1

И в программе вызываешь так:
Код: Выделить всё
  AProcess := TProcess.Create(nil);
  AProcess.Executable := 'sh';
  AProcess.Parameters.Add('mi.sh');
  AProcess.Parameters.Add(fname);
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes, poStderrToOutPut];
  AProcess.Execute;
  memo1.Lines.LoadFromStream(AProcess.Output);
  AProcess.Free;

Обрати внимание, что имя файла без кавычек и на параметр poStderrToOutPut
tema
постоялец
 
Сообщения: 338
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение SSerge » 11.03.2017 04:05:02

Linus писал(а):Не получает имя файла, соответственно вывод ошибки в поток StErr


Если набрано именно так как здесь, то и не получит имя файла. См. кавычки. +fname+ у вас часть строковой константы.
SSerge
энтузиаст
 
Сообщения: 795
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение Linus » 12.03.2017 01:40:10

SSerge писал(а):
Linus писал(а):Не получает имя файла, соответственно вывод ошибки в поток StErr


Если набрано именно так как здесь, то и не получит имя файла. См. кавычки. +fname+ у вас часть строковой константы.


Опечатался, когда набирал сюда

Работает вот так (без доп скриптов)
Код: Выделить всё
proc.Executable:='mediainfo';
  proc.Parameters.Add('--Inform=General;%Duration%');
  proc.Parameters.Add(fName); \0


Кавычки (одинарные/двойные) положены на случай если пользователю захочется пробелов в имя напихать.
Все же интересно, почему такая реакция на двойные кавычки? Это же паскаль, а не баш)

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

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

Сообщение alexey38 » 13.03.2017 12:15:38

Как я понял, вся проблема в том, что "proc.Execute;" не ожидает завершения консольной программы, а просто ее запускает. В момент считывания из потока (следующая строчка кода) консольная программа еще ничего не успела выдать, соответственно в писке строк все пусто. Дождитесь завершения консольной программы и тогда уже считывайте ее поток.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

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

Сообщение tema » 13.03.2017 22:38:24

alexey38 писал(а):Как я понял, вся проблема в том, что "proc.Execute;" не ожидает завершения консольной программы, а просто ее запускает. В момент считывания из потока (следующая строчка кода) консольная программа еще ничего не успела выдать, соответственно в писке строк все пусто. Дождитесь завершения консольной программы и тогда уже считывайте ее поток.

Это не так. За это отвечает параметр poWaitOnExit. "proc.Execute;" ожидает завершения консольной программы.
tema
постоялец
 
Сообщения: 338
Зарегистрирован: 24.03.2011 20:19:27

Пред.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google Adsense [Bot] и гости: 6

Рейтинг@Mail.ru