在perl中运行python脚本
像这样的东西应该工作:
system("python", "/my/script.py") == 0 or die "Python script returned error $?";
如果您需要捕获的Python脚本的输出:
open(my $py, "|-", "python2 /my/script.py") or die "Cannot run Python script: $!";
while (<$py>) {
# do something with the input
}
close($py);
,如果你想为子进程提供输入这也适用同样。
好的答案,但你应该开始使用新的三个参数[open](http://perldoc.perl.org/functions/open.html)语法:'open(my $ py,“| - ”,“python2 /我的/ script.py“)或死亡......。你写的东西没什么问题,但是新的语法会导致更少的问题。 – 2011-12-28 18:11:57
@DavidW:感谢您的提示,我承认我不是Perl程序员,很少使用它。我编辑以反映您的建议更改。 – 2011-12-28 19:20:29
您还应该使用'system'的多参数形式来避免shell和相关的插值问题:'system('python','/my/script.py')== 0 ...'会工作。 – friedo 2011-12-28 20:55:48
这可能是简单的运行从shell脚本这两个脚本,并使用管道(假设你在Unix环境中是)如果你需要从一个程序的结果传递给其他
最好方法是使用IPC :: Open3在系统级执行python脚本。与使用system()相比,这会使代码更安全,更易读。
您可以轻松地执行系统命令,读取和写入他们与IPC :: Open3像这样:
use strict;
use IPC::Open3();
use IO::Handle(); #not required but good for portabilty
my $write_handle = IO::Handle->new();
my $read_handle = IO::Handle->new();
my $pid = IPC::Open3::open3($write_handle, $read_handle, '>&STDERR', $python_binary. ' ' . $python_file_path);
if(!$pid){ function_that_records_errors("Error"); }
#read multi-line data from process:
local $/;
my $read_data = readline($read_handle);
#write to python process
print $write_handle 'Something to write to python process';
waitpid($pid, 0); #wait for child process to close before continuing
这将创建一个派生进程来运行Python代码。这意味着如果python代码失败,您可以恢复并继续执行您的程序。
'my $ pid = ...'行忽略了'$(write | read)_handle的前面的声明' – 2011-12-28 19:45:53
谢谢Eric。编辑修复双重声明。 – 2011-12-29 22:39:32
对于简单的'系统'调用,您是否面临过于复杂的情况?另外,你的最后一句话似乎有一个错误。 Python脚本不会显示在其中。 – 2011-12-28 17:37:23
我会强烈考虑将一个移植到另一个语言。 – 2011-12-28 19:26:25