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

