Подпроцесс Python, подоболочки и перенаправление

Я хочу использовать магию подоболочек и перенаправления с модулем подпроцесса python, но, похоже, это не работает, жалобы на неожиданные токены указаны в скобках. Например, команда

cat <(head tmp)

при передаче в подпроцесс дает это

>>> subprocess.Popen("cat <(head tmp)", shell=True)
<subprocess.Popen object at 0x2b9bfef30350>
>>> /bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `cat <(head tmp)'

person pythonic metaphor    schedule 13.09.2011    source источник
comment
Обратите внимание, что ваши ошибки исходят от /bin/sh. Я думаю, что синтаксис может быть только с in bash. Вы хотите, чтобы подпроцесс запускал bash? Это вопрос?   -  person S.Lott    schedule 13.09.2011
comment
@ S.Lott Я думал, что в моей установке sh был bash. Конечно, если бы я сделал man sh, всплывающая справочная страница была bash. Скотт Лэмб указал, что при вызове как sh эта функция недоступна, поэтому в некотором смысле да, я хотел, чтобы она работала как bash, хотя я думал, что она уже есть.   -  person pythonic metaphor    schedule 14.09.2011
comment
И почему вы тратите деньги на оболочку, когда Python может делать то, что вы хотите?   -  person bash-o-logist    schedule 14.09.2011


Ответы (1)


Синтаксис <(head tmp) представляет собой функцию bash, называемую "заменой процесса". Базовый/портативный /bin/sh не поддерживает его. (Это верно даже для систем, где /bin/sh и /bin/bash являются одной и той же программой; она не позволяет использовать эту функцию при вызове как обычная /bin/sh, поэтому вы не будете непреднамеренно зависеть от непереносимой функции.)

>>> subprocess.Popen(["/bin/bash", "-c", "cat <(head tmp)"])
<subprocess.Popen object at 0x1004cca50>
person Scott Lamb    schedule 13.09.2011