Perl - 捕获系统()错误

时间:2010-10-31 15:19:55

标签: perl

我正在将一些jpg图像转换为png w / imagemagick&在perl中有以下内容:

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

有没有办法从imagemagick中捕获实际的错误(而不仅仅是它是否像上面代码中那样成功执行了?)

注意:我仅使用imagemagick作为示例....这是关于如何从system()执行的任何程序中捕获错误的更一般的问题。

THX!

3 个答案:

答案 0 :(得分:3)

来自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);

答案 1 :(得分:0)

为获得最佳效果,请参阅: How-can-I-capture-STDERR-from-an-external-command?

另请阅读上一篇:

  

为什么我不能得到a的输出   用system()命令?

答案 2 :(得分:0)

如MkV所述,IPC :: Run是最佳解决方案。如果可能,请使用它。

如果您处于一个不允许安装CPAN模块的破碎环境中,那么一个棘手的解决方法是使用shell重定向进行管道攻击:

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

...然后根据需要阅读并解析$fh\Q ... \E转义文件名,并且必须避免包含空格或其他shell元字符的文件名出现问题。您还应该将它们与system()一起使用以避免出现同样的问题。