我正在Python脚本中执行Ruby脚本。这是我的Python脚本" script007.py"看起来像:
.
.
.
os.system("ruby script.rb") #executing ctrl+c here
print "should not be here"
.
.
.
当Ruby脚本运行时,我执行 CTRL + C 但它只是停止" script.rb"继续使用" script007.py"的其余部分。我知道这是因为它打印"不应该在这里"当Ruby脚本停止时。
有没有办法在Python脚本中捕获 CTRL + C ,即使它发生在Ruby脚本中?如果需要进一步解释,请告诉我。
答案 0 :(得分:3)
在Python中,SIGINT引发了a special exception,你可以捕获它。但是,如果子进程消耗SIGINT信号并对其作出响应,则它不会到达父进程。然后,你需要找到一种不同的方式,从孩子到父母沟通为什么孩子退出。这通常是退出代码。
在任何情况下,您都应该开始使用os.system()
模块中的工具替换subprocess
(这是记录在案的,只需在the subprocess
docs中阅读此内容)。在检索到SIGINT后退出时,您可以在子进程中发出某个退出代码,并分析父进程中的退出代码。然后,您可以在子进程终止后有条件地退出父进程,具体取决于子进程的退出代码。
示例:您的子(Ruby程序)在检索SIGINT后退出代码15。在父(Python程序)中,您将执行以下行:
p = subprocess.Popen(...)
out, err = p.communicate(...)
if p.returncode == 15:
sys.exit(1)
print "should not be here"
答案 1 :(得分:1)
在你的Ruby脚本中:
trap('SIGINT') { exit 1 }
在Python脚本中,os.system()
应返回传递给exit
的值。您可以根据需要使用重定向控制流,例如,致电sys.exit()
。