方法一: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() 方法可以得到执行结果的成功输出和报错输出,如果没有报错则报错为空字符串。
标签:Shell,Python,res,cmd,subprocess,命令,shell,py,os From: https://www.cnblogs.com/hankyoon/p/17396131.html