Me postulo la siguiente versión de Python:¿Cómo cierro un subproceso de Python 2.5.2 Popen una vez que tengo los datos que necesito?
$ /usr/bin/env python --version
Python 2.5.2
estoy corriendo el siguiente código Python para escribir datos desde un subproceso hijo a la salida estándar, y la lectura que en una variable de Python llamada metadata
:
# Extract metadata (snippet from extractMetadata.py)
inFileAsGzip = "%s.gz" % inFile
if os.path.exists(inFileAsGzip):
os.remove(inFileAsGzip)
os.symlink(inFile, inFileAsGzip)
extractMetadataCommand = "bgzip -c -d -b 0 -s %s %s" % (metadataRequiredFileSize, inFileAsGzip)
metadataPipes = subprocess.Popen(extractMetadataCommand, stdin=None, stdout=subprocess.PIPE, shell=True, close_fds=True)
metadata = metadataPipes.communicate()[0]
metadataPipes.stdout.close()
os.remove(inFileAsGzip)
print metadata
el caso de uso es el siguiente, para tirar de los primeros diez líneas de salida estándar a partir del código antes mencionado fragmento:
$ extractMetadata.py | head
aparecerá el error si la tubería I en la cabeza, awk, grep, etc.
El guión termina con el siguiente error:
close failed: [Errno 32] Broken pipe
yo habría pensado que el cierre de las tuberías sería suficiente, pero, obviamente, ese no es el caso.
Este código funciona bien para mí después de ponerlo a utilizar gzip. Si solo está descomprimiendo archivos gzip, ¿por qué está utilizando una herramienta oscura que nadie conoce ("bgzip")? Google encuentra solo un proyecto de años difuntos en SF. Use zcat o, mejor aún, use el módulo gzip. No es probable que obtenga una respuesta a esto si no proporciona una muestra de código que reproduzca el problema. –
He editado la pregunta para mostrar cuál es el caso de uso que desencadena la tubería rota. El código que he proporcionado debería ser suficiente, creo. Si reemplazo "bgzip" por "gzip" obtengo el mismo error. La herramienta "bgzip" es parte de un conjunto denominado SAMtools, que incluye una versión modificada de "gzip" que realiza un acceso aleatorio dentro del archivo. Espero que esto ayude. –