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