2011-12-28 22 views
2

私はPythonスクリプトとperlスクリプトという2つのスクリプトを持っています。perlでpythonスクリプトを実行する

私はどのようにしてperlスクリプトをpythonスクリプトを実行させてから実行することができますか?

+2

シンプルな 'system'コールのために複雑すぎるケースに直面していますか?さらに、あなたの最後の文章に誤りがあるようです。 Pythonスクリプトは表示されません。 –

+0

他の言語に移植することを強く検討します。 –

答えて

8

このような何かが動作するはずです:

system("python", "/my/script.py") == 0 or die "Python script returned error $?"; 

を使用すると、Pythonスクリプトの出力をキャプチャする必要がある場合:

open(my $py, "|-", "python2 /my/script.py") or die "Cannot run Python script: $!"; 
while (<$py>) { 
    # do something with the input 
} 
close($py); 

あなたがサブプロセスのための入力を提供したい場合、これがまた同じように動作します。

+2

良い答えですが、新しい3つの引数[open](http://perldoc.perl.org/functions/open.html)の構文を使い始めるべきです: 'open(my $ py、" | - "、" python2 /私の/ script.py ")または死ぬ...'。あなたが書いたものは何も問題はありませんが、新しい構文では問題は少なくなります。 –

+0

@DavidW:ヒントのおかげで、私はPerlのプログラマーではないと認め、まれにそれをほとんど使用しません。あなたの提案された変更を反映するように編集しました。 –

+0

'system(' python '、' /my/script.py ')== 0 ... 'はシェルや関連補間の問題を避けるために、マルチarg形式の' system'を使うべきです。 – friedo

1

シェルスクリプトからの両方のスクリプトを実行する方が簡単であってもよく、あなたが他の

2

最高の1つのプログラムからの結果を渡す必要がある場合(UNIX環境にいると仮定して)使用パイプ方法は、IPC :: Open3を使用して、システムレベルでPythonスクリプトを実行することです。これにより、system()を使うより安全で読みやすいコードになります。これは、Pythonのコードを実行するためのフォークプロセスを作成します

use strict; 
use IPC::Open3(); 
use IO::Handle(); #not required but good for portabilty 

my $write_handle = IO::Handle->new(); 
my $read_handle = IO::Handle->new(); 
my $pid = IPC::Open3::open3($write_handle, $read_handle, '>&STDERR', $python_binary. ' ' . $python_file_path); 
if(!$pid){ function_that_records_errors("Error"); } 
#read multi-line data from process: 
local $/; 
my $read_data = readline($read_handle); 
#write to python process 
print $write_handle 'Something to write to python process'; 
waitpid($pid, 0); #wait for child process to close before continuing 

あなたは簡単に読み、そのようにIPC ::のopen3でそれらに書き込み、システムコマンドを実行することができます。つまり、Pythonコードが失敗した場合、プログラムを回復して続行することができます。

+0

'my $ pid = ...'行は '$(write | read)_handle'の先行する宣言を覆しています –

+0

ありがとうエリック。二重宣言を修正するために編集されました。 –

関連する問題