1

リモートサーバーからデータを取得するためにperlスクリプトを呼び出す必要があるPythonスクリプトがあります。perlスクリプトはperlのままである必要があります。これはサードパーティであり、オプションはありません。以前の開発者がコード全体に貼り付けていた、廃止された廃止されたものをすべて削除しようとしているので、commands.getstatusoutput呼び出しをサブプロセス呼び出しに置き換えたいのですが、どういうわけかそれを取得できないようです仕事...

これまで、スクリプトはcommands.getstatusoutput(string)を介して呼び出されていました。ここで、stringは、'/usr/bin/perl /path/to/my/perl/script.pl </のように、perlスクリプトへの完全なシステムコールです。 path / to / my /input'。

引数のリストを作成します(args = ['/usr/bin/perl'、'/path/to/my/perl/script.pl'、'<'、'/ path / to / my / input'])そしてそれをsubprocess.callに渡します:

args = ['/usr/bin/perl', '/path/to/my/perl/script.pl', '<', '/path/to/my/input']
strOut = subprocess.call(args)
print strOut

残念ながら、これはエラーで失敗します:

port absent at /path/to/my/perl/script.pl line 9.

perlスクリプトは次のとおりです。

#!/usr/bin/perl
use IO::Handle;
use strict;
use Socket;
my ($remote, $port, $iaddr, $paddr, $proto, $ligne);
$remote = shift || 'my.provider.com';
$port   = shift || 9000;
if ($port =~ /\D/) { $port = getservbyname ($port, 'tcp'); }
die "port absent" unless $port;

ここで他の同様のスレッドを読んでいるにもかかわらず(pythonからperlスクリプトを呼び出す、pythonからperlスクリプトを呼び出す方法? 、PythonスクリプトでPerlスクリプトの結果を取得するにはどうすればよいですか?Python getstatusoutputの置換が完全な出力を返さないなど)および他の場所、明らかな何かが欠けているような気がしますが、何がわからないのです。

何か案は?

ありがとう。

4

1 に答える 1

2

リダイレクション<シェル機能です。使用する場合は、に文字列を渡して使用する必要がsubprocess.callありますshell = True。例えば:

args = ['/usr/bin/perl', '/path/to/my/perl/script.pl', '<', '/path/to/my/input']
strOut = subprocess.call(' '.join(args), shell = True)

または、次のことを行うことができます。

args = ['/usr/bin/perl', '/path/to/my/perl/script.pl']
with open('path/to/my/input') as input_file:
    strOut = subprocess.call(args, stdin = input_file) 

最後に、 perlプログラムからのリターンコードstrOutを保持します-これは面白い名前のようです。perlプログラムからの出力ストリーム(stdout)を取得したい場合は、おそらくandと組み合わせて使用​​することをお勧めします。subprocess.Popenstdout=subprocess.PIPEcommunicate

于 2012-09-19T13:52:00.567 に答える