2010-02-26 10 views
14

No estoy seguro de si mi título es correcto. Lo que estoy haciendo es escribir una secuencia de comandos python para automatizar algunos de mis códigos de escritura. Así que estoy analizando un archivo .h. pero quiero expandir todas las macros antes de comenzar. por lo que queremos hacer una llamada a la cáscara para:leyendo un os.popen (comando) en una cadena

gcc -E myHeader.h 

¿Qué debe poner a cabo la versión posterior de preprocesado myHeader.h a la salida estándar. Ahora quiero leer todo ese resultado directamente en una cadena para su posterior procesamiento. He leído que puedo hacer esto con popen, pero nunca he usado objetos de tubería.

¿cómo hago esto?

+1

Duplicados: http://stackoverflow.com/search?q=%5Bpython%5D+subprocess+output, http://stackoverflow.com/questions/1180606/using-subprocess-popen-for -process-with-large-output Aún así, +1 por ser claro y bien hecho, y por "post p reprocesado ". :) –

Respuesta

20

La función os.popen simplemente devuelve un objeto similar a un archivo. Se puede utilizar de este modo:

import os 

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

Como otros han dicho, usted debe estar usando subprocess.Popen. Está diseñado para ser un safer version de os.popen. Los documentos de Python tienen un section describing how to switch over.

15
import subprocess 

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

cadena preprocessed tiene ahora la fuente preprocesado usted requiere - y usted ha utilizado la forma "correcta" (moderna) para shell a un subproceso, en lugar de viejo no tan querido os.popen.

+0

Muy buen ejemplo. ¿Hay alguna manera de separar las corrientes stdout y stderr? – smith324

2

El os.popen() ha quedado obsoleto desde Python 2.6. Ahora debería utilizar el módulo de subproceso lugar: 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] 

En el constructor Popen, si cáscara es verdadera , debe pasar el comando como una cadena en lugar de como una secuencia. De lo contrario, simplemente dividir el comando en una lista:

command = ["gcc", "-E", "myHeader.h"] # the shell command 
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None) 

Si usted necesita leer también el error estándar, en la inicialización Popen, se puede establecer stderr a subprocess.PIPE o para 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() 
Cuestiones relacionadas