2012-05-18 63 views
3

我遇到一个奇怪的问题。我有一个bash脚本,它正在调用一个python脚本。 - Python脚本执行成功,但从来没有完全终止Python脚本嵌入在bash中,不会退出

内容bash脚本的:Python脚本的

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

内容:

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

我希望看到终端会是怎样:

>The python script just ended 
>bar 

我反而得到的是:

>The python script just ended 

如果我的键盘中断,在bash继续为:

^C>bar 

是怎么回事?很显然,出口调用正确,并且在bash脚本中没有任何内容和输出语句之间有任何调用python脚本的东西。 (我不一定给出关于python脚本中“很多东西”的工作细节,因为我正在修改我不完全理解的现有代码。脚本和修改输出比格式更重要,但我很乐意尝试并向您提供所需的任何其他信息)

+0

你能用一个更简单的Python脚本重现吗? – robert

+0

这很奇怪,对我来说它是有效的(只有sys.exit(“Python脚本...”)和回显栏在bash脚本中)。 –

+0

如果您从.py文件中的'sys.exit()'行中移除所有内容,它仍然会中断吗?如果不是的话,问题可能出现在'#Much stuff'的某个地方# – cdlk

回答

5

sys.exit()所做的是抛出SystemExit类型的异常。如果您的脚本要捕获此异常,则它将继续执行sys.exit()。另外,如果你有非守护线程,这些可能会阻止进程终止。

如果是这种情况,您可以选择turn them into daemon threads,或者以某种方式告知他们您希望退出脚本,并让他们自己关闭。

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

+0

有没有办法更完全地终止脚本?我正在使用的代码确实使用了一些线程。 (谢谢你的快速回答) – TrialbyCode

+0

@TrialbyCode:最干净的可能是把它们变成守护线程。我已经扩大了答案。 – NPE

+0

我有一个非守护线程正在运行。守护它固定了出口挂断,但是对我的输出造成了一些外观损坏,但是现在我知道我的问题在哪里了。现在我只需要弄清楚为什么会发生这种情况,因为我根本没有修改代码段。非常感谢您的帮助@aix。 – TrialbyCode