Perl - ошибка захвата системы () - PullRequest
0 голосов
/ 31 октября 2010

Я конвертирую некоторые изображения jpg в png с imagemagick и в perl имею следующее:

system("convert $jpg $png");
print "$?\n";

Есть ли способ захвата фактических ошибок из imagemagick (а не просто, был ли он выполнен или нет)как и в приведенном выше коде)?

примечание: я использую imagemagick исключительно в качестве примера ... это более общий вопрос о том, как фиксировать ошибки из любой программы, выполняемой system ().

спасибо!

Ответы [ 3 ]

3 голосов
/ 31 октября 2010

извлечено из справочной страницы IPC :: Run :

use IPC::Run qw{run timeout};
my ($in, $out, $err);

run [convert => ($jpg, $png)], \$in, \$out, \$err, timeout( 10 ) or die "$err (error $?)"

Вы также можете использовать PerlMagick , например:

use Image::Magick;

my $p = new Image::Magick;
$p->Read($jpg);
$p->Write($png);
0 голосов
/ 10 сентября 2013

Как отмечает MkV, IPC :: Run - лучшее решение. Используйте это, если возможно.

Если вы находитесь в неработающей среде, которая не позволяет устанавливать модули CPAN, непростой обходной путь - это взломать трубу с перенаправлением оболочки:

open my $fh, '-|', "convert \Q$jpg\E \Q$png\E 2>&1"
    or die "Can't launch 'convert'";

... а затем прочитайте и проанализируйте $fh в зависимости от ситуации. \Q ... \E экранирует имена файлов и необходим во избежание проблем с именами файлов, которые содержат пробелы или другие метасимволы оболочки. Вы также должны использовать их с system(), чтобы избежать тех же проблем.

0 голосов
/ 31 октября 2010

Для лучших результатов смотрите: Как-может-я снимаемый STDERR-из-ан-внешней-команды

Также прочитайте предыдущий:

Почему я не могу получить вывод команда с системой ()?

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