繁体   English   中英

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

[英]Running python script from perl, with argument to stdin and saving stdout output

我的perl脚本位于路径:

a/perl/perlScript.pl

我的python脚本位于路径:

a/python/pythonScript.py

pythonScript.py从stdin获取一个参数,并将结果返回到stdout。 perlScript.pl ,我想将pythonScript.pyhi一起运行,并将结果保存到某个变量中。 那就是我尝试过的:

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

但出现以下错误:

The system cannot find the path specified.            

您能否解释找不到的路径?

qx运算符 (backticks)启动外壳程序( sh ),其中prog < input语法期望一个名为input 的文件 ,该文件将从其中读取行并将其馈送到程序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

之所以收到此错误,是因为您使用的是Shell重定向,而不仅仅是传递参数

../python/pythonScript.py < hi

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

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

它可以使用hi参数正确执行您的python脚本,并将结果返回到变量$ret

一些其他的答案的假设hi必须作为命令行参数的Python脚本传递,但提问者说,这是来自标准输入。

从而:

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

要启动外部脚本,您可以执行

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

然后在你的python脚本中

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

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

您可以在此处获得有关python部分的更多信息

暂无
暂无

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

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