在Python中执行Shell命令并获取其结果,通常可以使用subprocess
模块。这个模块允许我们启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。下面是一个详细的示例,展示了如何使用subprocess.run()
函数来执行Shell命令并获取其输出。
1. 示例一:使用subprocess.run()
执行ls
命令并获取结果
这个示例将执行ls
命令(在Unix/Linux/macOS系统上列出当前目录下的文件和文件夹),并捕获命令的输出和返回码。
import subprocess
# 定义要执行的命令
command = ['ls', '-l'] # 使用列表形式,更安全,可以避免shell注入攻击
# 执行命令
# capture_output=True 参数表示捕获命令的输出(stdout和stderr)
# text=True 参数表示将输出作为文本处理(Python 3.7+),之前版本使用universal_newlines=True
result = subprocess.run(command, capture_output=True, text=True)
# 获取命令的标准输出
stdout = result.stdout
# 获取命令的错误输出(如果有的话)
stderr = result.stderr
# 获取命令的返回码
returncode = result.returncode
# 打印结果
print(f"标准输出:\n{stdout}")
if stderr:
print(f"错误输出:\n{stderr}")
print(f"返回码: {returncode}")
# 注意:如果命令成功执行,returncode通常为0;非0值表示有错误发生
注意事项:
(1)安全性:本例中使用命令列表而非字符串来避免shell注入攻击。当命令和参数以列表形式提供时,Python会直接将它们传递给系统,不会通过shell解释,从而减少了安全风险。
(2)文本与字节:capture_output=True
和 text=True
(或universal_newlines=True
,在旧版本中)的组合使得输出以文本(字符串)形式返回,而不是字节。这对于处理文本数据很方便,但如果我们需要处理二进制数据(如图像或视频文件),则可能需要以字节形式捕获输出。
(3)错误处理:通过检查returncode
可以判断命令是否成功执行。如果