嵌入bash的Python脚本未能退出

3

我有一个奇怪的问题。我有一个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

出了什么问题?显然,退出已经成功调用,并且在调用Python脚本的Bash脚本中,输出语句之间没有任何东西。

(我可能无法详细说明Python脚本中“很多东西”的工作原理,因为我正在修改我不完全理解的现有代码。我大多数情况下都没有改变脚本的工作方式,只是为了格式而修改了输出,但我很乐意尝试并提供您所请求的任何其他信息)


你能用一个更简单的Python脚本重现这个吗? - robert
很奇怪,对我来说它是有效的(只有在Python脚本中使用sys.exit("The python script...")和在Bash脚本中使用echo bar)。 - Niek de Klein
如果你从.py文件中除去除了sys.exit()行之外的所有内容,它是否仍然出问题?如果没有,问题可能出在#Much stuff某个地方。 - cdlk
如果删除#Much stuff中的所有内容,它确实可以工作。我只是不确定我修改了其中什么导致了这个问题。我将原始版本与我的修改版本进行了比较,唯一显著的更改是打印格式。 - TrialbyCode
2个回答

5

sys.exit() 的作用是抛出一个类型为 SystemExit 的异常。如果你的脚本捕获了这个异常,它将会继续执行 sys.exit() 之后的代码。

此外,如果你有非守护线程,它们可能会阻止进程终止。

如果是这种情况,你可以将它们 转换为守护线程,或者以某种方式向它们发出信号,表明你希望退出脚本,并让它们自行关闭。

最后,还有 os._exit(),但你不应该使用它。


有没有一种更完整地终止脚本的方法?我正在使用的代码确实使用了一些线程。(顺便说一下,谢谢你的快速回答) - TrialbyCode
@TrialbyCode:最好的方法可能是将它们转换为守护线程。我已经扩展了答案。 - NPE
我有一个非守护线程在运行。将其设置为守护进程解决了退出挂起的问题,但对我的输出造成了一些美观上的损害,不过现在我知道了我的问题所在。现在我只需要弄清楚为什么会发生这种情况,因为我根本没有修改代码的那部分。非常感谢@aix的帮助。 - TrialbyCode

0

以下方法也可行:

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

在Ubuntu中,它会退出终端。请参阅此链接中的示例{{link1:使用os.exit()方法的程序}}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接