是否有正确的方法来创建循环文件夹中的文件并执行可以使用Ctrl C外部杀死的子进程的脚本?我在管道中嵌入了类似下面的内容,当主进程被终止时,无法从命令行中按Ctrl键。
示例脚本:
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
退出循环以防止进一步执行,如果这是您希望此程序执行的预期行为。您可以捕获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 + Z还可以帮助您将执行推送到后台并暂停。