我的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.
你能解释一下无法找到的路径吗?
答案 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
运行,因此一旦完成就会获得输出,这与问题中的尝试一致。请参阅模块操作的文档。
此模块非常简单,而 满足使用system
,qx
和open3 [...]
的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
上获得更多信息