Подпроцесс Python, подоболочки и перенаправление - PullRequest
5 голосов
/ 13 сентября 2011

Я хочу использовать магию подоболочек и перенаправления с модулем подпроцесса 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)'

1 Ответ

11 голосов
/ 14 сентября 2011

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

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