赞
踩
可惜了!!!!
之前一直用os.popen/os.system来执行操作系统的命令,很繁琐,今天了解到了subprocess这个模块,感觉很强大,比os.popen/os.system强太多了,学习分享出来。
The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and functions:
该subprocess
模块允许您生成新进程,连接到它们的input/output/error 管道,并获取它们的返回代码。该模块旨在替换几个较旧的模块和功能(如:os.system/os.spawn*)
run函数原型:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
The recommended approach to invoking subprocesses is to use the run()
function for all use cases it can handle. For more advanced use cases, the underlying Popen
interface can be used directly.
大多数情况下推荐使用run()
方法调用子进程执行操作系统命令。在更高级的使用场景,可以直接使用底层的popen接口.
所以大多数情况下,只要熟悉run()方法的使用就够了。
Run the command described by args. Wait for command to complete, then return a CompletedProcessinstance.
另,run()函数返回的是一个CompletedProcess实例对象
来自 <https://docs.python.org/3/library/subprocess.html>
方法 | 描述 |
args | 字符串或者列表 |
stdin stdout stderr | None 子进程的输入 PIPE 创建管道, 如设置为PIPE, 则capture_output默认为false即可,会输出stdout值 PIPE创建管道, 如设置为PIPE, 则capture_output默认为false即可,会输出stderr值 |
capture_output | False(default)/True, 如果capture_output为true,则将捕获stdout和stderr |
encoding | 如果指定了该参数,则stdin、stdout和stderr可以接收字符串数据,并以该编码方式编码。否则只接收bytes类型的数据 如encoding="utf-8" |
shell | 如果该参数为True,将通过操作系统的shell执行指定的命令。 unix下相当于args前面添加了 "/bin/sh“ ”-c” window下,相当于添加"cmd.exe /c" |
cwd | 设置工作目录 |
env | 设置环境变量 |
subprocess.CompletedProcess
run()方法的返回值, 返回一个CompletedProcess对象,其属性如下:
方法 | 描述 |
args | 字符串或者列表 |
returncode | 退出子进程的状态码。通常,退出状态为0表示它已成功运行。 |
stdout | 获取子进程的stdout。为bytes类型,None表示没有捕获值。如果调用run()方法时,设置了参数stderr=subprocess.STDOUT,则stderr会和stdout一起输出,此时stderr的值是None |
stderr | 获取子进程的stderr。为bytes类型,None表示没有捕获值 |
check_returncode | If returncode is non-zero, raise a CalledProcessError. |
以下是一些应用实例:
- import subprocess
-
-
- # 应用subprocess获取设备列表, 相对于之前的写法感觉更方便,注释的是之前的写法
- def getdevlist():
- devlist = []
- # connectfile = os.popen('adb devices')
- # list = connectfile.readlines()
- result_list = subprocess.run('adb devices', capture_output=True, encoding='utf-8').stdout.strip().split('\n')
- # for i in range(len(list)):
- for info in result_list:
- # if list[i].find('\tdevice') != -1:
- if info.find('\tdevice') != -1:
- # temp = list[i].split('\t')
- temp = info.split('\t')
- devlist.append(temp[0])
- return devlist
-
-
- def main():
- # 打印出结果,但devstr1.stdout为空
- devstr1 = subprocess.run('adb devices')
- print(f'devstr1: {devstr1}')
- # 打印出结果,结果中有捕获stdout/stderr值,但类型为bytes
- devstr2 = subprocess.run('adb devices', capture_output=True)
- print(f'devstr2: {devstr2}')
- # 打印出结果,结果中有捕获stdout/stderr值,类型为str, 因为有指定encoding=‘utf-8'
- devstr3 = subprocess.run('adb devices', capture_output=True, encoding='utf-8')
- print(f'devstr3: {devstr3}')
- # 打印出结果,结果中有捕获stdout值,类型为str, 因为有指定encoding=‘utf-8'
- devstr4 = subprocess.run('adb devices', stdout=subprocess.PIPE, encoding='utf-8')
- print(f'devstr4: {devstr4}')
- # 打印出结果,结果中有捕获stdout/stderr值,类型为str, 因为有指定encoding=‘utf-8', 此时不再再设置capture_output=True
- devstr5 = subprocess.run('adb devices', stderr=subprocess.PIPE, stdout=subprocess.PIPE, encoding='utf-8')
- print(f'devstr5: {devstr5}')
-
- print(f'当前Pc连接的设备如下:\n{getdevlist()}')
-
-
- if __name__ == '__main__':
- main()
- -----------the result of pycharm---------------------------------------------------
- List of devices attached
- ad17caf5 device
-
- devstr1: CompletedProcess(args='adb devices', returncode=0)
- devstr2: CompletedProcess(args='adb devices', returncode=0, stdout=b'List of devices attached\r\nad17caf5\tdevice\r\n\r\n', stderr=b'')
- devstr3: CompletedProcess(args='adb devices', returncode=0, stdout='List of devices attached\nad17caf5\tdevice\n\n', stderr='')
- devstr4: CompletedProcess(args='adb devices', returncode=0, stdout='List of devices attached\nad17caf5\tdevice\n\n')
- devstr5: CompletedProcess(args='adb devices', returncode=0, stdout='List of devices attached\nad17caf5\tdevice\n\n', stderr='')
- 当前Pc连接的设备如下:
- ['ad17caf5']
-
- Process finished with exit code 0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。