场景
根据实时信息做出不同的选择,比如实时监控日志tail -f /var/log/messages或连续ping某ip ping 127.0.0.1
ping命令实时打印输出_subprocess.Popen的python2实现:
#coding=utf8
import subprocess
ping_process = subprocess.Popen(['ping', '127.0.0.1', '-i', '0.5', '-s', '1000'], stdout=subprocess.PIPE)
# print(type(ping_process)) ## <class 'subprocess.Popen'>
# print(type(ping_process.stdout)) ## <type 'file'>
# print(type(ping_process.stdout.readline())) ## <type 'str'>
try:
while True:
output = ping_process.stdout.readline()
if not output:
print(3333, output)
break
line = output.strip()
print(111111, line)
if 'time=' in line:
ms = line.split('time=')[1].split()[0]
if float(ms) >= 500:
print("Ping time exceeded 500ms. Terminating process.")
ping_process.terminate()
print(22222)
break
except KeyboardInterrupt:
ping_process.kill()
finally:
print(line)
ping命令实时打印输出_subprocess.Popen的python3实现 :
import subprocess
# 使用subprocess模块执行ping命令并实时打印输出
ping_process = subprocess.Popen(['ping', '127.0.0.1'], stdout=subprocess.PIPE)
print(type(ping_process)) ## <class 'subprocess.Popen'>
print(type(ping_process.stdout)) ## <class '_io.BufferedReader'>
print(type(ping_process.stdout.readline())) ## <class 'bytes'>
try:
while True:
output = ping_process.stdout.readline()
if output == b'' and ping_process.poll() is not None:
break
if output:
line = output.strip().decode('utf-8').strip()
print(line)
if 'time=' in line:
ms = line.split('time=')[1].split()[0]
if float(ms) >= 0.05:
print(line)
exit(1)
except KeyboardInterrupt:
pass
finally:
print(line)
python2与python3中的subprocess.Popen的异同
- python2中subprocess.Popen允许传递一个字符串作为命令参数;在Python 3中,
subprocess.Popen
不再支持直接传递字符串作为命令参数,而是需要将命令和参数分割为一个列表。- python2和python3的subprocess.Popen都返回subprocess.Popen对象
- python2中stdout为file对象,python3中的stdout为_io.BufferedReader对象
- python2中的stdout.readline()为str,python3中的stdout.readline()为byte,需要用decode('utf-8')转成字符串
- python2中只能使用terminate()或kill()方法结束或杀死子进程,不能使用sys.exit()退出程序,但python3中可以使用sys.exit()退出程序。