环境

python3.10.12,ubuntu22

想当初学习python的一大动力就是使用python调shell脚本,一些复杂的逻辑丢个python去处理,而shell只执行最底层的一俩行代码,而如果全程用shell去写程序就相当头大了

调用方法

  • 方法1:使用原生的os.system()

os模块是Python标准库的一部分,提供了与操作系统交互的功能。os.system()方法可以用来执行shell命令。

import os

# 执行命令并获取返回码
return_code = os.system('ls -l')
if return_code == 0:
    print("命令执行成功")
else:
    print("命令执行失败")

python执行shell并获取结果_shell命令

这个方法在测试简单命令时可以使用,如果要看完整的输出,就有些吃力了,因为这个只有代码执行的成功与否,没有更多的其他信息。

  • 方法2:使用subprocess.run()

subprocess模块提供了更强大的接口来执行外部命令,并可以捕获其输出。

import subprocess

# 执行命令并捕获输出
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# 打印返回码和输出结果
print('返回码:', result.returncode)
print('输出结果:')
print(result.stdout)

# 检查命令是否执行成功
if result.returncode == 0:
    print("命令执行成功")
else:
    print("命令执行失败")

python执行shell并获取结果_python_02

优点

  • 可以捕获命令的标准输出和标准错误。
  • 可以设置超时,防止无限等待。
  • 更灵活的参数设置。

缺点

  • 相对于os.system(),使用稍微复杂一些。

方法3:使用subprocess.Popen()

import subprocess

# 创建子进程执行命令
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

# 读取输出和错误
stdout, stderr = process.communicate()

# 打印输出和错误
print('输出结果:')
print(stdout)
if stderr:
    print('错误信息:')
    print(stderr)

# 检查返回码
if process.returncode == 0:
    print("命令执行成功")
else:
    print("命令执行失败")

subprocess.run()对比,  可以实时获取命令的输出,而不是等待命令执行完毕。而且是更细粒度的控制,而非阻塞读取输出,就是比前者更麻烦点了

综述,在调用shell命令时,最好还是不要直接把参数输入当命令直接执行,防止被注入,最好是使用subprocess模块的列表形式进行传参