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() 方法可以得到执行结果的成功输出和报错输出,如果没有报错则报错为空字符串。

posted @ 2023-05-12 19:30  __Yoon  阅读(144)  评论(0编辑  收藏  举报