在perl中运行python脚本

问题描述:

我有两个脚本,一个python脚本和一个perl脚本。在perl中运行python脚本

如何让perl脚本运行python脚本然后自行运行?

+2

对于简单的'系统'调用,您是否面临过于复杂的情况?另外,你的最后一句话似乎有一个错误。 Python脚本不会显示在其中。 – 2011-12-28 17:37:23

+0

我会强烈考虑将一个移植到另一个语言。 – 2011-12-28 19:26:25

像这样的东西应该工作:

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

,如果你想为子进程提供输入这也适用同样。

+2

好的答案,但你应该开始使用新的三个参数[open](http://perldoc.perl.org/functions/open.html)语法:'open(my $ py,“| - ”,“python2 /我的/ script.py“)或死亡......。你写的东西没什么问题,但是新的语法会导致更少的问题。 – 2011-12-28 18:11:57

+0

@DavidW:感谢您的提示,我承认我不是Perl程序员,很少使用它。我编辑以反映您的建议更改。 – 2011-12-28 19:20:29

+0

您还应该使用'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代码失败,您可以恢复并继续执行您的程序。

+0

'my $ pid = ...'行忽略了'$(write | read)_handle的前面的声明' – 2011-12-28 19:45:53

+0

谢谢Eric。编辑修复双重声明。 – 2011-12-29 22:39:32