【问题标题】:Running python script from perl, with argument to stdin and saving stdout output从 perl 运行 python 脚本,参数为 stdin 并保存 stdout 输出
【发布时间】:2018-06-17 15:27:32
【问题描述】:

我的 perl 脚本位于路径:

a/perl/perlScript.pl

我的 python 脚本位于路径:

a/python/pythonScript.py

pythonScript.py 从标准输入获取参数,并将结果返回到标准输出。从 perlScript.pl 开始,我想将带有参数 hipythonScript.py 运行到标准输入,并将结果保存在某个变量中。这就是我尝试过的:

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

但我收到以下错误:

The system cannot find the path specified.            

找不到路径能解释一下吗?

【问题讨论】:

    标签: python perl


    【解决方案1】:

    qx operator(反引号)启动一个 shell(sh),其中prog &lt; input 语法expects a file 命名为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 .

    【讨论】:

      【解决方案2】:

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

      ../python/pythonScript.py < hi
      

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

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

      使用 hi 参数正确执行你的 python 脚本,并将结果返回给变量$ret

      【讨论】:

        【解决方案3】:

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

        因此:

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

        【讨论】:

          【解决方案4】:

          要启动您的外部脚本,您可以这样做

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

          然后在你的 python 脚本中

          import sys
          def yourFct(a, b):
              ...
          
          if __name__== "__main__":
              yourFct(sys.argv[1])
          

          你可以有更多关于python部分的信息here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-06-04
            • 2012-03-08
            • 1970-01-01
            • 2020-12-31
            • 2011-07-22
            • 1970-01-01
            • 2017-05-09
            • 2012-09-05
            相关资源
            最近更新 更多