Хранить выходные данные подпроцесса.Вызов Popen в строке
Я пытаюсь сделать системный вызов в Python и сохранить вывод в строку, которую я могу манипулировать в программе Python.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
Я пробовал несколько вещей, включая некоторые предложения здесь:
получение выходных данных подпроцесса.звоните()
но без каких-либо удачи.
9 ответов:
в Python 2.7 или Python 3
вместо
Popenобъект непосредственно, вы можете использоватьsubprocess.check_output()функции сохранить вывод команды в строку:from subprocess import check_output out = check_output(["ntpq", "-p"])В Python 2.4-2.6
использовать
communicateметод.import subprocess p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE) out, err = p.communicate()
outэто то, что вы хотите.важное замечание о других ответах
обратите внимание, как я прошел в команда. Элемент
"ntpq -p"пример поднимает еще один вопрос. Так какPopenне вызывает оболочку, вы бы использовали список команд и опций -["ntpq", "-p"].
это сработало для меня для перенаправления stdout (stderr можно обрабатывать аналогично):
from subprocess import Popen, PIPE pipe = Popen(path, stdout=PIPE) text = pipe.communicate()[0]Если это не работает для Вас, пожалуйста, укажите конкретно, какие у вас проблемы.
предполагая, что
pwdэто просто пример, вот как вы можете это сделать:import subprocess p = subprocess.Popen("pwd", stdout=subprocess.PIPE) result = p.communicate()[0] print resultпосмотреть подпроцесс документации на еще один пример и больше информации.
подпроцесс.Попен:http://docs.python.org/2/library/subprocess.html#subprocess.Popen
import subprocess command = "ntpq -p" # the shell command process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True) #Launch the shell command: output = process.communicate() print output[0]в конструкторе Popen, если shell и правда, вам необходимо пройти команду как строку, а не как последовательность. В противном случае просто разделите команду на список:
command = ["ntpq", "-p"] # the shell command process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)Если вам нужно прочитать также стандартную ошибку, в инициализации Popen, вы можете установить stderr to подпроцесс.Труба или подпроцесс.Стандартный вывод:
import subprocess command = "ntpq -p" # the shell command process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) #Launch the shell command: output, error = process.communicate()
Это прекрасно работает для меня:
import subprocess try: #prints results and merges stdout and std result = subprocess.check_output("echo %USERNAME%", stderr=subprocess.STDOUT, shell=True) print result #causes error and merges stdout and stderr result = subprocess.check_output("copy testfds", stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError, ex: # error code <> 0 print "--------error------" print ex.cmd print ex.message print ex.returncode print ex.output # contains stdout and stderr together
для Python 2.7 + идиоматический ответ должен использовать
subprocess.check_output()вы также должны отметить обработку аргументов при вызове подпроцесса, так как это может быть немного запутанным....
если args-это всего лишь одна команда без собственных args (или у вас есть
shell=Trueset), это может быть строка. В противном случае это должен быть список.например... чтобы вызвать
lsкоманда, это нормально:from subprocess import check_call check_call('ls')так это:
from subprocess import check_call check_call(['ls',])однако, если вы хотите передать некоторые аргументы в команду оболочки, вы не могу этого:
from subprocess import check_call check_call('ls -al')вместо этого вы должны передать его в виде списка:
from subprocess import check_call check_call(['ls', '-al'])the
shlex.split()функция иногда может быть полезна для разделения строки на оболочечный синтаксис перед созданием подпроцессов... вот так:from subprocess import check_call import shlex check_call(shlex.split('ls -al'))
Это было идеально для меня. Вы получите код возврата, stdout и stderr в кортеже.
from subprocess import Popen, PIPE def console(cmd): p = Popen(cmd, shell=True, stdout=PIPE) out, err = p.communicate() return (p.returncode, out, err)Например:
result = console('ls -l') print 'returncode: %s' % result[0] print 'output: %s' % result[1] print 'error: %s' % result[2]
Я написал небольшую функцию, основанную на других ответах здесь:
def pexec(*args): return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0].rstrip()использование:
changeset = pexec('hg','id','--id') branch = pexec('hg','id','--branch') revnum = pexec('hg','id','--num') print('%s : %s (%s)' % (revnum, changeset, branch))
Comments