本文介绍了在Python中执行Shell命令的四种常用方法,帮助开发者高效地将系统操作与Python脚本结合。
### Python调用Shell命令的四种常见方法
#### 方法一:使用`os`模块的`system`函数
在Python中,可以通过`os`模块执行操作系统相关的操作,其中包含可以直接运行Shell命令的接口如 `system()` 函数。该方法简单直接但功能有限。
```python
import os
# 执行ls -al 命令并打印状态码
val = os.system(ls -al)
print(val)
```
这里需要注意的是,`os.system()`函数返回一个整数表示命令执行的结果,0通常代表成功;其他值如256则可能意味着系统无法找到相应的程序或文件。
#### 方法二:使用`os.popen()`
相比`os.system()`,`os.popen()`提供了更多的灵活性。它将Shell命令的输出作为Python中的一个文件对象返回,并允许通过调用诸如 `read()` 或 `readlines()` 等方法来处理这些输出数据流。
```python
import os
# 使用os.popen执行ls -al 命令并读取其输出
with os.popen(ls -al) as f:
output = f.read()
print(output)
```
这种方法便于直接操作Shell命令产生的文本,并可进一步处理这些结果数据流。
#### 方法三:使用`commands`模块
虽然在Python 3中已被移除,但在Python 2版本中仍然可用的 `commands` 模块提供了一些更高级的功能来执行和获取Shell命令的结果。以下是几个主要函数:
1. **`getstatusoutput(cmd)`**:该方法运行给定的命令并返回一个包含退出状态码与标准输出结果的元组。
```python
import commands
status, output = commands.getstatusoutput(ls -al)
print(Status:, status)
print(Output:, output)
```
2. **`getoutput(cmd)`**:该方法仅返回执行命令的标准输出文本内容。
```python
import commands
output = commands.getoutput(ls -al)
print(output)
```
3. **`getstatus(file)`**:不推荐使用,因为这个函数依赖于 `getoutput()` 并且其行为可能不够直观。
#### 方法四:使用`subprocess`模块
Python的 `subprocess` 模块提供了创建子进程、通信以及操作输入输出的功能。它支持复杂的Shell命令处理和脚本执行。
1. **`subprocess.run()`**:这是从 Python 3.5 开始引入的一个函数,用于运行指定的程序并等待其完成,并返回一个包含结果信息的对象 `CompletedProcess`。
```python
import subprocess
result = subprocess.run([ls, -al], capture_output=True, text=True)
print(Return code:, result.returncode)
print(Output:, result.stdout)
```
2. **`subprocess.call()`**:该方法运行指定的命令并返回其状态码,类似于 `os.system()`
```python
exit_code = subprocess.call([ls, -al])
print(Exit code:, exit_code)
```
3. **`subprocess.check_call()`**:执行给定的程序。如果成功(即退出代码为 0),则正常结束;否则会抛出一个 `CalledProcessError` 异常。
```python
try:
subprocess.check_call([ls, -al])
except subprocess.CalledProcessError as e:
print(Error:, e)
```
这些方法接受的参数包括如命令字符串、输入输出重定向等,其中最重要的几个是:
- **`args`**:表示要执行的Shell命令。如果是列表形式(例如 `[ls, -al]`),则不需要设置额外选项;如果需要通过shell来运行复杂的语句,则需将其作为字符串传递并设置 `shell=True`
- **`stdout``stderr``stdin`**: 设置子进程的标准输入输出
- **`shell`**:默认为 `False`, 即以列表形式指定命令。若涉及复杂Shell语法,可设为 `True`
此外, 还有更高级的功能如管道操作和异步执行等。
Python中调用Shell命令的方式多样,在选择合适的方法时应考虑具体需求。