本文介绍三种在python执行linux命令的方式,三种方式都是基于python的标准库实现,因此不需要额外安装第三方库。
os.system()
os.system(cmd),其中cmd就是需要执行的linux命令。该方式会阻塞主进程,直到命令执行结束并返回状态,如果返回的状态值为0,表示命令正常执行,如果不为0,则表示命令执行异常。要注意的是,该方式执行linux命令,会直接打印出命令执行的结果,但是不会作为对象返回,因此程序无法直接获取命令执行的结果。
os.popen()
os.popen(cmd)方式,不会阻塞主进程,执行命令的子进程会和主进程同步运行,如果想要进行阻塞,等到命令执行完再执行下一步,可以通过os.wait()函数等到子进程执行完毕。
os.popen()会返回一个对象,该对象可文件对象类似,支持文件对象的读写接口,该对象会保存命令执行的结果,可以通过对象的read()函数获取结果内容。因此,该方式相比于os.system()的特点是,不阻塞子进程,可以直接获取命令执行的结构。
subprocess.Popen()
subprocess.Popen(args,shell=True,stdout=f),其中args可以为字符串,也可以为一个列表,如果是字符串,那么会将其认为是可执行程序直接运行,如果是一个列表,则会将其当做是空格隔开的shell命令,此时需要将shell参数设为True,才行。例如subprocess.Popen(['ps','-ef'],shell=True),会显示所有的进程。这里需要注意的是,这里默认环境是当前主进程,因此只会显示当前主进程下所有的进程信息,而不是整个系统的进程信息。subprocess.Popen()返回的对象具有多个方法,默认该方式对于命令执行是非阻塞的,但是可以通过p.wait()进行阻塞,其中p表示返回的对象,还可以通过pid属性获取进程号,kill()方法直接结束进程等。
此外,对于命令的执行结果,默认是直接打印出来,还可以通过stdout参数重定向到文件中,比如设置stdout参数为一个文件对象,就可以将结果输出到文件中。如果该文件同时支持读取模式,那么还可以先将文件指针seek到指定位置再读取命令执行后的输出结果。(因为写入输出结果后,文件指针在文件最后,因此直接读取是无法读到内容的,所以需要先seek到指定位置,比如0位置,才能读取)