os.system() 是执行外部命令最简单的方法,但功能有限。
import os
# 执行简单的系统命令
return_code = os.system("ls -l")
# 打印命令的退出状态码
print("命令退出状态:", return_code)os.popen() 可以执行命令并获取其输出内容。
import os
# 执行命令并获取输出
output = os.popen("date").read()
print("当前日期:", output)Python 3.5+ 引入了 subprocess.run(),这是目前执行外部命令的推荐方法。
import subprocess
# 执行命令并捕获输出
result = subprocess.run(
["ls", "-l", "/"],
capture_output=True,
text=True,
check=True
)
# 输出结果
print("返回码:", result.returncode)
print("标准输出:\n", result.stdout)
print("标准错误:", result.stderr)# 带超时和输入的命令执行
try:
result = subprocess.run(
["grep", "python"],
input="Welcome to Python programming\nPython is awesome!",
capture_output=True,
text=True,
timeout=5
)
print("找到的内容:", result.stdout)
except subprocess.TimeoutExpired:
print("命令执行超时!")对于需要更精细控制的场景,可以使用 subprocess.Popen 类。
import subprocess
# 启动进程
process = subprocess.Popen(
["python", "-c", "import time; [print(i) for i in range(5)]; time.sleep(2)"],
stdout=subprocess.PIPE,
text=True
)
# 实时读取输出
for line in process.stdout:
print(f"收到输出: {line.strip()}")
# 等待进程结束
return_code = process.wait()
print(f"进程结束,返回码: {return_code}")check_output() 专门用于获取命令输出,并在非零退出码时抛出异常。
import subprocess
try:
# 获取命令输出
output = subprocess.check_output(
["echo", "Hello, Python!"],
text=True
)
print("命令输出:", output)
# 检查命令是否成功
disk_usage = subprocess.check_output(
["df", "-h", "/"],
text=True
)
print("磁盘使用情况:\n", disk_usage)
except subprocess.CalledProcessError as e:
print(f"命令执行失败,返回码 {e.returncode}")shell=True,防止命令注入攻击subprocess.run()替代旧方法text=True获取字符串而非字节场景 | 推荐方法 |
|---|---|
简单命令,不关心输出 | os.system() |
需要获取输出 | subprocess.run() |
与进程交互 | subprocess.Popen() |
需要确保命令成功 | subprocess.check_output() |
Python提供了多种调用外部命令的方法:
os.system()和os.popen()仍然可用subprocess.run()作为首选方法subprocess.Popen()subprocess.check_output()始终优先考虑安全性:避免命令注入攻击,使用参数列表而不是字符串拼接,并验证所有用户输入。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。