【问题标题】:Python script embedded in bash, does not exit嵌入在 bash 中的 Python 脚本,不退出
【发布时间】:2012-05-26 01:47:40
【问题描述】:

我有一个奇怪的问题。我有一个 bash 脚本,它在其中调用 python 脚本。 python脚本执行成功,但从未完全终止

Bash 脚本内容:

#! /usr/bin/env bash
python python_script.py
echo "bar"

Python 脚本内容:

#Much stuff
sys.exit("The python script just ended")

我希望在终止时看到的是:

>The python script just ended
>bar

我得到的是:

>The python script just ended

如果我键盘中断,bash 会继续:

^C>bar

什么给了?显然,exit 调用正确,并且它与调用 python 脚本的 bash 脚本中的输出语句之间没有任何关系。

(我不一定能详细说明 python 脚本中“很多东西”的工作原理,因为我正在修改我不完全理解的现有代码。我大部分都离开了脚本的工作原理单独,并且修改输出比格式化任何东西都多,但我很乐意尝试为您提供所需的任何其他信息)

【问题讨论】:

  • 你能用更简单的 Python 脚本重现这个吗?
  • 这很奇怪,对我来说它可以工作(在 bash 脚本中只有 sys.exit("The python script...") 和 echo bar)。
  • 如果您从 .py 文件中删除除 sys.exit() 行之外的所有内容,它还会中断吗?如果没有,问题可能出在#Much stuff
  • 如果#Much stuff 中的所有内容都被删除,它确实有效。我只是不确定我修改了什么导致了这种情况。我将原始版本与修改后的版本进行了比较,我能看到的唯一重大变化是打印格式。

标签: python bash terminate continue


【解决方案1】:

sys.exit() 所做的是抛出 SystemExit 类型的异常。如果您的脚本要捕获此异常,它将继续执行超过 sys.exit()

另外,如果您有非守护线程,这些可能会阻止进程终止。

如果是这种情况,您可以turn them into daemon threads,或者以某种方式向他们发出您希望退出脚本的信号,然后让他们自行关闭。

最后是os._exit(),但你不应该诉诸于此。

【讨论】:

  • 有没有办法更彻底地终止脚本?我正在使用的代码确实使用了一些线程。 (顺便谢谢你的快速回答)
  • @TrialbyCode:最干净的可能是将它们变成守护线程。我已经扩展了答案。
  • 我有一个非守护线程正在运行。守护它修复了退出挂断,但对我的输出造成了一些外观损坏,但现在我知道我的问题出在哪里。现在我只需要弄清楚为什么会发生这种情况,因为我根本没有修改那部分代码。非常感谢@aix 的帮助。
【解决方案2】:

以下也有效:

import os
print('Hellow world')
os._exit(os.EX_OK)

在 Ubuntu 中,它会退出终端。另请参阅此链接中的示例Program With the os.exit() Method

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2021-01-17
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多