Подпроцесс — Grep Broken Pipe

Python 2.4.x здесь.

Ударил меня по голове, пытаясь заставить подпроцесс работать с glob.

Ну вот и проблемная зона.

def runCommands(thecust, thedevice):
    thepath='/smithy/%s/%s' % (thecust,thedevice)
    thefiles=glob.glob(thepath + '/*.smithy.xml')
    p1=subprocess.Popen(["grep", "<record>"] + thefiles, stdout=subprocess.PIPE)
    p2=subprocess.Popen(['wc -l'], stdin=p1.stdout, stdout=subprocess.PIPE)
    p1.stdout.close()
    thecount=p2.communicate()[0]
    p1.wait()

Я получаю многочисленные ошибки "grep: записывающий вывод: Broken pipe" на экране.

Это должно быть что-то простое, чего мне не хватает, я просто не могу это заметить. Есть идеи?

Заранее спасибо.


person Chasester    schedule 31.05.2012    source источник
comment
Есть пара (очень приятных) оберток вокруг подпроцесса, которые сделают вашу жизнь намного проще, например pbs и плюмбум.   -  person Paulo Scardine    schedule 31.05.2012
comment
они выглядят действительно круто - к сожалению, я не в той среде, где я могу добавлять модули помимо модулей 2.4.   -  person Chasester    schedule 31.05.2012


Ответы (2)


Проблема здесь в том, что для p2 ваш список аргументов должен быть ['wc', '-l'] вместо ['wc -l'].

В настоящее время он ищет исполняемый файл с именем 'wc -l' для запуска и не находит его, поэтому p2 немедленно дает сбой, и к p1.stdout ничего не подключено, что приводит к ошибкам сломанного канала.

Попробуйте следующий код:

def runCommands(thecust, thedevice):
    thepath='/smithy/%s/%s' % (thecust,thedevice)
    thefiles=glob.glob(thepath + '/*.smithy.xml')
    p1=subprocess.Popen(["grep", "<record>"] + thefiles, stdout=subprocess.PIPE)
    p2=subprocess.Popen(['wc', '-l'], stdin=p1.stdout, stdout=subprocess.PIPE)
    p1.stdout.close()
    thecount=p2.communicate()[0]
    p1.wait()
person Andrew Clark    schedule 31.05.2012

Кажется, это потому, что вы закрываете p1.stdout до того, как grep закончит вывод. Может быть, вы хотели закрыть pt.stdin? Однако, похоже, нет причин закрывать ни один из них, поэтому я бы просто удалил оператор p1.stdout.close().

person Matt    schedule 31.05.2012
comment
Взгляните на документы: docs.python.org/library/ -- Мне кажется, это сделано правильно. - person mgilson; 31.05.2012