2013-07-01 2 views
0

Popen을 사용하여 다음과 같은 오류로 실행되는 "RepoInitCmd"를 실행하려고합니다. 무엇이 잘못되었는지 입력을 제공 할 수 있습니까?popen으로 실패한 명령 초기화

import subprocess 
Branch_Name='ab_mr2' 
RepoInitCmd = 'repo init -u git://git.company.com/platform/manifest.git -b ' + Branch_Name 
proc = subprocess.Popen([RepoInitCmd], stderr=subprocess.PIPE) 
out, error = proc.communicate() 

오류 : -

File "test.py", line 4, in <module> 
    proc = subprocess.Popen([RepoInitCmd], stderr=subprocess.PIPE) 
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

답변

0

기본적으로 Popen은 명령 줄을 목록으로 전달할 것으로 기대합니다. 특히 실행될 실제 명령 (이 경우 'repo')은 목록의 첫 번째 항목이어야합니다. 명령을 문자열로 작성하고 split 또는 shlex를 사용하여 Popen에 목록으로 전달하는 대신 처음부터 명령 줄을 목록으로 관리하는 편이 좋습니다. 이렇게하면 코드에서 명령 줄을보다 쉽게 ​​만들 수 있습니다. 이 같은,이 경우 내가 쓴 수있는 무언가 :

RepoInitCmd = ['repo', 'init', '-u', 'git://git.company.com/platform/manifest.git'] 
RepoInitCmd.extend(['-b', Branch_Name]) 
proc = subprocess.Popen(RepoInitCmd, stderr=subprocess.PIPE) 

주, 당신이 원하는 또는 단일 문자열로 명령 줄을 통과해야하는 경우 (아마도 쉘 기능을 활용할 수), 당신은 사용할 수 있습니다 추가 쉘 프로세스를 실행하는 추가 오버 헤드에 신경 쓸 필요가 없다면 쉘 모드를 사용하십시오 :

proc = subprocess.Popen(RepoInitCmd, shell=True, stderr=subprocess.PIPE) 
1
proc = subprocess.Popen(RepoInitCmd.split(" "), stderr=subprocess.PIPE) 

또는

import shlex 
proc = subprocess.Popen(shlex.split(RepoInitCmd), stderr=subprocess.PIPE) 

당신은 인수의 배열을 전달해야합니다. 첫 번째 인수는 이진 이름으로 처리되므로 "repo init ..."는 찾는 프로그램의 이름입니다. 다음과 같이 전달해야합니다. ["repo", "init", ...]

+1

또는 더 나은 방법은 'shlex.split'을 사용하십시오. –

관련 문제