Как получить вывод в процессе Perl, запущенном из Win32 :: Process? - PullRequest
1 голос
/ 23 августа 2009

У меня есть скрипт Perl, который запускает другой скрипт Perl в новой консоли через Win32 :: Process следующим образом:

Win32::Process::Create($ProcessObj,
                      "C:\\Perl\\bin\\perl.exe",
                      "$path_to_other_perl_script",
                      0,
                      NEW_CONSOLE,
                      ".");

$ProcessObj->Suspend();
$ProcessObj->Resume();
$ProcessObj->Wait(0);

Проблема в том, что в новой созданной консоли нет стандартного вывода. Если я не использую новый параметр консоли, сценарий будет работать в фоновом режиме.

Если я использую cmd.exe для запуска сценария Perl, я вижу вывод нормально, но теперь я не могу управлять дочерним сценарием Perl через Win32 :: Process.

У кого-нибудь есть решение, которое работает?

Ответы [ 2 ]

5 голосов
/ 24 августа 2009

Обновление: Исходя из ваших комментариев, у меня возникает ощущение, что ваши программы не являются примерами передового опыта в Linux или Windows. Тем не менее, я уверен, что, читая документацию по Win32::Process, вы заметили, что вы можете вызвать метод Kill в процессе, чтобы завершить его. Итак, я изменил приведенный ниже пример, чтобы сделать это.

Ваши шансы получить полезную помощь возрастают в геометрической прогрессии, если вы предоставляете реальный код. Вот аргументы Win32::Process::Create:

$iflags: флаг: наследовать дескрипторы вызывающих процессов или нет

Теперь я не уверен, пытаетесь ли вы захватить STDOUT второго процесса или если вы хотите, чтобы его вывод STDOUT отображался в той же консоли, что и родительский.

Если последнее, то следующие сценарии иллюстрируют один из способов сделать это:

parent.pl

#!/usr/bin/perl

use strict;
use warnings;

use Win32;
use Win32::Process;

$| = 1;

my $p;

print "Starting child process ... \n";

Win32::Process::Create(
    $p,
    'c:/opt/perl/bin/perl.exe',
    'perl hello.pl',
    1,
    NORMAL_PRIORITY_CLASS,
    '.',
) or die Win32::FormatMessage( Win32::GetLastError() );

print "Waiting three seconds before killing 'hello.pl'\n";

for (1 .. 3) {
    print;
    sleep 1;
}
$p->Kill(0)
    or die "Cannot kill '$p'";

hello.pl

#!/usr/bin/perl

$| = 1;

print "Hello World\n";
print "Sleeping 1000 seconds\n";

for (1 .. 1000) {
    sleep 1;
    print '.';
}

Выход:

Starting child process ...
Waiting three seconds before killing 'hello.pl'
1Hello World
Sleeping 1000 seconds
2.3.

Теперь, Я до сих пор не уверен, почему вы используете Win32::Process. Если нет конкретной причины привязать ваш скрипт к Win32, я бы рекомендовал использовать стандартные средства Perl. Например, прочитайте perldoc -f open и perldoc perlipc (см. Особенно Использование open для IPC ).

Объясните свой вопрос лучше, чтобы получить ответы, которые касаются вашей конкретной ситуации, а не общности.

0 голосов
/ 23 августа 2009

Использование -w до того, как $ filepath исправило это! Все еще нужно объяснение, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...