在键盘中断后获取子进程的输出



我想将用户执行键盘中断后子进程的最后一个输出存储到变量中。我的问题主要是一个没有结束的子流程,即下面示例中的尾部。这是我的代码:

class Testclass:
def Testdef(self):
try:
global out
print "Tail running"
tail_cmd='tail -f log.Reconnaissance'
proc = subprocess.Popen([tail_cmd], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
except KeyboardInterrupt:
print("KeyboardInterrupt received, stopping…")
finally:
print "program output:", out
if __name__ == "__main__":
app = Testclass()
app.Testdef()

下面是它的输出,我现在还不明白。

Tail running
program output:
Traceback (most recent call last):
File "./2Test.py", line 19, in <module>
app.Testdef()
File "./2Test.py", line 15, in Testdef
print "program output:", out
NameError: global name 'out' is not defined

out未定义表示进程proc.communicate()未返回任何值,否则它将填充您的元组(out, err)。现在要弄清楚communicate()方法是否应该返回,或者更可能的是,键盘中断是否只是简单地杀死了它,从而阻止了out的定义。


我假设您导入了subprocess模块,但请确保先导入。我在没有使用global outtry语句的情况下重写了您的程序。

import subprocess
class Testclass:
def __init__(self,out):    # allows you to pass in the value of out
self.out = out    # makes out a member of this class
def Testdef(self):
print("Tail running")
tail_cmd='tail -f log.Reconnaissance'
proc = subprocess.Popen([tail_cmd], stdout=subprocess.PIPE, shell=True)
# Perhaps this is where you want to implement the try:
(self.out, err) = proc.communicate()
# and here the except:
# and here the finally:
if __name__ == "__main__":
app = Testclass(1)    # pass 1 (or anything for testing) to the out variable
app.Testdef()
print('%r' % app.out) # print the contents of the out variable
# i get an empty string, ''

所以这个程序只运行一次。out中没有任何内容。我相信,要创建一个有意义的用户执行键盘中断的例子,我们需要程序执行一些可以中断的操作。也许我可以在未来提供一个例子。。。

最新更新