чтение os.popen (команды) в строку - PullRequest
14 голосов
/ 26 февраля 2010

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

gcc -E myHeader.h

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

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

Ответы [ 5 ]

23 голосов
/ 26 февраля 2010

Функция os.popen просто возвращает объект в виде файла. Вы можете использовать его так:

import os

process = os.popen('gcc -E myHeader.h')
preprocessed = process.read()
process.close()

Как уже говорили другие, вы должны использовать subprocess.Popen. Он предназначен для более безопасной версии из os.popen. В документации по Python есть раздел , в котором описано, как переключать .

16 голосов
/ 26 февраля 2010
import subprocess

p = subprocess.popen('gcc -E myHeader.h'.split(),
                     stdout=subprocess.PIPE)
preprocessed, _ = p.communicate()

String preprocessed теперь содержит требуемый предварительно обработанный источник - и вы использовали «правильный» (современный) способ оболочки для подпроцесса, а не старый, не столь любимый больше os.popen.

5 голосов
/ 26 февраля 2010

вы должны использовать subprocess.Popen() Есть множество примеров на SO

Как получить выходные данные из подпроцесса. Open ()

1 голос
/ 28 апреля 2013

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()
0 голосов
/ 29 марта 2018

Вот еще один подход, который фиксирует как обычный вывод, так и вывод ошибок:

com_str = 'uname -a'
command = subprocess.Popen([com_str], stdout=subprocess.PIPE, shell=True)
(output, error) = command.communicate()
print output

Linux 3.11.0-20-generic  Fri May 2 21:32:55 UTC 2014 GNU/Linux

и

com_str = 'id'
command = subprocess.Popen([com_str], stdout=subprocess.PIPE, shell=True)
(output, error) = command.communicate()
print output

uid=1000(myname) gid=1000(myGID) groups=1000(mygrp),0(root)
...