2011-12-28 2 views
2

나는 두 개의 스크립트, python 스크립트 및 perl 스크립트가 있습니다.perl에서 python 스크립트 실행

어떻게하면 펄 스크립트가 파이썬 스크립트를 실행하고 스스로 실행될 수 있습니까? 이 같은

+2

간단한 '시스템'호출을하기에는 너무 복잡한 케이스가 있습니까? 또한 마지막 문장에 오류가있는 것 같습니다. 파이썬 스크립트가 나타나지 않습니다. –

+0

다른 언어로 포팅하는 것이 좋습니다. –

답변

8

뭔가 작동합니다 : 당신은 하위 프로세스에 대한 입력을 제공하려는 경우

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

이것은 또한 유사하게 작동합니다

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

당신은 파이썬 스크립트의 출력을 캡처해야하는 경우

.

+2

좋은 대답이지만 새로운 세 가지 인자 [open] (http://perldoc.perl.org/functions/open.html) 구문을 사용하여 시작해야합니다 :'open (my $ py, "| -", "python2/my/script.py ") 또는 죽어라.". 당신이 작성한 것에는 아무런 문제가 없지만 새로운 구문으로 인해 문제가 줄어 듭니다. –

+0

@DavidW : 힌트를 보내 주셔서 감사합니다. 나는 Perl 프로그래머가 아니며 거의 사용하지 않는다는 것을 인정합니다. 제안 된 변경 사항을 반영하도록 수정했습니다. –

+0

쉘과 관련 보간 문제를 피하기 위해'system'의 multi-arg 형식을 사용해야합니다 :'system ('python', '/my/script.py') == 0 ...'이 효과적입니다. – friedo

1

쉘 스크립트의 두 스크립트를 실행하는 간단하고 있습니다 당신이 다른

2

가장 좋은 하나 개의 프로그램에서 결과를 전달해야하는 경우 (당신이 유닉스 환경에있어 가정) 사용 파이프 방법은 IPC :: Open3을 사용하여 시스템 수준에서 파이썬 스크립트를 실행하는 것입니다. 이렇게하면 system()을 사용하는 것보다 코드에서 안전하고 읽기 쉬운 것을 유지할 수 있습니다. 이것은 파이썬 코드를 실행하는 갈래의 프로세스를 생성합니다

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로 쓰기, 시스템 명령을 실행할 수 있습니다. 즉, 파이썬 코드가 실패하면 프로그램을 복구하고 계속할 수 있습니다.

+0

'my $ pid = ...'줄은'$ (write | read) _handle'의 선행 선언을 덮어 씌우고 있습니다. –

+0

Thanks Eric. 이중 선언을 수정했습니다. –