Чтение команды os.popen(команда) в строку
Я не уверен, прав ли мой титул.
Что я делаю, пишу python script для автоматизации некоторых моих написаний кода.
Поэтому я разбираюсь в файле .h.
но я хочу расширить все макросы, прежде чем начать.
поэтому я хочу сделать вызов оболочки:
gcc -E myHeader.h
Который должен поставить старую версию обработанного сообщения myHeader.h на stdout.
Теперь я хочу прочитать все, что выводится прямо в строку для дальнейшей обработки.
Я читал, что могу сделать это с помощью popen, но я никогда не использовал объекты pipe.
как это сделать?
Ответы
Ответ 1
Функция os.popen
просто возвращает файл-подобный объект. Вы можете использовать его так:
import os
process = os.popen('gcc -E myHeader.h')
preprocessed = process.read()
process.close()
Как говорили другие, вы должны использовать subprocess.Popen
. Он предназначен для более безопасной версии os.popen
. В документах Python есть раздел описывающий, как переключаться.
Ответ 2
import subprocess
p = subprocess.popen('gcc -E myHeader.h'.split(),
stdout=subprocess.PIPE)
preprocessed, _ = p.communicate()
String preprocessed
теперь имеет предварительно обработанный источник, который вам нужен, и вы использовали "правильный" (современный) способ оболочки для подпроцесса, а не старый, не очень-любимый-больше os.popen
.
Ответ 3
вы должны использовать subprocess.Popen()
, существует множество примеров SO
Как получить вывод из подпроцесса .Popen()
Ответ 4
os.popen() устарел с Python 2.6. Теперь вы должны использовать модуль подпроцесса: http://docs.python.org/2/library/subprocess.html#subprocess.Popen
import subprocess
command = "gcc -E myHeader.h" # 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 имеет значение True, вы должны передать команду как строку, а не как последовательность. В противном случае просто разделите команду на список:
command = ["gcc", "-E", "myHeader.h"] # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)
Если вам нужно также прочитать стандартную ошибку, в инициализацию Popen, вы можете установить stderr на subprocess.PIPE или на subprocess.STDOUT:
import subprocess
command = "gcc -E myHeader.h" # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
#Launch the shell command:
output, error = process.communicate()