example - subprocess python español
añadir subprocess.Popen la salida al archivo? (3)
¿Los datos en el archivo realmente se sobrescriben? En mi host Linux tengo el siguiente comportamiento: 1) la ejecución de su código en el directorio separado obtiene:
$ cat test
test
test.py
test.py~
Hello
2) si agrego outfile.flush()
después de outfile.write(''Hello'')
, los resultados son ligeramente diferentes:
$ cat test
Hello
test
test.py
test.py~
Pero el archivo de salida tiene Hello
en ambos casos. Sin el flush()
explícito flush()
búfer de stdout de llamada se vaciará cuando finalice el proceso de Python. ¿Dónde está el problema?
Puedo redireccionar con éxito mi salida a un archivo, sin embargo, esto parece sobrescribir los datos existentes del archivo:
import subprocess
outfile = open(''test'',''w'') #same with "w" or "a" as opening mode
outfile.write(''Hello'')
subprocess.Popen(''ls'',stdout=outfile)
eliminará la línea ''Hello''
del archivo.
Supongo que una solución es almacenar el resultado en otro lugar como una cadena o algo (no será demasiado largo), y adjuntarlo manualmente con outfile.write(thestring)
, pero me preguntaba si me falta algo en el módulo que Facilita esto.
Bueno, el problema es si desea que el encabezado sea el encabezado, entonces debe vaciarse antes de que el resto de la salida se escriba en el archivo: D
Seguro que puedes adjuntar la salida de subprocess.Popen
a un archivo, y hago un uso diario de él. Así es como lo hago:
log = open(''some file.txt'', ''a'') # so that data written to it will be appended
c = subprocess.Popen([''dir'', ''/p''], stdout=log, stderr=log, shell=True)
(por supuesto, este es un ejemplo ficticio, no estoy usando un subprocess
para listar archivos ...)
Por cierto, otros objetos que se comportan como archivo (con el método write()
en particular) podrían reemplazar este elemento de log
, por lo que puede almacenar en búfer la salida y hacer lo que quiera con ella (escribir en archivo, mostrar, etc.) [pero esto Parece que no es tan fácil, mira mi comentario más abajo].
Nota: lo que puede ser engañoso, es el hecho de que el subprocess
, por alguna razón que no entiendo, escribirá antes de lo que quiere escribir. Entonces, aquí está la manera de usar esto:
log = open(''some file.txt'', ''a'')
log.write(''some text, as header of the file/n'')
log.flush() # <-- here''s something not to forget!
c = subprocess.Popen([''dir'', ''/p''], stdout=log, stderr=log, shell=True)
Así que la sugerencia es: ¡no se olvide de flush
la salida!