Python子进程、子shell与重定向

5 投票
1 回答
3914 浏览
提问于 2025-04-17 02:13

我想用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>

撰写回答