简体   繁体   English

在perl中运行python脚本

[英]Run a python script in perl

I have two scripts, a python script and a perl script. 我有两个脚本,一个python脚本和一个perl脚本。

How can I make the perl script run the python script and then runs itself? 如何使perl脚本运行python脚本然后自行运行?

Something like this should work: 这样的事情应该有效:

system("python", "/my/script.py") == 0 or die "Python script returned error $?";

If you need to capture the output of the Python script: 如果需要捕获Python脚本的输出:

open(my $py, "|-", "python2 /my/script.py") or die "Cannot run Python script: $!";
while (<$py>) {
  # do something with the input
}
close($py);

This also works similarly if you want to provide input for the subprocess. 如果要为子进程提供输入,这也可以类似地工作。

The best way is to execute the python script at the system level using IPC::Open3. 最好的方法是使用IPC :: Open3在系统级执行python脚本。 This will keep things safer and more readable in your code than using system(); 与使用system()相比,这将使代码更安全,更易读;

You can easily execute system commands, read and write to them with IPC::Open3 like so: 您可以使用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

This will create a forked process to run the python code. 这将创建一个运行python代码的分叉进程。 This means that should the python code fail, you can recover and continue with your program. 这意味着如果python代码失败,您可以恢复并继续您的程序。

如果你需要将结果从一个程序传递给另一个程序,那么从shell脚本运行这两个脚本并使用管道(假设你在Unix环境中)可能更简单

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM