无法通过 Ctrl+C 或 Ctrl+Break 终止 Python 脚本

随机Eli

我有这个简单的 python 脚本被调用myMain.py来自动执行另一个带有增量编号的 python 程序,我在 CentOS 7 上运行它:

#!/usr/bin/python

import os
import sys
import time

def main():
    step_indicator = ""
    arrow = ">"
    step = 2
    try:
        for i in range(0,360, step):
            step_percentage = float(i)/360.0 * 100
            if i % 10 == 0:
                step_indicator += "="
            os.system("python myParsePDB.py -i BP1.pdb -c 1 -s %s" % step)
            print("step_percentage%s%s%.2f" % (step_indicator,arrow,step_percentage)+"%")
    except KeyboardInterrupt:
        print("Stop me!")
        sys.exit(0)


if __name__ == "__main__":
    main()

现在我只知道这个脚本是单线程安全的,但我不能用Ctrl+C键盘中断来终止它

我已经阅读了一些相关问题:例如无法使用 Ctrl-C 杀死 Python 脚本使用 ctrl+c 停止 python我意识到这Ctrl+Z不会终止进程,它只会暂停进程并将进程保持在后台。Ctrl+Break也适用于我的情况,我认为它只会终止我的主线程但保留子进程。

我还注意到调用os.system()将从当前执行的进程中产生一个子进程。同时,我也有os文件 I/O 函数并且os.system("rm -rf legacy/*")会被调用,myParsePDB.py这意味着这个myParsePDB.py子进程也会产生子进程。然后,如果我要赶Ctrl+CmyMain.py,我应该只守护进程myMain.py或者我应该守护每一个过程,当他们产卵?

随机Eli

这是在处理信号时可能会出现的普遍问题。Python 信号也不例外,它是操作系统信号的包装器。因此,python中的信号处理取决于操作系统、硬件和许多条件。但是,如何处理这些问题是相似的。

根据本教程,我将引用以下段落:信号 - 接收异步系统事件的通知

信号是一种操作系统功能,它提供了一种方法来通知您的程序事件并使其异步处理。它们可以由系统本身生成,也可以从一个进程发送到另一个进程。由于信号会中断程序的正常流程,因此如果在中间接收到信号,则某些操作(尤其是 I/O)可能会产生错误。

信号由整数标识并在操作系统 C 头文件中定义。Python 将适合平台的信号公开为信号模块中的符号。对于下面的示例,我将使用 SIGINT 和 SIGUSR1。两者通常都是为所有 Unix 和类 Unix 系统定义的。

在我的代码中:

os.system("python myParsePDB.py -i BP1.pdb -c 1 -s %s" % step)for 循环内部将执行一段时间,并将在 I/O 文件上花费一些时间。如果键盘中断传递太快,并且在写入文件后没有异步捕获,则该信号可能在操作系统中被阻塞,因此我的执行仍将保留tryfor循环子句。(在执行期间检测到的错误称为异常并且不是无条件致命的:Python 错误和异常)。

因此,使它们异步的最简单方法是等待:

try:
    for i in range(0,360, step):
        os.system("python myParsePDB.py -i BP1.pdb -c 1 -s %s" % step)
        time.sleep(0.2)
except KeyboardInterrupt:
    print("Stop me!")
    sys.exit(0)

这可能会影响性能,但它保证在等待执行后可以捕获信号os.system()如果需要更好的性能,您可能还想使用其他同步/异步函数来解决问题。

更多 unix 信号参考,还请查看:Linux Signal Manpage

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Bash脚本不会以Ctrl + C终止

来自分类Dev

使用Ctrl-C终止程序而不终止父脚本

来自分类Dev

使用Ctrl-C终止程序而不终止父脚本

来自分类Dev

无法使用Ctrl + c终止Shell命令

来自分类Dev

当我使用Ctrl + c终止Python脚本时,内部会发生什么情况?

来自分类Dev

当我使用Ctrl + c终止Python脚本时,内部会发生什么情况?

来自分类Dev

使用CTRL-C终止由bash脚本启动的进程

来自分类Dev

Ctrl-C并不总是终止shell脚本

来自分类Dev

在Ctrl + C上,终止当前命令,但继续执行脚本

来自分类Dev

按ctrl + c后脚本不会终止

来自分类Dev

在bash脚本中使用Ctrl-C陷阱终止ssh

来自分类Dev

Ctrl + C进程终止而不终止终端

来自分类Dev

Python ctrl + c,如果提前终止,则执行功能

来自分类Dev

如何终止类似于ctrl-c的python进程?

来自分类Dev

Ctrl + C无法终止进程时该怎么办?

来自分类Dev

带循环的程序不会以CTRL + C终止

来自分类Dev

为什么选择ctrl + c终止进程?

来自分类Dev

通过CTRL + X或CTRL + C中止时,继续执行bash脚本

来自分类Dev

无法捕获 ctrl-c 以退出函数退出 bash 脚本

来自分类Dev

在脚本中捕获脚本的Ctrl-C

来自分类Dev

终止简单的python服务器不会使用ctrl + C关闭

来自分类Dev

在python中按CTRL + C时如何优雅地终止循环

来自分类Dev

CTRL + D与CTRL + C

来自分类Dev

在Ctrl + C之后继续脚本

来自分类Dev

在AWK脚本中陷阱Ctrl-C

来自分类Dev

使用“ ctrl c”终止程序时,程序不会停止

来自分类Dev

Windows中的flask-tornado CTRL + C终止

来自分类Dev

终止信号或Linux上的Ctrl + C之类的中断

来自分类Dev

Ctrl + C不会终止终端(osx bash)程序的“屏幕”

Related 相关文章

热门标签

归档