Python子进程、子shell与重定向
我想用Python的subprocess模块来实现一些神奇的功能,比如子shell和重定向,但似乎不太奏效,系统总是抱怨有意外的符号,主要是括号的问题。举个例子,命令
cat <(head tmp)
当我把它传给subprocess时,结果是这样的
>>> 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
这个 <(head tmp)
的写法是一个叫做“进程替换”的 bash
特性。基本的、通用的 /bin/sh
是不支持这个特性的。即使在一些系统上,/bin/sh
和 /bin/bash
是同一个程序,当你用普通的 /bin/sh
来调用时,它也不允许使用这个特性,这样你就不会不小心依赖一个不通用的特性。
>>> subprocess.Popen(["/bin/bash", "-c", "cat <(head tmp)"])
<subprocess.Popen object at 0x1004cca50>