Как получить выходные данные программы на Python? - PullRequest
3 голосов
/ 10 мая 2010

Я не пользователь Perl, но из этот вопрос сделал вывод, что чрезвычайно легко получить стандартный вывод программы, выполняемой через скрипт Perl, используя что-то вроде:

$version = `java -version`;  

Как бы я получил тот же конечный результат в Python? Получает ли приведенная выше строка стандартную ошибку (эквивалентную C ++ std :: cerr) и стандартный вывод журнала (std :: clog)? Если нет, то как мне получить эти выходные потоки?

Спасибо, Geoff

Ответы [ 3 ]

7 голосов
/ 10 мая 2010

Для Python 2.5: к сожалению, нет. Вам необходимо использовать подпроцесс:

import subprocess
proc = subprocess.Popen(['java', '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()

Документы на http://docs.python.org/library/subprocess.html

6 голосов
/ 11 мая 2010

В Python 2.7 +

from subprocess import check_output as qx

output = qx(['java', '-version'])

Ответ на Запись вывода системных команд в виде строки Вопрос имеет реализацию для Python <2.7. </p>

4 голосов
/ 11 мая 2010

Как уже упоминалось, вы хотите использовать для этого модуль Python subprocess.

Если вы действительно хотите что-то более сжатое, вы можете создать такую ​​функцию:

#!/usr/bin/env python 
import subprocess, shlex

def captcmd(cmd):
    proc = subprocess.Popen(shlex.split(cmd), \
      stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)

    out, err = proc.communicate()
    ret = proc.returncode
    return (ret, out, err)

... тогда вы можете назвать это как:

ok, o, e = captcmd('ls -al /foo /bar ...')
print o
if not ok:
    print >> sys.stderr, "There was an error (%d):\n" % ok
    print >> sys.stderr, e

... или что угодно.

Примечание: я использую shlex.split() в качестве гораздо более безопасной альтернативы shell=True

Естественно, вы могли бы написать это на свой вкус. Конечно, для каждого вызова вы должны либо указать три имени, в которые он может распаковать кортеж результата, либо вы должны извлечь желаемый вывод из результата, используя обычное индексирование (например, captcmd(...)[1] для вывода). Естественно, вы можете написать вариант этой функции, чтобы объединить stdout и stderr и отбросить код результата. Эти "особенности" сделают его более похожим на выражения обратной связи Perl. (Сделайте это и возьмите вызов shlex.split(), и у вас будет что-то такое же грубое и небезопасное, как и то, что делает Perl на самом деле).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...