簡體   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