2015-06-30 4 views
0

В моем коде Perl я использую системную команду для запуска скрипта. Я использую Gtk2 :: Perl и Glade для создания пользовательского интерфейса. Мне нужен вывод команды для захвата не только на консоль (что делает Capture::Tiny), но и TextView в моем графическом интерфейсе.Динамический захват вывода системной команды в Perl

system("command"); 

$stdout = tee{       #This captures the output to the console 
system("command"); 
}; 

$textbuffer->set_text($stdout);  #This does set the TextView with the captured output, but *after* the capture is over. 

Любая помощь была бы принята с благодарностью.

+0

Так в чем проблема, с которой вы сталкиваетесь? – Sobrique

+0

Мне нужен вывод 'system' для захвата в TextView одновременно с его захватом на консоли. Это не происходит. –

ответ

3

Если вы пытаетесь «захват» на выходе system вызова, то я хотел бы предложить наилучший подход заключается в использовании open и открыть дескриптор к процессу:

my $pid = open (my $process_output, '-|', "command"); 

Тогда вы можете прочитать $process_output точно так же, как и дескриптор файла (помните, что он заблокируется, если нет ожидающего ввода-вывода).

while (<$process_output>) { 
    print; 
} 

close ($process_output); 

Вы можете «фальшивый» поведение system через waitpid системного вызова:

waitpid ($pid, 0); 

Это будет «блок» основной программы, пока системный вызов не завершен.

+0

Спасибо. Я полагаю, что использование 'open' - мой лучший выбор. Сделай это! –

+0

Это очень полезно, но на самом деле не решает мою проблему, на самом деле - динамический вывод не * динамически * обновляется в TextView по мере его создания. Печально. –

+0

Я думаю, что использование резьбы - единственное решение. Мысли? –

2

То, что вы хотите сделать, невозможно с помощью system(). System() вилки нового процесса и ждет его завершения. Затем ваша программа продолжается (см. manual). Вы можете запустить подпроцесс (выполнив все, что было сделано для system()) и прочитайте этот раздел «stdout» подпроцесса. Например, вы можете получить вдохновение здесь: redirecting stdin/stdout from exec'ed process to pipe in Perl

+0

А, я вижу. Я ожидал, что смогу что-то сделать с помощью system(), поскольку этот захват - единственное, чего не хватает. Большое спасибо! –

Смежные вопросы