Python 执行 Shell命令
方法一:os.system()
os.system() 可以说是最为基本的运行 shell 命令的方式了,这个方法的特点就是直接运行命令,并将运行之后的状态值返回码返回,所以结果是一个 int 类型,这个方式比较常见是运用在只需要执行 shell 命令而不需要得到命令的返回结果的场景。
比如执行一个创建目录的操作就可以执行实用这个方法:
vim 3.py import os cmd = "mkdir /data/backup/test/hankyoon" res = os.system(cmd) print(res) [root@db-hankyoon scripts]# python3.8 3.py 0 [root@db-hankyoon scripts]# python3.8 3.py mkdir: cannot create directory ‘/data/backup/test/hankyoon’: File exists 256
方法二:os.popen()
os.popen() 方法执行命令之后会把成功执行的命令的结果以文件的形式返回,所以可以通过 read() 方法获取执行的结果,而如果执行失败,则文件为空,所以这个方法的适用场景是命令返回的结果比较多,需要进行提取结果的场景。
vim 3.py import os cmd = "mkdir /data/backup/test/hankyoon && ls /tmp" res = os.popen(cmd) print(type(res)) print(res.read())
方法三:commands 模块
commands 模块主要常用的是下面两个方法:
commands.getstatusoutput(cmd) # 返回(状态码, 输出结果)
commands.getoutput(cmd) # 只返回输出结果
这个模块看起来就比较完善了,可以同时得到执行的状态码和输出结果,可以说是同时具备了 os.system() 和 os.popen() 的功能,实用性更强一些。
vim 3.py import commands cmd = "cd /data/backup/test && mkdir hankyoon && ls" res = commands.getstatusoutput(cmd) print(res) res = commands.getstatusoutput(cmd) print(res)
方法四:subprocess 模块
subprocess 模块是官方比较推荐的模块,基本可以取代上面的三种方法,功能也更加强大,可以满足大部分的场景.
subprocess.call() 相当于 os.system() 命令的用法,它执行命令并将执行结果状态码返回。
vim 3.py import subprocess cmd = "cd /data/backup/test && mkdir hankyoon && ls" res = subprocess.call(cmd, shell=True) print(res)
subprocess 模块里面的方法执行 shell 命令的时候如果传入的命令是字符串的形式,那必须将参数 shell 设置为 True,不然默认就是使用的列表作为命令的传入参数,比如看下面这种不设置 shell=True 和设置的对比:
vim 3.py import subprocess res1 = subprocess.call(['ls', '-l']) -rw-r--r-- 1 root root 65 2023/05/12 19:18:09 3.py res1 = subprocess.call('ls -l', shell=True) -rw-r--r-- 1 root root 65 2023/05/12 19:18:09 3.py
当不设置 shell=True 的时候,必须将命令分解成列表传入才能执行.
subprocess.Popen() 方法是我们项目代码中使用的,这个方法同样是可以输出执行的状态码和输出结果,但是参数比 commands 需要的多。
vim 3.py import subprocess cmd = "cd /data/backup/test && mkdir hankyoon && ls" res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(res.communicate())
使用 communicate() 方法可以得到执行结果的成功输出和报错输出,如果没有报错则报错为空字符串。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2022-05-12 MySQL 线程池总结(转发)