Python subprocess简单理解
在 Python 中,`subprocess` 是一个**标准库模块**(无需额外安装),用于创建和管理子进程、执行外部命令或程序。它允许你与其他系统命令/脚本交互,并捕获它们的输出、错误或返回状态。
---
### **用途**
1. 执行外部命令(如 `ls`, `dir`, `ping` 等)
2. 调用其他程序或脚本(如调用另一个 Python 脚本)
3. 管道(pipe)输入/输出流
4. 获取命令执行结果(返回码、标准输出、错误输出)
---
### **无需安装**
`subprocess` 是 Python 内置模块,只需直接导入即可使用:
```python
import subprocess
```
---
### **基本用法**
#### 1. 执行简单命令(推荐 `subprocess.run`)
```python
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout) # 输出命令结果
print(result.returncode) # 返回状态码(0 表示成功)
```
#### 2. 执行命令并获取输出(`check_output`)
```python
output = subprocess.check_output(["echo", "Hello World!"], text=True)
print(output) # Hello World!
```
#### 3. 高级控制(`Popen`)
```python
process = subprocess.Popen(["ping", "google.com"], stdout=subprocess.PIPE, text=True)
while True:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
print(output.strip())
```
---
### **关键参数说明**
- `args`: 命令参数(推荐使用列表形式,如 `["ls", "-l"]`)
- `capture_output=True`: 捕获标准输出和错误输出
- `text=True`: 以字符串形式返回输出(否则返回字节)
- `shell=True`: 通过系统 shell 执行命令(**慎用,存在安全风险**)
- `timeout=30`: 设置超时时间(秒)
---
### **注意事项**
1. **避免 `shell=True`**
除非必要(如需要执行管道操作 `|`),否则不要使用 `shell=True`,以防止命令注入攻击。
```python
# 不安全的写法
subprocess.run(f"ls -l {user_input}", shell=True)
# 安全的写法
subprocess.run(["ls", "-l", user_input])
```
2. **处理路径空格**
如果参数包含空格,使用列表形式自动处理,无需手动加引号。
3. **跨平台兼容性**
不同系统的命令可能不同(如 `dir` 在 Windows,`ls` 在 Linux/Mac)。
---
### **常见问题**
- **如何获取错误信息?**
使用 `result.stderr` 或捕获 `subprocess.CalledProcessError` 异常。
- **如何输入内容到子进程?**
通过 `input` 参数(需配合 `stdin=subprocess.PIPE`)。
- **如何后台运行命令?**
使用 `Popen` 并忽略输出。
如果需进一步了解具体场景的用法,可以提供更多细节,我可以给出针对性示例。