Могу ли я иметь subprocess.call записать вывод вызова в строку? - PullRequest
8 голосов
/ 05 мая 2011

Я хочу сделать subprocess.call и получить результат вызова в строку. Могу ли я сделать это напрямую или мне нужно передать его в файл, а затем прочитать из него?

Другими словами, могу ли я как-то перенаправить stdout и stderr в строку?

Ответы [ 4 ]

10 голосов
/ 05 мая 2011

Нет, вы не можете прочитать вывод subprocess.call () непосредственно в строку.

Чтобы прочитать вывод команды в строку, вам нужно использовать subprocess.Popen (), например:

>>> cmd = subprocess.Popen('ls', stdout=subprocess.PIPE)
>>> cmd_out, cmd_err = cmd.communicate()

cmd_out будет содержать строку с выводомкоманда.

7 голосов
/ 08 июля 2014

Это расширение ответа mantazer на python3.Вы все еще можете использовать команду subprocess.check_output в python3:

>>> subprocess.check_output(["echo", "hello world"])
b'hello world\n'

, однако теперь она дает нам строку байтов.Чтобы получить настоящую строку Python, нам нужно использовать decode:

>>> subprocess.check_output(["echo", "hello world"]).decode(sys.stdout.encoding)
'hello world\n'

Использование sys.stdout.encoding в качестве кодировки, а не просто значение по умолчанию UTF-8 должно заставить это работать на любой ОС (по крайней мере, в теории).

Конечный символ новой строки (и любые другие лишние пробелы) можно легко удалить с помощью .strip(), поэтому последняя команда:

>>> subprocess.check_output(["echo", "hello world"]
                            ).decode(sys.stdout.encoding).strip()
'hello world'
5 голосов
/ 06 июня 2014

Модуль subprocess предоставляет метод check_output(), который запускает предоставленную команду с аргументами (если есть) и возвращает ее вывод в виде строки байтов.

output = subprocess.check_output(["echo", "hello world"])
print output

Приведенный выше код выведет hello world

См. Документы: https://docs.python.org/2/library/subprocess.html#subprocess.check_output

2 голосов
/ 05 мая 2011

subprocess.call() принимает те же аргументы, что и subprocess.Popen(), включая аргументы stdout и stderr.Подробности смотрите в документации.

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