I needed to get some Linux networking stats in my Python program today. Specifically, I needed 'bytes sent' and 'bytes received' counts since last reboot from the local machine.
ifconfig is a network configuration utility for Linux that you run from the command line:
corey@studio17:~$ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:22:19:e5:07:31 inet addr:10.0.0.5 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::222:19ff:fee5:731/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3353822 errors:0 dropped:0 overruns:0 frame:0 TX packets:3052408 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3476310326 (3.4 GB) TX bytes:256706611 (256.7 MB) Interrupt:17
The following function parses output from ifconfig to get the network stats I was after:
import re import subprocess def get_network_bytes(interface): output = subprocess.Popen(['ifconfig', interface], 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] return (rx_bytes, tx_bytes)
Example usage:
import re import subprocess def main(): rx_bytes, tx_bytes = get_network_bytes('eth0') print '%s bytes received' % rx_bytes print '%s bytes sent' % tx_bytes def get_network_bytes(interface): output = subprocess.Popen(['ifconfig', interface], 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] return (rx_bytes, tx_bytes) if __name__ == '__main__': main()
Update: someone left an anonymous comment and mentioned you can just read from proc/net/dev rather than using ifconfig. I modified his code sample and came up with this:
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 (rx_bytes, tx_bytes)
Example Usage:
def main(): rx_bytes, tx_bytes = get_network_bytes('eth0') print '%s bytes received' % rx_bytes print '%s 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 (rx_bytes, tx_bytes) if __name__ == '__main__': main()