2011-12-28 139 views
2

我有兩個腳本,一個python腳本和一個perl腳本。在perl中運行python腳本

如何讓perl腳本運行python腳本然後自行運行?

+2

對於簡單的'系統'調用,您是否面臨過於複雜的情況?另外,你的最後一句話似乎有一個錯誤。 Python腳本不會顯示在其中。 – 2011-12-28 17:37:23

+0

我會強烈考慮將一個移植到另一個語言。 – 2011-12-28 19:26:25

回答

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

好的答案,但你應該開始使用新的三個參數[open](http://perldoc.perl.org/functions/open.html)語法:'open(my $ py,「| - 」,「python2 /我的/ script.py「)或死亡......。你寫的東西沒什麼問題,但是新的語法會導致更少的問題。 – 2011-12-28 18:11:57

+0

@DavidW:感謝您的提示,我承認我不是Perl程序員,很少使用它。我編輯以反映您的建議更改。 – 2011-12-28 19:20:29

+0

您還應該使用'system'的多參數形式來避免shell和相關的插值問題:'system('python','/my/script.py')== 0 ...'會工作。 – friedo 2011-12-28 20:55:48

1

這可能是簡單的運行從shell腳本這兩個腳本,並使用管道(假設你在Unix環境中是)如果你需要從一個程序的結果傳遞給其他

2

最好方法是使用IPC :: Open3在系統級執行python腳本。與使用system()相比,這會使代碼更安全,更易讀。

您可以輕鬆地執行系統命令,讀取和寫入他們與IPC :: Open3像這樣:

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 

這將創建一個派生進程來運行Python代碼。這意味着如果python代碼失敗,您可以恢復並繼續執行您的程序。

+0

'my $ pid = ...'行忽略了'$(write | read)_handle的前面的聲明' – 2011-12-28 19:45:53

+0

謝謝Eric。編輯修復雙重聲明。 – 2011-12-29 22:39:32