gpt4 book ai didi

python - 从终端运行和从 Python 运行时脚本的工作方式不同

转载 作者:太空狗 更新时间:2023-10-29 20:55:42 28 4
gpt4 key购买 nike

我有一个简短的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com