python2与python3中的subprocess.Popen差异

场景

根据实时信息做出不同的选择,比如实时监控日志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()退出程序。

相关推荐

  1. python2python3subprocess.Popen差异

    2024-07-15 17:54:01       20 阅读
  2. 【后端】python2python3语法差异

    2024-07-15 17:54:01       37 阅读
  3. RPython:编程语言间差异魅力

    2024-07-15 17:54:01       25 阅读
  4. vue2 vue3差异汇总

    2024-07-15 17:54:01       31 阅读
  5. LuaPython:深度解析两者之间核心差异

    2024-07-15 17:54:01       29 阅读
  6. 2.3 Python 在运维应用

    2024-07-15 17:54:01       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 17:54:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 17:54:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 17:54:01       58 阅读
  4. Python语言-面向对象

    2024-07-15 17:54:01       69 阅读

热门阅读

  1. 面向开发者的提示词工程第一章-简介

    2024-07-15 17:54:01       22 阅读
  2. Python网页开发的常用框架

    2024-07-15 17:54:01       20 阅读
  3. 721. 账户合并 Medium

    2024-07-15 17:54:01       23 阅读
  4. DMA和DMAC

    2024-07-15 17:54:01       21 阅读
  5. 面试官:说说MySQL 中的悲观锁和乐观锁

    2024-07-15 17:54:01       20 阅读
  6. Redis① —— Redis基础

    2024-07-15 17:54:01       20 阅读
  7. LeetCode 445.两数相加||

    2024-07-15 17:54:01       16 阅读