我有一个简短的 bash 脚本 foo.sh
#!/bin/bash
cat /dev/urandom | tr -dc 'a-z1-9' | fold -w 4 | head -n 1
当我直接从 shell 运行它时,它运行良好,完成后退出
$ ./foo.sh
m1un
$
但是当我从 Python 运行它时
$ python -c "import subprocess; subprocess.call(['./foo.sh'])"
ygs9
它输出该行,但随后就永远挂起。是什么导致了这种差异?
最佳答案
将 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
因此,subprocess.call()
执行命令并屏蔽了 SIGPIPE
信号。当 head
完成其工作并退出时,其余进程不会收到 broken pipe 信号并且不会终止。
有了手头问题的解释,很容易找到python bugtracker中的bug,原来是issue#1652 .
关于python - 从终端运行和从 Python 运行时脚本的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39397034/