2012-05-14 44 views
4

我是python的新手,我需要計算Linux機器上網絡接口(如工具nload)的「平均速度」。下面的代碼告訴我有多少字節已被髮送和接收。如果有人能夠幫助我打印網絡接口的平均速度,我將不勝感激。Python中的平均網絡統計信息

def main(): 
    rx_bytes, tx_bytes = get_network_bytes('eth0') 
    print '%i bytes received' % rx_bytes 
    print '%i bytes sent' % tx_bytes 

def get_network_bytes(interface): 
    for line in open('/proc/net/dev', 'r'): 
     if interface in line: 
      data = line.split('%s:' % interface)[1].split() 
      rx_bytes, tx_bytes = (data[0], data[8]) 
      return (int(rx_bytes), int(tx_bytes)) 

if __name__ == '__main__': 
    main() 
+0

要計算你需要知道的接口有多久了 –

+0

,直到你指定了你希望計算平均時間框架的平均速度是沒有定義的平均速度。 – NPE

+0

@gnibbler ...我想這可以完成,如果這段代碼在無限循環中執行,那會給我平均速度......問題是,我怎樣才能使這段代碼「無盡」,並獲得接口信息? :) –

回答

0

把你的main()和get_network_bytes(),並在Python進程將它們包裝:

import subprocess 
import time 
from daemon import runner 
import datetime 

class App(): 
    def __init__(self): 
     self.stdin_path = '/dev/null' 
     self.stdout_path = '/dev/tty' 
     self.stderr_path = '/dev/tty' 
     self.pidfile_path = '/tmp/YOUR_PROCESS_NAME.pid' 
     self.pidfile_timeout = 5 
    def run(self): 

     counter1 = 0 
     counter_log = 0 
     try: 
      while True: 

       # INSERT YOUR FUNCTIONS HERE 

       # SET YOUR LOOP SLEEP TIMER (IN SECONDS) HERE 
       time.sleep(60) 

     except Exception, e: 
      raise 

app = App() 
daemon_runner = runner.DaemonRunner(app) 
daemon_runner.do_action() 

然後用 「蟒蛇myscript.py啓動」 或停止或重新啓動,進程ID將運行被打印在屏幕上。在後臺運行時,您需要將該腳本作爲其他程序的一部分導入以進行查詢,或者每次循環時都可以將結果打印到臨時文件,然後讓其他程序查詢那個臨時文件。 「有許多不同的方式來做到這一點」

編輯:

開始像這樣的東西和定製,這真的只是一個去它的方式,我建議像psutil另一個庫而不是凌亂使用ifconfig的分析只適用於Linux操作系統:

「確保更改界面,我使用爲wlan0您可能使用不同的東西」

下面的腳本將打印出的畫面每60秒平均最後一分鐘的發送和接收速率。

import os 
import subprocess 
import time 
from daemon import runner 
import datetime 
import re 

class App(): 
    def __init__(self): 
     self.stdin_path = '/dev/null' 
     self.stdout_path = '/dev/tty' 
     self.stderr_path = '/dev/tty' 
     self.pidfile_path = '/tmp/bandwidth_counter.pid' 
     self.pidfile_timeout = 5 
    def run(self): 
     rx_megabits_new = 0 
     tx_megabits_new = 0 
     try: 
       while True: 
         output = subprocess.Popen(['ifconfig', "wlan0"], stdout=subprocess.PIPE).communicate()[0] 
         rx_bytes = re.findall('RX bytes:([0-9]*) ', output)[0] 
         tx_bytes = re.findall('TX bytes:([0-9]*) ', output)[0] 
         rx_megabits = (((int(rx_bytes) * 8)/1024)/1024) 
         tx_megabits = (((int(tx_bytes) * 8)/1024)/1024) 
         current_rx_usage = rx_megabits - rx_megabits_new 
         current_tx_usage = tx_megabits - tx_megabits_new 
         rx_megabits_new = rx_megabits 
         tx_megabits_new = tx_megabits 
         print 'average megabits received', current_rx_usage/60 
         print 'average kilobits received', (current_rx_usage * 1024)/60 
         print 'average megabits sent', current_tx_usage/60 
         print 'average kilobits sent', (current_tx_usage * 1024)/60 
         time.sleep(60) 

     except Exception, e: 
      raise 


app = App() 
daemon_runner = runner.DaemonRunner(app) 
daemon_runner.do_action() 

同樣,這可與「蟒蛇myscript.py開始」,停止和重新啓動。你會想添加一些文件打開和寫入,而不是打印到屏幕上。我還建議你用gzip.open()打開你的文件來節省一些空間,因爲它們會很快變大。

編輯:

這是同樣的守護這段時間寫入文件/tmp/netstats_counter.log其中超過1個分鐘的時間間隔,單位爲KB/s的平均RX流量將含有「以KB/s的TX率CSV過了1分鐘的間隔,UNIX時間戳」

import os 
import subprocess 
import time 
from daemon import runner 
import datetime 
import re 

class App(): 
    def __init__(self): 
     self.stdin_path = '/dev/null' 
     self.stdout_path = '/dev/tty' 
     self.stderr_path = '/dev/tty' 
     self.pidfile_path = '/tmp/twitter_counter.pid' 
     self.pidfile_timeout = 5 
    def run(self): 
     rx_megabits_new = 0 
     tx_megabits_new = 0 
     try: 
       while True: 
         output_csv = open("/tmp/netstats_counter.log", 'a') 
         output = subprocess.Popen(['ifconfig', "wlan0"], stdout=subprocess.PIPE).communicate()[0] 

         rx_bytes = re.findall('RX bytes:([0-9]*) ', output)[0] 
         tx_bytes = re.findall('TX bytes:([0-9]*) ', output)[0] 
         rx_megabits = (((int(rx_bytes) * 8)/1024)/1024) 
         tx_megabits = (((int(tx_bytes) * 8)/1024)/1024) 

         current_rx_usage = (rx_megabits - rx_megabits_new)/60 
         current_tx_usage = (tx_megabits - tx_megabits_new)/60 
         current_rx_usage_kb = current_rx_usage * 1024 
         current_tx_usage_kb = current_tx_usage * 1024 

         rx_megabits_new = rx_megabits 
         tx_megabits_new = tx_megabits 

         now = str(datetime.datetime.now()) 

         col1 = str(current_tx_usage_kb) 
         col2 = str(current_rx_usage_kb) 
         output_csv.write(col1) 
         output_csv.write(", ") 
         output_csv.write(col2) 
         output_csv.write(", ") 
         output_csv.write(now) 
         output_csv.write("\n") 

         output_csv.close() 


#      print 'average megabits received', current_rx_usage/60 
#      print 'average kilobits received', (current_rx_usage * 1024)/60 
#      print 'average megabits sent', current_tx_usage/60 
#      print 'average kilobits sent', (current_tx_usage * 1024)/60 


         time.sleep(60) 

     except Exception, e: 
      raise 


app = App() 
daemon_runner = runner.DaemonRunner(app) 
daemon_runner.do_action() 
+0

@secumind ...是否建議我將我的代碼與您建議的解決方案混合在一起,最終得到的python腳本將平均速度保存在temp文件? –

+0

是的,這是做到這一點的一種方式,我會在第二天發佈一個mod – secumind

+0

@AmaarBokhari看看我上面的編輯,看看是否符合您的需求。 – secumind