在Python中调用Bash命令是常见的系统交互需求,尤其在自动化运维、数据处理或开发工具链中,Python提供了多种方式执行Bash命令,包括os.system
、subprocess
模块、os.popen
以及第三方库paramiko
(用于远程执行),以下是详细解析:

基础方法:os.system
os.system
是最简单的调用方式,直接执行Bash命令并返回退出状态码,但无法获取命令的输出结果。
import os status = os.system("ls -l") # 执行ls -l命令,返回0表示成功
特点:
- 优点:简单直观,适合快速执行命令。
- 缺点:无法捕获输出,不适合需要处理结果的场景。
推荐方法:subprocess
模块
subprocess
是Python 3.5+提供的标准库,功能强大且灵活,支持获取输出、错误流及超时控制。
subprocess.run
(推荐)
import subprocess result = subprocess.run(["ls", "-l"], capture_output=True, text=True) print(result.stdout) # 打印标准输出 print(result.stderr) # 打印标准错误
参数说明:
| 参数 | 作用 | 示例值 |
|---------------|-------------------------------|----------------------|
| args
| 命令及参数列表 | ["ls", "-l"]
|
| capture_output
| 是否捕获输出 | True
|
| text
| 是否以文本形式返回输出 | True
(默认bytes
)|
| timeout
| 超时时间(秒) | 5
|

subprocess.Popen
(高级用法)
适合复杂场景,如实时处理输出流:
import subprocess process = subprocess.Popen(["ping", "-c", "4", "example.com"], stdout=subprocess.PIPE, text=True) for line in process.stdout: print(line.strip()) # 实时打印输出
其他方法
os.popen
output = os.popen("ls -l").read() # 获取命令输出 print(output)
特点:比os.system
更灵活,但已被subprocess
取代。
第三方库paramiko
用于远程执行Bash命令(需SSH连接):
import paramiko ssh = paramiko.SSHClient() ssh.connect("hostname", username="user", password="pass") stdin, stdout, stderr = ssh.exec_command("ls -l") print(stdout.read().decode()) ssh.close()
最佳实践
-
安全性:避免直接拼接用户输入到命令中,防止命令注入攻击。
(图片来源网络,侵删)# 错误示例(危险!) user_input = "malicious; rm -rf /" os.system(f"echo {user_input}") # 正确做法 subprocess.run(["echo", user_input])
-
错误处理:检查返回码或异常。
try: result = subprocess.run(["invalid_cmd"], check=True) except subprocess.CalledProcessError as e: print(f"命令失败: {e}")
-
跨平台兼容性:使用
shutil.which
检查命令是否存在。import shutil if shutil.which("ls"): print("ls命令可用")
FAQs
Q1: 如何在Python中执行需要sudo权限的Bash命令?
A1: 可以通过sudo
前缀,但需注意密码输入,推荐使用sudo
的-S
参数从标准输入读取密码:
import subprocess password = "your_password" process = subprocess.Popen(["sudo", "-S", "apt", "update"], stdin=subprocess.PIPE, text=True) process.communicate(input=password + "\n")
Q2: 如何在Python中同时获取命令的输出和错误流?
A2: 使用subprocess.run
的stdout
和stderr
参数,或合并流:
# 方法1:分别捕获 result = subprocess.run(["cmd"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print(result.stdout, result.stderr) # 方法2:合并流(stderr重定向到stdout) result = subprocess.run(["cmd"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) print(result.stdout)
通过合理选择调用方式,Python可以高效地与Bash命令交互,满足从简单执行到复杂系统管理的各类需求。