Python 2 Implementation Example
Below demonstrates real-time capture of ping responses using Python 2's subprocess handling:
# -*- coding: utf-8 -*-
import subprocess
# Launch continuous ping with custom packet size
proc = subprocess.Popen('ping 192.168.1.100 -s 512'.split(), stdout=subprocess.PIPE)
try:
while True:
data = proc.stdout.readline()
if not data:
break
text = data.strip()
print("Response:", text)
if 'icmp_seq' in text:
parts = text.split()
for part in parts:
if part.startswith('time='):
latency = float(part.split('=')[1])
if latency > 100:
print("High latency detected!")
proc.kill()
break
except KeyboardInterrupt:
proc.terminate()
finally:
print("Process ended")
Python 3 Implementation Example
The equivalent functionality in Python 3 requires explicit byte-to-string conversion:
import subprocess
import sys
# Execute ping with count limit
monitor_proc = subprocess.Popen(['ping', '8.8.8.8', '-c', '30'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
try:
for raw_line in iter(monitor_proc.stdout.readline, b''):
decoded = raw_line.decode('utf-8').strip()
print(f"Output: {decoded}")
if 'bytes from' in decoded:
try:
time_val = decoded.split('time=')[1].split(' ')[0]
if float(time_val) > 50.0:
print("Threshold exceeded")
sys.exit(0)
except (IndexError, ValueError):
pass
finally:
monitor_proc.kill()
Key Distinctions Between Python Versions
- Command Specification: Python 2 permits passing command arguments as either a space-separated string or a list. Python 3 enforces list-only format for security and clarity.
- Object Consistency: Both versions return a subprocess.Popen instance when instantiating the class.
- Stream Interface: Python 2 exposes stdout as a file-like object with direct string methods, while Python 3 provides an
_io.BufferedReaderinstance requiring dceoding. - Data Type Handling: Python 2's
readline()returns native strings; Python 3 returns byte objects that must be decoded using.decode('utf-8')or similar methods. - Process Termination: Python 2 requires direct process manipulation through
terminate()orkill(). Python 3 additionally supports program-wide exit viasys.exit()which automatically cleans up subprocess resources.