如何在执行 Ruby 脚本的 Python 脚本中捕获 Ctrl+C?

How to capture Ctrl+C in a Python script which executes a Ruby script?

我正在从 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 脚本停止时打印 "should not be here"。

有没有一种方法可以在我的 Python 脚本中捕获 CTRL+C,即使它发生在Ruby 脚本?如果需要进一步解释,请告诉我。

在 Python 中,SIGINT 引发了 a special exception,您可以捕获它。但是,如果 child 消耗 SIGINT 信号并响应它,它不会到达 parent 进程。然后你需要找到一种不同的方式来从 child 到 parent 关于 为什么 child 退出。这通常是退出代码。

无论如何,您应该开始用 subprocess 模块中的工具替换 os.system()(这已记录在案,只需去阅读 the subprocess docs 中的内容)。当它在检索 SIGINT 后退出时,您可以在 child 中发出特定的退出代码,并在 parent 中分析退出代码。然后,您可以在 child 进程终止后立即有条件地退出 parent,具体取决于 child 的退出代码。

示例:您的 child(Ruby 程序)在检索 SIGINT 后以代码 15 退出。在 parent(Python 程序)中,您将执行以下操作:

p = subprocess.Popen(...)
out, err = p.communicate(...)
if p.returncode == 15:
    sys.exit(1)
print "should not be here"

在您的 Ruby 脚本中:

trap('SIGINT') { exit 1 }

在您的 Python 脚本中,os.system() 应该 return 将值传递给 exit。您可以根据需要使用重定向控制流,例如呼叫 sys.exit().