¿Cómo redirigir la salida con subproceso en Python?

Lo que hago en la línea de comando:

cat file1 file2 file3 > myfile 

Lo que quiero hacer con python:

 import subprocess, shlex my_cmd = 'cat file1 file2 file3 > myfile' args = shlex.split(my_cmd) subprocess.call(args) # spits the output in the window i call my python program 

ACTUALIZACIÓN: os.system no se recomienda, aunque aún está disponible en Python 3.


Utilice os.system :

 os.system(my_cmd) 

Si realmente desea utilizar el subproceso, aquí está la solución (en su mayor parte sacada de la documentación del subproceso):

 p = subprocess.Popen(my_cmd, shell=True) os.waitpid(p.pid, 0) 

OTOH, puedes evitar las llamadas al sistema por completo:

 import shutil with open('myfile', 'w') as outfile: for infile in ('file1', 'file2', 'file3'): shutil.copyfileobj(open(infile), outfile) 

Para responder a su pregunta original, para redirigir la salida, simplemente pase un identificador de archivo abierto para el argumento stdout a subprocess.call :

 # Use a list of args instead of a string input_files = ['file1', 'file2', 'file3'] my_cmd = ['cat'] + input_files with open('myfile', "w") as outfile: subprocess.call(my_cmd, stdout=outfile) 

Pero como otros han señalado, el uso de un comando externo como cat para este propósito es completamente extraño.

@PoltoS Quiero unir algunos archivos y luego procesar el archivo resultante. Pensé que usar gato era la alternativa más fácil. ¿Hay una manera mejor / pythonica de hacerlo?

Por supuesto:

 with open('myfile', 'w') as outfile: for infilename in ['file1', 'file2', 'file3']: with open(infilename) as infile: outfile.write(infile.read()) 

Un caso interesante sería actualizar un archivo añadiéndole un archivo similar. Entonces uno no tendría que crear un nuevo archivo en el proceso. Es particularmente útil en el caso de que se deba adjuntar un archivo grande. Aquí hay una posibilidad usando la línea de comando teminal directamente desde python.

 import subprocess32 as sub with open("A.csv","a") as f: f.flush() sub.Popen(["cat","temp.csv"],stdout=f) 
 size = 'ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 dump.mp4 > file' proc = subprocess.Popen(shlex.split(size), shell=True) time.sleep(1) proc.terminate() #proc.kill() modify it by a suggestion size = "" with open('file', 'r') as infile: for line in infile.readlines(): size += line.strip() print(size) os.remove('file') 

Cuando use el subproceso , el proceso debe eliminarse. Este es un ejemplo. Si no cancela el proceso, el archivo estará vacío y no podrá leer nada. Puede ejecutarse en Windows . No puedo asegurar que pueda hacerlo. Ejecutar en Unix.