[英]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.py
与hi
一起运行,并将结果保存到某个变量中。 那就是我尝试过的:
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
运行,以便在完成后获得输出,这与问题中的尝试一致。 有关模块的操作,请参见文档。
此模块旨在简化,同时“ 满足使用system
, qx
和open3 [...]
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.