跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

python中如何执行shell命令行

python 执行shell命令行,最直接的方法是使用
os.system()
函数。 但这并非最佳实践,因为它缺乏对shell命令执行结果的控制。 我曾经因为直接使用
os.system()
而遇到过麻烦,当时一个脚本需要根据shell命令的返回值决定后续操作,而
os.system()
只返回一个状态码,信息量太少,导致调试异常困难。 更可靠且灵活的方式是使用
subprocess
模块。 这个模块提供了更精细的控制,允许你捕获命令的标准输出、标准错误,以及返回码。 举个例子,假设你需要执行一个
ls -l
命令并打印结果:
import subprocess process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() if process.returncode == 0: print(stdout.decode()) # 解码字节流为字符串 else: print(f"Error executing command: {stderr.decode()}")
这段代码首先创建一个
subprocess.Popen
对象,指定要执行的命令(
ls -l
),并重定向标准输出和标准错误到管道。
process.communicate()
方法等待命令执行完毕,并返回标准输出和标准错误。 关键在于检查
process.returncode
,它会告诉你命令是否成功执行(0表示成功)。 我曾经在处理大型文件时,用这种方法监控命令执行进度,避免因为命令卡死而导致程序崩溃。 此外,
subprocess
模块还提供了
subprocess.run()
函数,它提供了一种更简洁的执行shell命令的方式: 立即学习 “ Python免费学习笔记(深入) ”; Python 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载
import subprocess result = subprocess.run(['ls', '-l'], capture_output=True, text=True) if result.returncode == 0: print(result.stdout) else: print(f"Error executing command: {result.stderr}")
capture_output=True
选项会自动捕获标准输出和标准错误,
text=True
则会自动将输出解码为字符串,省去了手动解码的步骤。 我个人更倾向于使用
subprocess.run()
,因为它代码更简洁,可读性更好。 需要注意的是,直接使用
subprocess.Popen
或
subprocess.run
执行shell命令时,如果命令包含用户输入,存在潜在的安全风险。 为了避免注入攻击,建议使用
shlex.quote()
函数对命令参数进行转义。 比如,如果用户输入文件名作为命令参数,应该先用
shlex.quote()
处理后再传递给
subprocess
函数。 这在处理用户提供的数据时尤其重要,可以有效防止恶意代码的执行。 我曾经因为忽略了这一点而差点酿成安全事故,所以这个细节务必重视。 总之,
subprocess
模块提供了比
os.system()
更安全、更灵活、更强大的方式来执行shell命令,强烈建议使用它。 记住仔细处理命令的输出和错误信息,并注意安全问题,才能确保你的Python脚本稳定可靠地运行。

相关文章