2012-10-09 64 views
1

我想知道是否可以得到一些幫助,我的代碼粘貼在下面。現在它運行並完成ping任務,但運行到以下錯誤。任何幫助都會很棒,因爲我一直在努力一段時間。Python,Django和stdout的奇怪問題

錯誤:

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) 

回答

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) 

這將只獲取需要的行(如果有其他人)和減少交通事故的數據庫。

+0

謝謝你的幫助,改變和糾正「口袋損失」允許它正確更新。 – icebox3d

+0

@ icebox3d查看更新的代碼 – neoascetic

0

是不是ip_address[0]而不是id[0]您要找的是?