Подтвердить что ты не робот

Чтение команды os.popen(команда) в строку

Я не уверен, прав ли мой титул. Что я делаю, пишу python script для автоматизации некоторых моих написаний кода. Поэтому я разбираюсь в файле .h. но я хочу расширить все макросы, прежде чем начать. поэтому я хочу сделать вызов оболочки:

gcc -E myHeader.h

Который должен поставить старую версию обработанного сообщения myHeader.h на stdout. Теперь я хочу прочитать все, что выводится прямо в строку для дальнейшей обработки. Я читал, что могу сделать это с помощью popen, но я никогда не использовал объекты pipe.

как это сделать?

4b9b3361

Ответ 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.

Ответ 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()