Qué 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
python
subprocess
catatemypythoncode
fuente
fuente
os.sendfile()
-basada en la solución es posible, consulte Reproducir el comando unix cat en pythonRespuestas:
ACTUALIZACIÓN: se desaconseja os.system, aunque todavía está disponible en Python 3.
Utilizar
os.system
:Si realmente desea utilizar el subproceso, aquí está la solución (en su mayoría extraída de la documentación del subproceso):
OTOH, puede evitar las llamadas al sistema por completo:
fuente
os.system
y puede modelar conos.system
precisión, pero también es más complejo trabajar con ella.os.system
vino antessubprocess
. La primera es una API heredada que la segunda pretende reemplazar.os.system()
oshell=True
. Para redirigir la salida de un subproceso, use elstdout
parámetro como se muestra en la respuesta de Ryan Thompson . Aunque no necesita un subproceso (cat
) en su caso, puede concatenar archivos usando Python puro.En Python 3.5+ para redirigir la salida, simplemente pase un identificador de archivo abierto para el
stdout
argumento asubprocess.run
:Como han señalado otros, el uso de un comando externo como
cat
para este propósito es completamente extraño.fuente
subprocess.run(my_cmd, stdout=outfile)
que está reemplazandosubprocess.call(...)
Por supuesto:
fuente
Cuando usa subproceso , el proceso debe ser eliminado. Este es un ejemplo. Si no termina el proceso, el archivo estará vacío y no podrá leer nada. Puede ejecutarse en Windows . No puedo asegurarme de que pueda ejecutar en Unix.
fuente
for line in .readlines():
,s +=
) yproc.kill()
puede conducir a la pérdida de información en general (no permitir que el subproceso termina correctamente (en Unix) - unflushed contenido se pierde ). De todos modos, la nota sobre el almacenamiento en búfer es más apropiada como comentario.shlex.split()
, gotashell=True
, gota>file
, gotaopen()
, etc y el usostdout=PIPE
,Timer(1, proc.terminate).start()
;output = proc.communicate()[0]
en lugar. Aquí tienes un ejemplo completo . Más soluciones: ¿ Dejar de leer la salida del proceso en Python sin bloquearse? Nota: no hay ningún requisito en la pregunta de que deba terminar el proceso hijo manualmente; podría abordar otros problemas, por ejemplo, un proceso puede comportarse de manera diferente si su salida estándar es un tty pero está fuera de tema.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 sea necesario agregar un archivo grande. Aquí hay una posibilidad usando la línea de comando teminal directamente desde python.
fuente