Gracias a las sugerencias útiles a continuación:novato pitón subproceso: "error de escritura: Tubo roto"
Por lo tanto, parece estar fijo cuando
- comandos separados en llamadas individuales a Popen
- stderr = subproceso.PIPE como argumento para cada cadena de Popen.
el nuevo código:
import subprocess
import shlex
import logging
def run_shell_commands(cmds):
""" Run commands and return output from last call to subprocess.Popen.
For usage see the test below.
"""
# split the commands
cmds = cmds.split("|")
cmds = list(map(shlex.split,cmds))
logging.info('%s' % (cmds,))
# run the commands
stdout_old = None
stderr_old = None
p = []
for cmd in cmds:
logging.info('%s' % (cmd,))
p.append(subprocess.Popen(cmd,stdin=stdout_old,stdout=subprocess.PIPE,stderr=subprocess.PIPE))
stdout_old = p[-1].stdout
stderr_old = p[-1].stderr
return p[-1]
pattern = '"^85567 "'
file = "j"
cmd1 = 'grep %s %s | sort -g -k3 | head -10 | cut -d" " -f2,3' % (pattern, file)
p = run_shell_commands(cmd1)
out = p.communicate()
print(out)
Post original:
he pasado demasiado tiempo tratando de resolver un problema de tuberías de un subprocess.Popen sencilla.
Código:
import subprocess
cmd = 'cat file | sort -g -k3 | head -20 | cut -f2,3' % (pattern,file)
p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
for line in p.stdout:
print(line.decode().strip())
de salida para el archivo ~ 1000 líneas de longitud:
...
sort: write failed: standard output: Broken pipe
sort: write error
salida de archivos> 241 líneas de longitud:
...
sort: fflush failed: standard output: Broken pipe
sort: write error
de salida para el archivo de < 241 las líneas de longitud están bien.
He estado leyendo los documentos y buscando en Google como loco, pero hay algo fundamental sobre el módulo de subproceso que me falta ... tal vez para hacer con los búferes. Probé p.stdout.flush() y jugué con el tamaño del búfer y p.wait(). Intenté reproducir esto con comandos como 'dormir 20'; cat moderatefile 'pero parece que se ejecuta sin error.
... y p2.communicate() también funciona, pero creo que puede causar problemas si el resultado es grande. – mathtick
'Nuevo código' muy útil. Me encanta que pueda usar el mismo comando de tuberías que utilicé para probar en el caparazón. Dos sugerencias: 1) make plural: run_shell_commands 2) eliminar, comentar o agregar debug = false alrededor de las instrucciones print dentro de la función – PeterVermont
Gracias. Se encontró con el mismo problema de tubería rota con archivos de un cierto tamaño. Usó su código y funciona como un encanto. – poof