简介:subprocess是子流程,即进程的意思,该模块可以启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。

常用方法和接口
1、subprocess.run()
2、subprocess.call()
3、subprocess.check_call()
4、subprocess.getstatusoutput()
5、subprocess.getoutput()
6、subprocess.check_output()
7、subprocess.Popen()

subprocess.run()解析:

常用参数:
args:表示要执行的命令。必须是一个字符串,字符串参数列表。
stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是 subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。subprocess.PIPE 表示为子进程创建新的管道。subprocess.DEVNULL 表示使用 os.devnull。默认使用的是 None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起输出。
timeout:设置命令超时时间。如果命令执行时间超时,子进程将被杀死,并弹出 TimeoutExpired 异常。
check:如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常。
encoding: 如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。
shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。

subprocess.Popen()解析:Popen 是 subprocess的核心,子进程的创建和管理

常用参数:
args:shell命令,可以是字符串或者序列类型(如:list,元组)
bufsize:缓冲区大小。当创建标准流的管道对象时使用,默认-1。
0:不使用缓冲区
1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式
正数:表示缓冲区大小
负数:表示使用系统默认的缓冲区大小。
stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
cwd:用于设置子进程的当前目录。
env:用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承。

Popen 对象方法:

poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
wait(timeout): 等待子进程终止。
communicate(input,timeout): 和子进程交互,发送和读取数据。
send_signal(singnal): 发送信号到子进程 。
terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
kill(): 杀死子进程。发送 SIGKILL 信号到子进程。

subprocess.run()案例:

import subprocessprint(subprocess.run(["pip", "list"]))

subprocess.call()案例:执行命令,返回命令的结果和执行状态,0或者非0

import subprocessresult1 = subprocess.call(["pip", "list"])
print("*" * 30)
print(result1)  # 0result2 = subprocess.call(["pip", "list1"])
print("*" * 30)
print(result2)  # -1# 运行结果
# ******************************
# 0
# ERROR: unknown command "list1" - maybe you meant "list"
# ******************************
# 1

subprocess.check_call()案例:执行命令,返回结果和状态,正常为0 ,执行错误则抛出异常

import subprocessresult1 = subprocess.check_call(["pip", "list"])
print("*" * 30)
print(result1)result2 = subprocess.check_call(["pip", "list2"])
print("*" * 30)
print(result2)# 运行结果,运行错误,抛出异常。
# ******************************
# 0
#    raise CalledProcessError(retcode, cmd)
# subprocess.CalledProcessError: Command '['pip', 'list2']' returned non-zero exit status 1.

subprocess.getstatusoutput()案例:接受字符串形式的命令,返回 一个元组形式的结果,第一个元素是命令执行状态,第二个为执行结果。

import subprocessresult1 = subprocess.getstatusoutput("pip --version")
print(result1)# 返回:第一个元素0, 第二个为执行结果
# (0, 'pip 21.1.3 from C:\\lib\\site-packages\\pip (python 3.9)\n')result2 = subprocess.getstatusoutput("pip -vesi")
print(result2)# 执行失败的案例
# (2, '\nUsage:   \n  pip <command> [options]\n\nno such option: -e')

subprocess.getoutput()案例:接受字符串形式的命令,放回执行结果

import subprocessresult1 = subprocess.getoutput("pip --version")
print(result1)
# 返回
# pip 21.1.3 from D:\\lib\site-packages\pip (python 3.9)result2 = subprocess.getoutput("pip -vesi")
print(result2)
# 返回
# Usage:
#   pip <command> [options]
#
# no such option: -e

subprocess.check_output()案例:执行命令,返回执行的结果,而不是打印

import subprocessresult1 = subprocess.check_output("pip --version")
print(result1)
# 返回
# b'pip 21.1.3 from D:\\lib\\site-packages\\pip (python 3.9)\r\r\n'result2 = subprocess.check_output("pip -vesi")
print(result2)
# 返回
#     raise CalledProcessError(retcode, process.args,
# subprocess.CalledProcessError: Command 'pip -vesi' returned non-zero exit status 2.

subprocess.Popen()综合案例:案例中视频长度代码,请参考 - Python:获取视频时长 - 实践场景

# coding:utf-8
import time
import datetime
import subprocess
from analysis_video import video_durationfile = r"C:\Users\videos\duck.mp4"  # 请根据实际情况填写视频路径
video_time = video_duration(file)
print(video_time)
video_pid = subprocess.Popen(f'C:\Program Files\Windows Media Player\wmplayer.exe {file}')# poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
print(f"now:{datetime.datetime.now()}. - 当前返回状态:{video_pid.poll()}")
# now:2021-11-28 11:20:48.504796. - 当前返回状态:None# 获取当前执行子shell的程序的进程号
print("当前执行进程号为:{}".format(video_pid.pid))sleeps = int(video_time) + 2
print(f"根据视频时长等待:{sleeps}秒")
time.sleep(sleeps)# kill(): 杀死子进程。发送 SIGKILL 信号到子进程。
video_pid.kill()
time.sleep(1)
print(f"now:{datetime.datetime.now()}. - 当前返回状态:{video_pid.poll()}")
# now:2021-11-28 11:21:05.520822. - 当前返回状态:1# wait()
# 等待命令执行完成,并且返回结果状态
print(video_pid.wait())  # 1

运行结果:

附,各种信号总结:

SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP

   停止进程     非终端来的停止信号
SIGTSTP   停止进程     终端来的停止信号
SIGCONT   忽略信号     继续执行一个停止的进程
SIGURG   忽略信号     I/O紧急信号
SIGIO     忽略信号     描述符上可以进行I/O
SIGCHLD   忽略信号     当子进程停止或退出时通知父进程
SIGTTOU   停止进程     后台进程写终端
SIGTTIN   停止进程     后台进程读终端
SIGXGPU   终止进程     CPU时限超时
SIGXFSZ   终止进程     文件长度过长
SIGWINCH   忽略信号     窗口大小发生变化
SIGPROF   终止进程     统计分布图用计时器到时
SIGUSR1   终止进程     用户定义信号1
SIGUSR2   终止进程     用户定义信号2
SIGVTALRM 终止进程     虚拟计时器到时

微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

Python:subprocess模块相关推荐

  1. Python subprocess模块

    subprocess subprocess模块介绍 subprocess模块是一个可以将系统内的命令结果赋值给变量并打印, 还可以输出命令执行状态,subprocess可以单独将 命令输出结果与执行状 ...

  2. python subprocess 模块

    subprocess 模块中有一个功能Popen , 可以在代码中调用系统的命令 其功能比os.system 更加强大 代码示例: command = 'python -u %s/generalMak ...

  3. python subprocess模块 命令执行

    subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互.查看一下它的构造函数: __init__(self, args, bufsize=0, executabl ...

  4. python subprocess模块_python subprocess模块详解

    一.subprocess标准库 python执行shell脚本,通常会使用so模块中的几个方法,如system.spawn*.popen等.subprocess标准库的引入就是为了取代这些老的模块方法 ...

  5. Python常用模块之subprocess模块

    当我们需要调用系统的命令的时候,最先考虑的os模块.用os.system()和os.popen()来进行操作. 但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出 ...

  6. python子进程模块subprocess

    2019独角兽企业重金招聘Python工程师标准>>> python子进程模块subprocess 目录 一.subprocess 模块简介 1.1. 使用 subprocess模块 ...

  7. Python之路(第二十篇) subprocess模块

    一.subprocess模块 subprocess英文意思:子进程 那什么是进程呢? (一)关于进程的相关理论基础知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念 ...

  8. python的subprocess模块执行shell命令

    subprocess模块可以允许我们执行shell命令 一般来说,使用run()方法就可以满足大部分情况 使用run执行shell命令 In [5]: subprocess.run('echo &qu ...

  9. python commands模块在python3.x被subprocess取代

    subprocess 可以执行shell命令的相关模块和函数有: os.system os.spawn os.popen --废弃 popen2.* --废弃 commands.* --废弃,3.x中 ...

  10. python subprocess communicate_Python中的Subprocess模块

    以前我一直用os.system()处理一些系统管理任务,因为我认为那是运行linux命令最简单的方式. 我们能从Python官方文档里读到应该用subprocess 模块来运行系统命令.subproc ...

最新文章

  1. AI研究生应届生年薪可达50万 没出校门已被抢光
  2. ASP.NET MVC + ECharts图表案例
  3. CSS3--选择器、动画效果
  4. 关于我国科技创新研究,以及创新成果的转化的思考
  5. linux重定向到程序,技术|Linux I/O 重定向基础
  6. 处理接口超时_架构设计 | 接口幂等性原则,防重复提交Token管理
  7. 广工android嵌入式系统试卷_教育录播系统的选择
  8. MaxScript与外部程序通讯
  9. 一阶倒立摆神经网络控制matlab,BP神经网络在一级倒立摆 控制系统中的应用设计...
  10. 安卓夜神模拟器设置代理
  11. 硬件设计1---什么是硬件工程师?
  12. 大数据将走向何方?未来大数据的十大趋势评析
  13. 0611 auto sorting and resend script
  14. openlayers中绘制态势箭头、进击箭头、钳击箭头等
  15. 伦敦 quant_伦敦统一用户组7
  16. SQL注入原理-时间盲注
  17. 关于iphone的双重验证的虚伪本质
  18. 【Kettle】如何解决Excel输出卡死或太慢
  19. 三星android5 root包,三星 S5360的安卓 2.3.5系统 root成功
  20. HTTP服务(超文本传输协议)

热门文章

  1. ESP8266+Flash基本操作
  2. 隔代育儿真那么可怕么?
  3. 获取当前年份前后各五年的数据与双击选中方法的使用
  4. 蓝桥杯-拉马车(C语言)
  5. P6SPY(JDBC SQL拦截)的安装和使用
  6. android+浪漫程序,让互联网充满浪漫————程序猿专属小情话来啦
  7. CUMT2022算法设计与分析A考试
  8. Jenkins Pipeline中的自定义环境变量
  9. 高精度仿凡客VANCL 商品属性代码
  10. NOI2016 day1 总(xia)结(che)