在此脚本中,我只想打印具有“字节自”的ip,并将该输出保存为txt格式。 添加if语句后,我仍然获得完整的ips。请帮忙。
import subprocess
with open('ips') as f:
line = f.readlines()
for i in line:
p1=subprocess.Popen(['ping', '-c 1', i], stdout=subprocess.PIPE)
output = p1.communicate()[0]
print(output)
if 'bytes from' in line:
print(output)
输出:
PING 10.11.1.1
(10.11.1.1) 56(84) bytes of data.
From 10.11.0.92 icmp_seq=1 Destination Host Unreachable
--- 10.11.1.1
ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
答案 0 :(得分:0)
您真的想避免使用subprocess.Popen()
,除非您知道subprocess.run()
这样的高级包装程序都不会做您想要的事情。
代码的直接问题(在某种程度上可以推断出折断的缩进)是您正在一次检查所有输出行。您需要将ping
的输出分成几行,然后再检查每行是否匹配。
当然,检查IP地址而不是ping
的输出也无济于事...命名变量以更好地指示变量所包含的内容是避免这种情况的好方法错误。
from subprocess import run, PIPE
with open('ips') as ips:
for ip in ips:
ip = ip.strip() # remove trailing newline
ping = run(['ping', '-c', '1', ip],
stdout=PIPE, universal_newlines=True)
for line in ping.stdout.split('\n'):
if 'bytes from' in line:
print(line)
尽管示例中的任何一行都不包含“ bytes from”;您是说“字节”吗?