Shell 脚本中调用 Python 脚本时报错并退出

在许多场景下,我们需要在 shell 脚本中调用 Python 脚本,以完成特定的任务。然而,当 Python 脚本遇到错误时,如何让 shell 脚本能够检测到错误并及时退出呢?本文将为大家介绍相关的代码示例及其实现原理。

1. Shell 脚本与 Python 脚本的基本调用

可以通过在 shell 脚本中使用 Python 命令直接调用 Python 脚本,以下是基本的示例:

#!/bin/bash

# 调用 Python 脚本
python my_script.py

在这个简单的 shell 脚本中,我们调用了 my_script.py 这个 Python 脚本。如果 Python 脚本正常运行,shell 脚本将继续执行后续的命令。

2. 错误处理

当 Python 脚本发生错误时,我们希望 shell 脚本能够捕获该错误并优雅地退出。为此,我们可以使用 $? 特殊变量,它保存了上一个命令的退出状态。一般来说,退出状态为0表示成功,非0值表示失败。

以下是一个示例,展示如何在 shell 脚本中判断 Python 脚本是否成功执行:

#!/bin/bash

# 调用 Python 脚本
python my_script.py

# 检查退出状态
if [ $? -ne 0 ]; then
  echo "Python 脚本执行失败,退出..."
  exit 1
fi

echo "Python 脚本执行成功!"

上述代码中,如果 my_script.py 执行失败,shell 脚本将输出错误信息并退出。

3. Python 脚本中的错误处理

在写 Python 脚本时,我们也应该做好异常处理,以便能够返回一个非0的退出状态。在 Python 中,可以使用 try-except 块来捕获异常,如下所示:

# my_script.py
try:
    # 模拟可能发生错误的代码
    result = 10 / 0  # 除以零错误
except Exception as e:
    print(f"发生错误: {e}")
    exit(1)  # 返回非零状态以表示失败

由于发生了除以零的错误,程序会捕获这个异常并返回一个退出状态1。

4. 结合示例

以下是将 shell 脚本和 Python 脚本结合在一起的完整流程示例:

Shell 脚本 run_script.sh:

#!/bin/bash

# 调用 Python 脚本
python my_script.py

# 检查退出状态
if [ $? -ne 0 ]; then
  echo "Python 脚本执行失败,退出..."
  exit 1
fi

echo "Python 脚本执行成功!"

Python 脚本 my_script.py:

try:
    result = 10 / 0  # 故意制造错误
except Exception as e:
    print(f"发生错误: {e}")
    exit(1)  # 返回非零状态

5. 序列图示例

接下来,我们通过序列图来描述这个过程:

sequenceDiagram
    participant Shell
    participant Python

    Shell->>Python: 调用 my_script.py
    Python-->>Shell: 发生错误
    Shell->>Shell: 检查退出状态
    Shell-->>Shell: 输出错误信息, 退出

结论

通过上述示例,我们能够实现 shell 脚本中调用 Python 脚本的同时,对错误进行捕获和处理。这不仅提高了脚本的健壮性,还能确保在错误发生时给予用户明确的反馈。使用正确的错误处理机制,可以大大减少自动化脚本中潜在的问题。希望这篇文章对您在编写脚本时有所帮助!