我有以下的Python脚本,似乎都工作,我想如何,除了以下内容:
有没有办法能够在较less的窗口中使用Ctrl + C,而不是在这样做时终止脚本?
#!/usr/bin/python import sys import os import subprocess as sp try: if(len(sys.argv) < 2): print "Choose an EngineID!" engineID = sys.argv[1] logdir='/data/work/silverlocal-%s/log' % engineID logfiles = sorted([ f for f in os.listdir(logdir) if f.startswith('log-%s' % engineID)]) lastlog = (logdir + "/" + logfiles[-1]) os.spawnlpe(os.P_WAIT, 'less', 'less', '+F', '-K', (lastlog), os.environ) except KeyboardInterrupt: pass
如果使用我当前的脚本没有一个好的解决scheme,也许有人可以给我一个更合适的解决scheme,语言并不重要。
干杯,
菲利普
解:
#!/usr/bin/python import sys import os import subprocess as sp import signal if(len(sys.argv) < 2): print "Choose an EngineID!" engineID = sys.argv[1] logdir='/data/awork/silverlocal-%s/log' % engineID logfiles = sorted([ f for f in os.listdir(logdir) if f.startswith('log-%s' % engineID)]) lastlog = (logdir + "/" + logfiles[-1]) old_action = signal.signal(signal.SIGINT, signal.SIG_IGN) os.spawnlpe(os.P_WAIT, 'less', 'less', '+F', (lastlog), os.environ) signal.signal(signal.SIGINT, old_action) # restore old signal disposition print("I'm still running!")
您可以尝试忽略SIGINT
信号并删除-K
less选项:
#!/usr/bin/python import sys import os import signal import subprocess as sp try: if(len(sys.argv) < 2): print "Choose an EngineID!" engineID = sys.argv[1] logdir='/data/work/silverlocal-%s/log' % engineID logfiles = sorted([ f for f in os.listdir(logdir) if f.startswith('log-%s' % engineID)]) lastlog = (logdir + "/" + logfiles[-1]) old_action = signal.signal(signal.SIGINT, signal.SIG_IGN) os.spawnlpe(os.P_WAIT, 'less', 'less', '+F', (lastlog), os.environ) signal.signal(signal.SIGINT, old_action) # restore old signal disposition except KeyboardInterrupt: pass print("I'm still running!")
try...except
不再有用,所以你可以删除它。
说实话,我对信号处理的记忆有点模糊,我不能100%确定这是为什么这样工作。 显然忽略SIGINT(由Ctrl + C生成)阻止Python作用于信号,但生成的过程应该继承父信号的处置。 可能less
设置自己的信号处理程序,也许这就是为什么它的工作原理。