Python执行外部命令与获取输出:subprocess模块详解

需积分: 49 20 下载量 13 浏览量 更新于2024-08-08 收藏 2.01MB PDF 举报
"这篇文档是《Python Cookbook》第三版的一部分,涵盖了如何在Python中执行外部命令并获取输出,以及各种数据结构、字符串和文本处理、数字日期和时间相关的编程技巧。" 在Python中,当你需要执行一个外部命令并获取其输出时,可以使用`subprocess`模块中的`check_output()`函数。这个函数允许你执行指定的命令,并将结果以字节字符串的形式返回。例如,执行`netstat -a`这样的命令,你可以写: ```python import subprocess out_bytes = subprocess.check_output(['netstat', '-a']) ``` 若要将字节字符串转换为文本字符串,你可以使用`decode()`方法: ```python out_text = out_bytes.decode('utf-8') ``` 如果执行的命令导致非零退出状态,`check_output()`会抛出`subprocess.CalledProcessError`异常。你可以捕获这个异常来处理错误并获取返回码: ```python try: out_bytes = subprocess.check_output(['cmd', 'arg1', 'arg2']) except subprocess.CalledProcessError as e: out_bytes = e.output # 错误发生前的输出 code = e.returncode # 返回码 ``` 默认情况下,`check_output()`只返回标准输出。如果想同时收集标准输出和错误输出,可以将`stderr`参数设置为`subprocess.STDOUT`: ```python out_bytes = subprocess.check_output(['cmd', 'arg1', 'arg2'], stderr=subprocess.STDOUT) ``` 此外,你可以通过设置`timeout`参数来控制命令执行的超时时间,例如: ```python try: out_bytes = subprocess.check_output(['cmd', 'arg1', 'arg2'], timeout=5) except subprocess.TimeoutExpired as e: ... ``` 通常,无需使用底层shell环境执行命令,但如果你确实需要,可以设置`shell=True`。例如: ```python out_bytes = subprocess.check_output("cmd arg1 arg2", shell=True) ``` 文档中还涉及了Python数据结构和算法的相关技巧,例如解压序列赋值、优先级队列的实现、字典操作、序列处理、字符串和文本处理等。这些技巧包括但不限于: 1. 解压序列赋值给多个变量 2. 实现一个优先级队列 3. 字典排序和操作 4. 通过关键字排序字典列表 5. 正则表达式的使用,如Unicode匹配和字符串清理 6. 数字的四舍五入和浮点数精确运算 7. 复数的数学运算 8. 字节到大整数的打包和解包 这些技巧有助于提高Python代码的效率和可读性。通过掌握这些方法,开发者可以更好地处理日常编程中遇到的各种问题。