Mik*_*ham 8 python bash subprocess pipeline
我有一个简短的bash脚本 foo.sh
#!/bin/bash
cat /dev/urandom | tr -dc 'a-z1-9' | fold -w 4 | head -n 1
Run Code Online (Sandbox Code Playgroud)
当我直接从shell运行它时,它运行正常,完成时退出
$ ./foo.sh
m1un
$
Run Code Online (Sandbox Code Playgroud)
但是当我从Python运行它时
$ python -c "import subprocess; subprocess.call(['./foo.sh'])"
ygs9
Run Code Online (Sandbox Code Playgroud)
它输出线但然后永远挂起.造成这种差异的原因是什么?
将trap -p命令添加到bash脚本,停止挂起的python进程并运行ps显示正在发生的事情:
$ cat foo.sh
#!/bin/bash
trap -p
cat /dev/urandom | tr -dc 'a-z1-9' | fold -w 4 | head -n 1
$ python -c "import subprocess; subprocess.call(['./foo.sh'])"
trap -- '' SIGPIPE
trap -- '' SIGXFSZ
ko5o
^Z
[1]+ Stopped python -c "import subprocess; subprocess.call(['./foo.sh'])"
$ ps -H -o comm
COMMAND
bash
python
foo.sh
cat
tr
fold
ps
Run Code Online (Sandbox Code Playgroud)
因此,subprocess.call()在SIGPIPE屏蔽信号的情况下执行命令.当head它的工作并退出,剩下的过程没有收到断管信号并不会终止.
解释了手头的问题,很容易在python bugtracker中找到bug,结果证明是问题#1652.