Ctrl C 不会终止 Python 中的循环子进程
Ctrl C won't kill looped subprocess in 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+C 时, KeyboardInterrupt
异常也由与 print "Command Failed"
相同的异常处理程序处理,并且现在已在那里正确处理,程序流继续通过 for 循环。你应该做的是:
- 将
except:
替换为except Exception:
,这样就不会陷入KeyboardInterrupt
异常,这样任何时候Ctrl+C 按下程序将终止(包括未卡在某些不可终止状态的子进程);
- 在
print
语句之后,break
退出循环以防止进一步执行,如果这是您希望此程序执行的预期行为。
我觉得 Ctrl + Z 也可以帮你把执行推到后台挂起
你可以抓住 KeyboardInterrupt
,这样你就可以用任何你想要的方式处理 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 KeyboardInterrupt as e:
print "Interrupted"
sys.exit(1)
except:
print "Command Failed"
不过我同意其他发帖人的观点,你的例外太模糊了,你应该更具体地说明什么可以失败,什么不能失败。
是否有正确的方法来创建一个脚本,该脚本循环遍历文件夹中的文件并执行可以使用 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+C 时, KeyboardInterrupt
异常也由与 print "Command Failed"
相同的异常处理程序处理,并且现在已在那里正确处理,程序流继续通过 for 循环。你应该做的是:
- 将
except:
替换为except Exception:
,这样就不会陷入KeyboardInterrupt
异常,这样任何时候Ctrl+C 按下程序将终止(包括未卡在某些不可终止状态的子进程); - 在
print
语句之后,break
退出循环以防止进一步执行,如果这是您希望此程序执行的预期行为。
我觉得 Ctrl + Z 也可以帮你把执行推到后台挂起
你可以抓住 KeyboardInterrupt
,这样你就可以用任何你想要的方式处理 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 KeyboardInterrupt as e:
print "Interrupted"
sys.exit(1)
except:
print "Command Failed"
不过我同意其他发帖人的观点,你的例外太模糊了,你应该更具体地说明什么可以失败,什么不能失败。