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

如何捕获Ctrl+;在执行Ruby脚本的Python脚本中使用C?,python,ruby,scripting,ctrl,Python,Ruby,Scripting,Ctrl,我正在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脚本中执行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脚本中?如果需要进一步的解释,请告诉我。

在Python中,SIGINT会引发您可以理解的问题。但是,如果子进程使用SIGINT信号并对其作出响应,则它不会到达父进程。然后,您需要找到一种不同的方式,让孩子与家长沟通孩子退出的原因。这通常是退出代码

在任何情况下,您都应该开始使用
子流程
模块中的工具替换
os.system()
(这是有文档记录的,请在中阅读)。您可以在检索到SIGINT后退出时在子级中发出某个退出代码,并在父级中分析该退出代码。然后,您可以在子进程终止后立即有条件地退出父进程,具体取决于子进程的退出代码

示例:您的子(Ruby程序)在检索SIGINT后退出,代码为15。在父级(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()
应该返回传递给
exit
的值。您可以根据需要使用它重定向控制流,例如调用
sys.exit()