Получение вывода subprocess.call () [дубликат]

Этот вопрос уже имеет ответ здесь:

Как я могу получить вывод процесса, выполненного с помощью subprocess.call()?

Передача a StringIO.StringIO объект к stdout дает эту ошибку:

Traceback (most recent call last):
  File "", line 1, in 
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 444, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 588, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 945, in _get_handles
    c2pwrite = stdout.fileno()
AttributeError: StringIO instance has no attribute 'fileno'
>>> 
248
задан Mooncrater 16 January 2018 в 09:31
поделиться

2 ответа

Вывод из subprocess.call () следует перенаправлять только в файлы.

Вместо этого вы должны использовать subprocess.Popen () . Затем вы можете передать subprocess.PIPE для параметров stderr, stdout и / или stdin и читать из каналов с помощью метода communication () :

from subprocess import Popen, PIPE

p = Popen(['program', 'arg1'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = p.communicate(b"input data that is passed to subprocess' stdin")
rc = p.returncode

Причина в том, что файловый объект, используемый subprocess.call () , должен иметь реальный файловый дескриптор и, таким образом, реализовывать метод fileno () . Простое использование любого файлового объекта не поможет.

См. здесь для получения дополнительной информации.

196
ответ дан 23 November 2019 в 02:59
поделиться

Недавно я только понял, как это сделать, и вот пример кода из моего текущего проекта:

#Getting the random picture.
#First find all pictures:
import shlex, subprocess
cmd = 'find ../Pictures/ -regex ".*\(JPG\|NEF\|jpg\)" '
#cmd = raw_input("shell:")
args = shlex.split(cmd)
output,error = subprocess.Popen(args,stdout = subprocess.PIPE, stderr= subprocess.PIPE).communicate()
#Another way to get output
#output = subprocess.Popen(args,stdout = subprocess.PIPE).stdout
ber = raw_input("search complete, display results?")
print output
#... and on to the selection process ...

Теперь у вас есть вывод команды, хранящийся в переменной "output". "stdout = subprocess.PIPE" указывает классу создать объект файла с именем 'stdout' из Popen. Метод communicate(), насколько я могу судить, просто служит удобным способом вернуть кортеж из вывода и ошибок запущенного процесса. Кроме того, процесс запускается при инстанцировании Popen.

29
ответ дан 23 November 2019 в 02:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: