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

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

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

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

Сообщение Linus »

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
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

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
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


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

Сообщение Linus »

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


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


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

Работает вот так (без доп скриптов)

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

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


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

Ага.. интересно получается, попробовал с пробелами.. работает.. Кажется производится скрытое экранирование.
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

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

Сообщение tema »

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

Это не так. За это отвечает параметр poWaitOnExit. "proc.Execute;" ожидает завершения консольной программы.
Ответить