我想知道是否可以通过我在下面粘贴的代码获得一些帮助。现在它运行并完成了 ping 任务,但是它遇到了以下错误。任何帮助都会很棒,因为我已经为此工作了一段时间。
错误:
Server.objects.filter(pk=id[0]).update(online=1)
TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'
代码:
import subprocess
from django.db import models
from networkstats.models import Server
query = Server.objects.values_list('id', 'ip_address')
for ip_address in query:
print 'Server ID: ' + str(ip_address[0])
print 'Server IP: ' + str(ip_address[1])
command = ['ping -t 200 -c 1 ' + ip_address[1]]
ping = subprocess.Popen(command, stdout=subprocess.PIPE, shell = True)
if "100% pocket loss" in ping.stdout.read():
Server.objects.filter(pk=id[0]).update(online=0)
else:
Server.objects.filter(pk=id[0]).update(online=1)
最佳答案
看起来像是打字错误。你想写 ip_address[0]
而不是 id[0]
吗?
id
是 built-in function ,因此您会收到此错误。
另请查看您的代码片段的可能更好的实现:
for server in Server.objects.only('ip_address', 'id').all():
print 'Server ID: ' + str(server.id)
print 'Server IP: ' + str(server.ip_address)
command = ['ping -t 200 -c 1 ' + server.ip_address]
ping = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
online = 1
if "100% pocket loss" in ping.stdout.read():
online = 0
server.update(online=online)
这将只获取需要的行(如果还有其他行)并减少数据库的流量。
关于python - Python、Django 和标准输出的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12795987/