2013-05-21 3 views
1

Python은 실패 할 수도있는 서브 프로세스를 호출하는 두 가지 편리한 함수 인 subprocess.check_callsubprocess.check_output을 제공합니다. 기본적Python의 subprocess.check_call/check_output에 해당하는 Ruby

subprocess.check_call(['command', 'arg1', ...]) 

서브 프로세스는, 블록으로 지정된 명령 급부상하고 는 (영 복귀) 서브 프로세스가 성공적으로 종료 된 것을 확인. 그렇지 않은 경우에는 예외가 발생합니다. check_output은 하위 프로세스의 stdout을 캡처하고 바이트 문자열로 반환한다는 점을 제외하면 똑같은 작업을 수행합니다.

이것은 단일 파이썬 표현식 (몇 줄의 코드에서 서브 프로세스를 설정하고 제어 할 필요가 없기 때문에)에 편리하며 반환 값을 확인하는 것을 잊을 위험이 없습니다.

관용구 루비가 check_callcheck_output에 해당하는 이유는 무엇입니까? 나는 프로세스의 리턴 값을 제공하는 $? 글로벌을 알고 있지만, 어색하다. 예외가있는 점은 수동으로 에러 코드를 확인할 필요가 없다는 것이다. There are numerous ways to spawn a subprocess in Ruby인데이 기능을 제공하는 제품이 없습니다.

답변

0

기본/내장 방법은 POpen4 보석으로 대체됩니다. 그리고 shell-executor 보석은 더 많은 awesomeness를 제공합니다.

1

루비에서 가장 관용적 인 해결책은 무엇인지 말하기는 어렵지만 파이썬과 가장 가까운 것은 아마도 Shell.execute!에서 shell-executer입니다. 워드 프로세서 페이지의 예에서

: 여기서 가장 주목할만한 차이점은 루비 상응 shell=False을 할 수있는 방법이 없다는 것입니다

try: 
    subprocess.check_call('ls /not_existing', shell=True) 
except Exception as e: 
    print e.message 

(과 :

begin 
    Shell.execute!('ls /not_existing') 
rescue RuntimeError => e 
    print e.message 
end 

에 비교 args를리스트로 가져라.), 파이썬뿐만 아니라 디폴트도있다.

또한 파이썬의 e.message은 기본 메시지 또는 리턴 코드를 기반으로 생성 된 것이고 Ruby의 e.message은 자식의 stderr입니다.

내가 알고있는 한, shell=False을 원한다면 저급 레벨의 래퍼를 작성해야합니다. 내가 아는 루비 래퍼 (shell-executer, Popen4, [open4] [4])는 POSIX popen 함수의 래퍼 또는 에뮬레이터입니다.

1

여기에 간단한 check_call이 함께 던져서 작동하는 것 같습니다.

def check_call(*cmd, **kw) 
    _, status = Process.waitpid2 Kernel.spawn(*cmd, **kw) 
    raise "Command #{cmd} #{status}" unless status.success? 
end 
관련 문제