подпроцесс python для новичков: «ошибка записи: сломанный канал»

Благодаря полезным предложениям, приведенным ниже:

Кажется, это исправлено, когда я

  1. разделяю команды на отдельные вызовы Popen
  2. stderr = subprocess.PIPE в качестве аргумента для каждая цепочка Popen.

Новый код:

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)

Исходное сообщение:

Я слишком долго пытался решить проблему, связав простой подпроцесс. Открыть.

Код:

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())

Вывод для файла ~ Длина 1000 строк:

...
sort: write failed: standard output: Broken pipe
sort: write error

Вывод для файла длиной> 241 строка:

...
sort: fflush failed: standard output: Broken pipe
sort: write error

Вывод для файла длиной <241 строка в порядке.

Я читал документацию и гуглил как сумасшедший, но есть кое-что фундаментальное о модуль подпроцесса, который мне не хватает ... возможно, связан с буферами. Я пробовал p.stdout.flush () и играл с размером буфера и p.wait (). Я' я попытался воспроизвести это с помощью таких команд, как «сон 20; cat meanfile ', но похоже, что это работает без ошибок.

13
задан mathtick 16 March 2014 в 11:58
поделиться