Python,Django和stdout的奇怪问题

时间:2012-10-09 08:36:15

标签: python mysql django linux unix

我想知道我是否可以获得下面粘贴的代码的帮助。现在它运行并完成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)

2 个答案:

答案 0 :(得分:1)

看起来像一个错字。您想写ip_address[0]而不是id[0]吗?

idbuilt-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)

这将仅获取所需的行(如果有其他行)并减少到数据库的流量。

答案 1 :(得分:0)

你找不到ip_address[0]而不是id[0]