【发布时间】:2020-09-04 13:19:27
【问题描述】:
我有耗时的 SNMP walk 任务来执行,我使用 Popen 命令作为后台进程运行。如何在日志文件中捕获此后台任务的输出。在下面的代码中,我尝试对 ip_list 中的每个 IP 进行 snampwalk,并将所有结果记录到 abc.txt。但是,我看到生成的文件 abc.txt 是空的。
下面是我的示例代码 -
import subprocess
import sys
f = open('abc.txt', 'a+')
ip_list = ["192.163.1.104", "192.163.1.103", "192.163.1.101"]
for ip in ip_list:
cmd = "snmpwalk.exe -t 1 -v2c -c public "
cmd = cmd + ip
print(cmd)
p = subprocess.Popen(cmd, shell=True, stdout=f)
p.wait()
f.close()
print("File output - " + open('abc.txt', 'r').read())
对于每个 IP,命令的示例输出可以是这样的 -
sysDescr.0 = STRING: Software: Whistler Version 5.1 Service Pack 2 (Build 2600)
sysObjectID.0 = OID: win32
sysUpTimeInstance = Timeticks: (15535) 0:02:35.35
sysContact.0 = STRING: unknown
sysName.0 = STRING: UDLDEV
sysLocation.0 = STRING: unknown
sysServices.0 = INTEGER: 72
sysORID.4 = OID: snmpMPDCompliance
我已经尝试过 Popen。但如果这是一个耗时的后台进程,它不会将输出记录到文件中。但是,当我尝试运行 ls/dir 之类的后台进程时,它可以工作。任何帮助表示赞赏。
【问题讨论】:
-
您可以根据需要将
Popen输出重定向到一个文件Popen(..., stdout=..)。 -
导入子进程 import sys f = open('abc.txt', 'w') cmd = "snmpwalk.exe -t 1 -v2c -c public 192.168.34.3" p = subprocess.Popen( cmd, shell=True, stdout=f) sys.stdout.flush() f.close()
-
@Torxed,我尝试将文件对象传递给标准输出。但它不会将输出写入文件
-
你也可以不时阅读
handle.stdout.read()? :) -
@Torxed 我也试过了,但是 stout.read 在很长的后台进程中没有打印任何东西。所以,这并不能解决问题
标签: python linux subprocess stdout popen