从终端运行并从Python运行时,脚本的工作方式不同

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)

它输出线但然后永远挂起.造成这种差异的原因是什么?

Leo*_*eon 8

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.