从 python 异常中终止 Bash 脚本

bom*_*ant 5 python bash shell subprocess sh

我有一个 shell 脚本在里面调用 Python。

#! /bin/bash

shopt -s extglob
echo "====test===="
~/.conda/envs/my_env/bin/python <<'EOF'

import sys
import os


try:
    print("inside python")
    x = 2/0
except Exception as e:
    print("Exception: %s" % e)
    sys.exit(2)
print("at the end of python")
EOF
echo "end of script"
Run Code Online (Sandbox Code Playgroud)

如果我执行此命令,下面的行仍然会被打印。

"end of script"
Run Code Online (Sandbox Code Playgroud)

我想在python脚本的异常块中退出shell并让脚本无法到达EOF

有没有办法subprocessexcept上面的块中创建并杀死 a ,这将杀死整个 shell 脚本?

我可以生成一个虚拟子进程并通过杀死整个 shell 脚本来在异常块内杀死它吗?

任何例子都会有帮助。提前致谢。

Jea*_*bre 3

从 shell 脚本中,您有 2 个选项:

  • set -e:所有错误退出脚本
  • 检查 python 子命令返回代码,如果非零则中止

(也许更多细节在这里:如果任何命令返回非零值,则中止 shell 脚本?

现在,如果您不想更改 shell 脚本的处理方式,您可以获取 python 脚本的父进程并终止它:

except Exception as e:
    import os,signal,sys
    print("Exception: %s" % e)
    os.kill(os.getppid(),signal.SIGTERM)
    sys.exit(2)
Run Code Online (Sandbox Code Playgroud)

如果你在 Windows 上需要这个,这不起作用(os.kill不存在),你必须调整它来调用taskkill

subprocess.call(["taskkill","/F","/PID",str(os.getppid())])
Run Code Online (Sandbox Code Playgroud)

现在我想说杀死父进程是不好的做法。除非您不控制该父进程的代码,否则您应该尝试优雅地处理退出。