Я пытаюсь сделать системный вызов в Python и сохранить вывод в строку, которой я могу манипулировать в программе Python.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
Я попробовал несколько вещей, включая некоторые из предложений здесь:
Получение выходных данных subprocess.call ()
но без удачи.
python
subprocess
отметка
источник
источник
"ntpq -p"
, что является другой частью проблема, о которой вы спрашиваете.Ответы:
В Python 2.7 или Python 3
Вместо
Popen
непосредственного создания объекта вы можете использоватьsubprocess.check_output()
функцию для хранения вывода команды в строку:В Python 2.4-2.6
Используйте
communicate
метод.out
это то, что вы хотите.Важное замечание о других ответах
Обратите внимание, как я прошел в команде.
"ntpq -p"
Пример поднимает другой вопрос. ПосколькуPopen
оболочка не вызывается, вы должны использовать список команд и опций["ntpq", "-p"]
.источник
Popen.communicate
не возвращается, пока процесс не завершится.p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.check_output()
возвращаетbytes
объект, а неstr
. Если все, что вы хотите сделать, это напечатать результат, это не будет иметь никакого значения. Но если вы хотите использовать метод, такой какmyString.split("\n")
результат, вам придется сначала декодироватьbytes
объект:subprocess.check_output(myParams).decode("utf-8")
например.universal_newlines=True
в качестве параметра помогло мне в Python 3 получить строковый объект. Если universal_newlines равен True, они открываются в текстовом режиме с кодировкой по умолчанию. В противном случае они открываются как двоичные потоки.Это сработало для меня для перенаправления stdout (stderr может обрабатываться аналогично):
Если это не работает для вас, пожалуйста, укажите точно, какая у вас проблема.
источник
\n
.pipe.returncode == 0
после последней строки.Popen
возвращает кортежstdout
иstderr
, поэтому, когда вы получаете доступ,[0]
вы просто захватываетеstdout
. Вы также можете сделать,text, err = pipe.communicate()
и тогдаtext
будет то, что вы ожидаетеПредполагая, что
pwd
это просто пример, вот как вы можете это сделать:См. Документацию подпроцесса для другого примера и дополнительной информации.
источник
subprocess.Popen: http://docs.python.org/2/library/subprocess.html#subprocess.Popen
В конструкторе Popen, если shell равен True , вы должны передавать команду как строку, а не как последовательность. В противном случае просто разбейте команду на список:
Если вам нужно прочитать также стандартную ошибку, в инициализации Popen вы можете установить для stderr значение subprocess.PIPE или subprocess.STDOUT :
источник
для Python 2.7+ идиоматический ответ заключается в использовании
subprocess.check_output()
Вы также должны обратить внимание на обработку аргументов при вызове подпроцесса, поскольку это может немного сбивать с толку ....
Если args - это просто одна команда без собственных аргументов (или вы ее
shell=True
задали), это может быть строка. В противном случае это должен быть список.например ... чтобы вызвать
ls
команду, это нормально:так это
однако, если вы хотите передать некоторые аргументы команде shell, вы не можете сделать это:
вместо этого вы должны передать его в виде списка:
shlex.split()
функция может быть иногда полезно разбить строку в оболочку-подобный синтаксис , прежде чем создавать подпроцессы ... как это:источник
Это прекрасно работает для меня:
источник
Это было идеально для меня. Вы получите код возврата, stdout и stderr в кортеже.
Например:
источник
Принятый ответ все еще хорош, лишь несколько замечаний о новых функциях. Начиная с python 3.6, вы можете обрабатывать кодирование напрямую
check_output
, см. Документацию . Это возвращает строковый объект сейчас:В python 3.7 параметр
capture_output
был добавлен в subprocess.run (), который выполняет некоторую обработку Popen / PIPE для нас, см. Документацию по python :источник
В этом случае у вас будет только один элемент в списке.
источник
os.popen
устарела в пользуsubprocess
модуля.Я написал небольшую функцию на основе других ответов здесь:
Использование:
источник
В Python 3.7
capture_output
был введен новый аргумент для ключевого словаsubprocess.run
. Включение короткого и простого:источник
Это однолинейное решение
источник
Следующее захватывает stdout и stderr процесса в одной переменной. Это Python 2 и 3 совместимы:
Если ваша команда является строкой, а не массивом, добавьте к ней префикс:
источник
Для python 3.5 я поставил функцию, основанную на предыдущем ответе. Лог может быть удален, думал, что приятно иметь
источник
Используйте
ckeck_output
методsubprocess
Наконец разбираем строку
Надеюсь, это поможет, счастливого кодирования
источник