【发布时间】:2017-04-09 01:45:46
【问题描述】:
我有一个 Perl 脚本来调用另一个程序。其中一个部分如下所示:
open(AMPL,"|ampl");
select(AMPL);
printf "option solver cplex;\n";
printf "var x1;\n"
printf "var x2;\n"
printf "minimize z: 3*x1 + 2*x2;\n";
printf "another_command;\n";
printf "data $ARGV[0];\n";
# More printfs
close(AMPL);
如果传递给ampl(即AMPL)的指令不正确,此代码会静默失败。是否可以将失败打印到 STDERR 或以其他方式捕获以中止脚本?
编辑:澄清一下,这段代码进入了与 AMPL 解释器的交互会话:
$ ampl
ampl: option solver cplex;
>>> var x1;
>>> var x2;
>>> minimize z: 3*x1 + 2*x2;
>>> another_command;
>>> data foo;
【问题讨论】:
-
放大器的“不正确”?那就是ampl的业务。您正在为外部程序提供数据。它可以为所欲为。它可能会以特定代码退出,您可以捕捉到它,但如果没有,调用代码可以做的事情并不多。您可以控制放大器源吗?
-
ampl的退出码在出错时将非零;不过,我想如果我将内容输入ampl的 STDIN,我可以从它的 STDERR(或 STDOUT)中读取内容。 -
见How to read to and write from a pipe in Perl(他们询问了获取标准输出,但获取标准错误是相似的)。
-
既然你提到了
STDERR,我认为ampl不会在错误时写入它,否则它会在终端上结束。那是个问题。相反,如果您想在调用程序中捕获它(而不是让它去任何它想去的地方),那么有很多关于它的帖子(从外部程序重定向 X),例如链接的 ThisSuitIsBlackNot。 -
另外,还有模块......例如见IPC::Run3(链接的帖子显示
IPC::Open3)
标签: perl