2013-12-19 2 views
2

Я тоже новичок в Python и программировании. Я знаю, что из класса питона Google, как запустить внешнюю команду с помощью:Python - subprocess - getstatusoutput

(состояние, выход) = commands.getstatusoutput (ЦМД)
если статус: ## случай ошибки, распечатайте вывод команды на стандартный вывод ошибок и выхода
sys.stderr.write (выход)
sys.exit (1)

Но я вижу, что команды модуль будет устаревшим. Я хочу состояние и вывод, поэтому я могу распечатать вывод, используя sys.stderr.write(), если есть какая-либо ошибка. Итак, есть ли эквивалентная команда в модуле подпроцесса? В настоящее время я использую:

Подпроцесс.

Спасибо!

+0

'subprocess.check_output' в блоке' try' будет самым близким эквивалентом. – Blender

ответ

0

Popen хороший и простой способ сделать это:

from subprocess import Popen, PIPE 

def local(command): 
    print 'local', local 
    process = Popen(command.split(), stdout=PIPE, stderr=PIPE) 
    out = process.stdout.read() 
    err = process.stderr.read() 
    print 'out', out 
    print 'err', err 
    returncode = process.wait() 
    if returncode: 
     raise Exception(returncode, err) 
    else: 
     return out 
+0

ваши блокировки кода, если дочерний процесс генерирует достаточное количество выходных данных, чтобы заполнить буфер буфера операционной системы stderr. – jfs

+0

К сожалению, это неправильный ответ. –

1

Это также можно сделать, с немного меньшим количеством кода

from subprocess import Popen, PIPE 

def getstatusoutput(command): 
    process = Popen(command, stdout=PIPE) 
    out, _ = process.communicate() 
    return (process.returncode, out) 

code, out = getstatusoutput(["echo", "some text"]) 
print code 
print out 
0

Что getstatusoutput делает это собрать как stdout и stderr выход чередуется в одну переменную. Это будет довольно точно повторять действительное getstatusoutput на тех, где его не существует (getstatusoutput и весь модуль commands был удален на Python 3 полностью), за исключением поведения новой строки. Полученные данные приведены в bytes.

def getstatusoutput(cmd): 
    subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    out, _ = process.communicate() 

    if out[-1:] == b'\n': 
     out = out[:-1] 

    return (process.returncode, out) 

Эта функция возвращает bytes на Python 3 по назначению, так как версия Python 2 возвращает str

+0

не реплицирует фактическое поведение: [вам нужно обрезать новую строку (и вернуть текст на Python 3)] (http://stackoverflow.com/a/28483026/4279). – jfs

+0

это также возвращает [другой статус] (http://bugs.python.org/issue23508) – jfs

2

Существует subprocess.getstatusoutput() in Python 3, что could be implemented as:

from subprocess import check_output, CalledProcessError 

def getstatusoutput(cmd): 
    try: 
     data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT) 
     status = 0 
    except CalledProcessError as ex: 
     data = ex.output 
     status = ex.returncode 
    if data[-1:] == '\n': 
     data = data[:-1] 
    return status, data 

Оба возвращают status, который отличается от оригинала commands.getstatusoutput(). См. Python Issue: Document & unittest the subprocess.getstatusoutput() status value.