2013-07-01 3 views
0

Я пытаюсь запустить «RepoInitCmd», используя Popen, как показано ниже, и работает в следующей ошибке. Может ли кто-либо указать данные о том, что не так?Инициализация команды, которая не работает с 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 ожидает, что командная строка будет передана в виде списка. В частности, фактическая команда, которая будет выполняться (в данном случае «репо»), должна быть первым элементом списка. Вместо того, чтобы писать команды в виде строк и использовать 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'. –

Смежные вопросы