我正在尝试获取实时窗口tracert
的输出,同时将日志保存到log.txt
。
这是将输出保存到log.txt
文件的代码。
import sys
class Tee(object):
def __init__(self, log_fname, mode='a'):
self.log = open(log_fname, mode)
def __del__(self):
sys.stdout = sys.__stdout__
sys.stdir = sys.__stdin__
sys.stderr = sys.__stderr__
self.log.close()
def write(self, data):
self.log.write(data)
self.log.flush()
sys.__stdout__.write(data)
sys.__stdout__.flush()
def readline(self):
s = sys.__stdin__.readline()
sys.__stdin__.flush()
self.log.write(s)
self.log.flush()
return s
def flush(foo):
return
sys.stdout = sys.stderr = sys.stdin = Tee('log.txt', 'w')
我在Getting realtime output using subprocess上阅读了几乎类似的主题,但是由于我对subprocess
模块还是陌生的,所以解决方案还没有运气。
这是我在{3}中使用tracert
和subprocess
模块的os.system
尝试。
第一次尝试
IP = '10.2.2.2'
代码
print(subprocess.check_output('tracert %s' % IP, shell=True, universal_newlines=True))
控制台输出不实时
Tracing route to 10.2.2.2 over a maximum of 30 hops
1 1 ms 1 ms <1 ms 10.1.1.1
2 <1 ms 1 ms 1 ms 10.2.2.2
Trace complete.
log.txt
好
Tracing route to 10.2.2.2 over a maximum of 30 hops
1 <1 ms <1 ms <1 ms 10.1.1.1
2 1 ms 1 ms <1 ms 10.2.2.2
Trace complete.
第二次尝试
代码
print(subprocess.run('tracert %s' % IP, shell=True, universal_newlines=True))
控制台输出=实时,具有附加的CompletedProcess(args='tracert 10.2.2.2', returncode=0
Tracing route to 10.2.2.2 over a maximum of 30 hops
1 <1 ms <1 ms <1 ms 10.1.1.1
2 <1 ms <1 ms <1 ms 10.2.2.2
Trace complete.
CompletedProcess(args='tracert 10.2.2.2', returncode=0)
log.txt
=不好
CompletedProcess(args='tracert 10.2.2.2', returncode=0)
第三次尝试
代码
os.system('tracert %s' % IP)
控制台输出=确定,实时
Tracing route to 10.2.2.2 over a maximum of 30 hops
1 <1 ms <1 ms <1 ms 10.1.1.1
2 <1 ms 1 ms <1 ms 10.2.2.2
Trace complete.
log.txt
=没事
第四次尝试
代码
print(os.system('tracert %s' % IP))
控制台输出=确定,实时
Tracing route to 10.2.2.2 over a maximum of 30 hops
1 <1 ms <1 ms <1 ms 10.1.1.1
2 <1 ms 1 ms <1 ms 10.2.2.2
Trace complete.
log.txt
= 0
0
是否可以获取实时tracert
输出并同时将控制台上的所有内容(完全相同)记录到log.txt
文件中?
如果有更简便的方法,请告诉我。