从perl运行python脚本,带有stdin参数并保存stdout输出

时间:2018-01-08 16:02:27

标签: python perl

我的perl脚本位于路径:

a/perl/perlScript.pl

我的python脚本位于路径:

a/python/pythonScript.py

pythonScript.py从stdin获取一个参数,并将结果返回给stdout。从perlScript.pl开始,我想使用参数pythonScript.py运行hi到stdin,并将结果保存在某个变量中。这就是我的尝试:

my $ret = `../python/pythonScript.py < hi`;                   

但我收到以下错误:

The system cannot find the path specified.            

你能解释一下无法找到的路径吗?

4 个答案:

答案 0 :(得分:2)

qx operator(反引号)启动一个shell(sh),其中prog < input语法expects a file名为input,它将从中读取行和Feed他们参加了prog计划。但是您希望python脚本在其STDIN上接收字符串hi,而不是名为hi的文件的行。

一种方法是直接这样做,my $ret = qx(echo "hi" | python_script)

但我建议考虑使用模块。以下是IPC::Run3

的简单示例
use warnings;
use strict;
use feature 'say';

use IPC::Run3;

my @cmd = ('program', 'arg1', 'arg2');

my $in = "hi";

run3 \@cmd, \$in, \my $out;

say "script's stdout: $out";

program是脚本的路径,如果它是可执行的,或者python script.py。这将由system运行,因此一旦完成就会获得输出,这与问题中的尝试一致。请参阅模块操作的文档。

此模块非常简单,而 满足使用systemqxopen3 [...] 的99%的需求。要获得更多权力和控制权,请参阅IPC::Run

答案 1 :(得分:1)

您收到此错误是因为您正在使用shell重定向而不是仅仅传递参数

>> A.' - A
ans =

   0  -1  -2  -3  -4
   1   0  -1  -2  -3
   2   1   0  -1  -2
   3   2   1   0  -1
   4   3   2   1   0

告诉shell从当前目录中名为hi的文件中读取输入,而不是将其用作参数。你的意思是

../python/pythonScript.py < hi

使用hi参数正确执行python脚本,并将结果返回给变量my $ret = `../python/pythonScript.py hi`;

答案 2 :(得分:1)

其他一些答案假设hi必须作为命令行参数传递给Python脚本,但提问者说它来自stdin。

因此:

my $ret = `echo "hi" | ../python/pythonScript.py`;

答案 3 :(得分:0)

要启动外部脚本,您可以

system "python ../python/pythonScript.py hi";

然后在你的python脚本中

import sys
def yourFct(a, b):
    ...

if __name__== "__main__":
    yourFct(sys.argv[1])

你可以在python部分here

上获得更多信息