python - Ctrl C 不会杀死 Python 中的循环子进程
问题描述
有没有合适的方法来创建一个循环遍历文件夹中的文件并执行可以用 Ctrl C 从外部杀死的子进程的脚本?我在管道中嵌入了以下内容,当主进程被杀死时,无法从命令行按 Ctrl C 。
示例脚本:
import subprocess
import os
import sys
input_directory = sys.argv[1]
for file in os.listdir(os.path.abspath(input_directory)):
output = file + "_out.out"
command = ['somescript.py', file, output]
try:
subprocess.check_call(command)
except:
print "Command Failed"
然后我会执行程序:
Example_script.py /path/to/some/directory/containing/files/
当它在循环时,如果我看到命令失败,我想使用 Ctrl C。但是,尽管主脚本已经用 Ctrl C 破坏了,但它失败并继续运行其他子进程。有没有合适的方法来写这样的东西可以用 Ctrl C 杀死孩子(额外的子进程)吗?
非常感谢任何帮助或指出我的方向。我目前正在寻找一种好的方法。
解决方案
您在 try/except 块中的内容过于宽松,因此当按下Ctrl+时,异常也由与 that 相同的异常处理程序处理,并且现在在那里正确处理,程序的流程是继续通过 for 循环。你应该做的是:CKeyboardInterrupt
print "Command Failed"
- 替换
except:
为,except Exception:
这样KeyboardInterrupt
异常就不会被捕获,这样只要按下Ctrl+ C,程序就会终止(包括没有卡在某些不可终止状态的子进程); - 在
print
语句之后,break
退出循环以防止发生进一步的执行,如果这是您希望该程序执行的预期行为。
推荐阅读
- mongodb - MongoDB /AWS documentdb 索引利用率有无限制
- javascript - then(() => { 不要在 TypeScript 中发送值
- c++ - 如何为 mlpack 的 kmeans 构造 HamerlyKmeans 对象
- javascript - 即使在“导出默认值”之后,也无法在没有大括号的情况下导入模块
- azure - 将 Azure 函数作为 Windows 服务运行以进行调试
- algorithm - Google 如何如此快速地检查用户名的可用性?
- python - 在 Python 中重命名列表对象
- bash - Postgres使用pgpass和别名轻松登录不起作用
- opengl - 使用 OpenGL 绘制数百万个顶点的时间序列
- mysql - 使用 if 条件运行 prepare 语句时出现 1064 错误