当前位置:   article > 正文

built-in:subprocess模块的用法_temp = info[-1].split('.')

temp = info[-1].split('.')

可惜了!!!!

之前一直用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.

以下是一些应用实例:

  1. import subprocess
  2. # 应用subprocess获取设备列表, 相对于之前的写法感觉更方便,注释的是之前的写法
  3. def getdevlist():
  4. devlist = []
  5. # connectfile = os.popen('adb devices')
  6. # list = connectfile.readlines()
  7. result_list = subprocess.run('adb devices', capture_output=True, encoding='utf-8').stdout.strip().split('\n')
  8. # for i in range(len(list)):
  9. for info in result_list:
  10. # if list[i].find('\tdevice') != -1:
  11. if info.find('\tdevice') != -1:
  12. # temp = list[i].split('\t')
  13. temp = info.split('\t')
  14. devlist.append(temp[0])
  15. return devlist
  16. def main():
  17. # 打印出结果,但devstr1.stdout为空
  18. devstr1 = subprocess.run('adb devices')
  19. print(f'devstr1: {devstr1}')
  20. # 打印出结果,结果中有捕获stdout/stderr值,但类型为bytes
  21. devstr2 = subprocess.run('adb devices', capture_output=True)
  22. print(f'devstr2: {devstr2}')
  23. # 打印出结果,结果中有捕获stdout/stderr值,类型为str, 因为有指定encoding=‘utf-8'
  24. devstr3 = subprocess.run('adb devices', capture_output=True, encoding='utf-8')
  25. print(f'devstr3: {devstr3}')
  26. # 打印出结果,结果中有捕获stdout值,类型为str, 因为有指定encoding=‘utf-8'
  27. devstr4 = subprocess.run('adb devices', stdout=subprocess.PIPE, encoding='utf-8')
  28. print(f'devstr4: {devstr4}')
  29. # 打印出结果,结果中有捕获stdout/stderr值,类型为str, 因为有指定encoding=‘utf-8', 此时不再再设置capture_output=True
  30. devstr5 = subprocess.run('adb devices', stderr=subprocess.PIPE, stdout=subprocess.PIPE, encoding='utf-8')
  31. print(f'devstr5: {devstr5}')
  32. print(f'当前Pc连接的设备如下:\n{getdevlist()}')
  33. if __name__ == '__main__':
  34. main()
  1. -----------the result of pycharm---------------------------------------------------
  2. List of devices attached
  3. ad17caf5 device
  4. devstr1: CompletedProcess(args='adb devices', returncode=0)
  5. devstr2: CompletedProcess(args='adb devices', returncode=0, stdout=b'List of devices attached\r\nad17caf5\tdevice\r\n\r\n', stderr=b'')
  6. devstr3: CompletedProcess(args='adb devices', returncode=0, stdout='List of devices attached\nad17caf5\tdevice\n\n', stderr='')
  7. devstr4: CompletedProcess(args='adb devices', returncode=0, stdout='List of devices attached\nad17caf5\tdevice\n\n')
  8. devstr5: CompletedProcess(args='adb devices', returncode=0, stdout='List of devices attached\nad17caf5\tdevice\n\n', stderr='')
  9. 当前Pc连接的设备如下:
  10. ['ad17caf5']
  11. Process finished with exit code 0

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/426106
推荐阅读
相关标签
  

闽ICP备14008679号