首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 1章 处理错误和寻求帮助
1.1 如何理解Python错误信息
1.1.1 检查回溯信息
1.1.2 搜索错误信息
1.2 借助linter 避免错误
1.3 如何寻求编程帮助
1.3.1 预先提供信息以避免反复补充
1.3.2 以实际问题的形式陈述问题
1.3.3 在合适的网站上提出你的问题
1.3.4 在标题中概述你的问题
1.3.5 说明代码的预期目的
1.3.6 包含完整的错误信息
1.3.7 分享全部代码
1.3.8 通过适当的格式化增强代码可读性
1.3.9 告诉帮忙者已经尝试过的方法
1.3.10 描述你的设置信息
第 2章 环境设置和命令行
2.1 文件系统
2.1.1 Python中的路径
2.1.2 主目录
2.1.3 当前工作目录
2.1.4 绝对路径和相对路径
2.2 程序和进程
2.3 命令行
2.3.1 打开终端窗口
2.3.2 使用命令行运行程序
2.3.3 使用命令行参数
2.3.4 在命令行中使用-c 运行Python代码
2.3.5 从命令行运行Python 程序
2.3.6 运行py.exe 程序
2.3.7 在Python 程序中运行命令
2.3.8 使用Tab 补全命令减少输入量
2.3.9 查看历史命令
2.3.10 使用常用命令
2.4 环境变量和PATH
2.4.1 查看环境变量
2.4.2 使用PATH 环境变量
2.4.3 更改命令行的PATH 环境变量
2.4.4 在Windows 上将文件夹永久添加到PATH
2.4.5 在macOS 和Linux 上将文件夹永久添加到PATH
2.5 不借助命令行运行Python 程序
2.5.1 在Windows 上运行Python程序
2.5.2 在macOS 上运行Python 程序
2.5.3 在Ubuntu Linux 上运行Python程序
第3章 使用Black 进行代码格式化
3.1 让程序员招人烦的错误做法
3.2 风格指南和PEP 8
3.3 水平间距
3.3.1 使用空格进行缩进
3.3.2 行内间距
3.4 垂直间距
3.4.1 垂直间距示例
3.4.2 垂直间距的最佳实践
3.5 Black:毫不妥协的代码格式化工具
3.5.1 安装Black
3.5.2 在命令行中运行Black
3.5.3 对部分代码禁用Black
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(一)
小册名称:Python编程轻松进阶(一)
### 2.3.7 在Python程序中运行命令 在Python编程中,经常需要执行外部命令或程序以完成特定任务,比如文件操作、系统监控、自动化测试等。Python提供了几种方式来实现这一需求,包括使用标准库中的`subprocess`模块、`os`模块中的部分函数,以及更高级的第三方库如`sh`、`pexpect`等。本章节将重点介绍如何使用`subprocess`模块在Python程序中运行命令,因为它提供了最灵活和强大的方式来处理外部命令的执行。 #### 2.3.7.1 subprocess模块简介 `subprocess`模块允许你启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。这是Python执行外部命令的推荐方式,因为它比使用`os.system()`或`os.popen()`等旧方法更加安全和灵活。 `subprocess`模块中的几个常用函数包括: - `subprocess.run()`(Python 3.5+):推荐用于新的代码,它是一个高级接口,用于执行命令并等待完成。 - `subprocess.Popen()`:一个更底层的接口,提供了更多的灵活性,比如可以非阻塞地执行命令。 - `subprocess.call()`、`subprocess.check_call()`、`subprocess.check_output()`:这些函数是`subprocess.run()`的前身,虽然在新代码中推荐使用`subprocess.run()`,但在一些旧代码中仍然可以看到它们的身影。 #### 2.3.7.2 使用subprocess.run()执行命令 `subprocess.run()`函数是Python 3.5及以后版本中引入的,用于替代`subprocess.call()`、`subprocess.check_call()`和`subprocess.check_output()`。它提供了一个简洁的接口来执行外部命令并获取其输出。 **基本用法**: ```python import subprocess # 执行命令并等待完成 result = subprocess.run(['ls', '-l'], capture_output=True, text=True) # 检查命令是否成功执行 if result.returncode == 0: print("命令执行成功,输出如下:") print(result.stdout) else: print("命令执行失败,错误信息如下:") print(result.stderr) ``` 在这个例子中,`subprocess.run()`执行了`ls -l`命令(在Unix/Linux系统中列出当前目录下的文件和文件夹的详细信息),`capture_output=True`参数用于捕获命令的标准输出和标准错误输出,`text=True`参数(在Python 3.7+中引入)确保输出以文本形式返回,而不是字节串。 **参数说明**: - `args`:要执行的命令和参数,应作为列表传递,例如`['ls', '-l']`。 - `capture_output`:是否捕获命令的输出,默认为`False`。 - `text`:是否在捕获输出时以文本模式打开文件(Python 3.7+),默认为`False`(即以字节模式打开)。 - `shell`:是否通过shell来执行命令(如`/bin/sh -c`),默认为`False`。使用`shell=True`时要小心注入攻击。 - `timeout`:命令执行的最大时间(秒),如果命令超时,将抛出`subprocess.TimeoutExpired`异常。 #### 2.3.7.3 使用subprocess.Popen()执行命令 如果你需要更复杂的控制,比如同时执行多个命令、非阻塞地执行命令或处理大量的输入输出数据,那么`subprocess.Popen()`可能是更好的选择。 **基本用法**: ```python import subprocess # 创建Popen对象 proc = subprocess.Popen(['grep', 'python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) # 向命令发送输入数据 stdout, stderr = proc.communicate(input='Python is awesome!\nPython is fun!\n') # 检查命令是否成功执行 if proc.returncode == 0: print("命令执行成功,输出如下:") print(stdout) else: print("命令执行失败,错误信息如下:") print(stderr) ``` 在这个例子中,`subprocess.Popen()`被用来执行`grep`命令,它搜索输入中包含“python”的行。`stdin`、`stdout`和`stderr`参数分别用于指定子进程的标准输入、标准输出和标准错误输出的处理方式。`communicate()`方法用于向子进程发送数据并等待其完成,同时获取输出和错误信息。 **注意**: - 使用`Popen`时,应始终调用`communicate()`方法来发送数据和获取输出,这样可以避免死锁等问题。 - 如果不需要与子进程进行交互(即不需要发送数据或读取输出),则可以将`stdin`、`stdout`、`stderr`设置为`None`或`subprocess.DEVNULL`(Python 3.3+)。 #### 2.3.7.4 注意事项 - **安全**:当使用`shell=True`或构造包含外部输入的命令时,要特别小心注入攻击。尽量使用列表形式传递命令和参数,避免使用字符串拼接。 - **错误处理**:检查命令的返回码以确定是否成功执行,并妥善处理标准输出和标准错误输出。 - **跨平台兼容性**:在编写跨平台的Python脚本时,要注意不同操作系统中命令的差异。 #### 2.3.7.5 小结 通过`subprocess`模块,Python程序能够灵活且安全地执行外部命令。`subprocess.run()`和`subprocess.Popen()`是执行外部命令的两种主要方式,它们各自适用于不同的场景。掌握这些技能将极大地增强你的Python脚本编写能力,使其能够完成更加复杂和自动化的任务。在编写涉及外部命令的Python脚本时,请务必注意安全性、错误处理和跨平台兼容性。
上一篇:
2.3.6 运行py.exe 程序
下一篇:
2.3.8 使用Tab 补全命令减少输入量
该分类下的相关小册推荐:
Python与办公-玩转Word
Python甚础Django与爬虫
Python与办公-玩转Excel
Python合辑2-字符串常用方法
Python合辑1-Python语言基础
Python爬虫入门与实战开发(上)
剑指Python(万变不离其宗)
Python合辑3-字符串用法深度总结
Python合辑11-闭包函数
Python机器学习基础教程(上)
Python编程轻松进阶(五)
Python合辑12-面向对象