python执行linux系统命令的三种方式小结
作者:神的孩子都在歌唱
前言
这是我在这个网站整理的笔记,有错误的地方请指出
1. 使用os.system
os.system(cmd),其中cmd就是需要执行的linux命令。该方式会阻塞主进程,直到命令执行结束并返回状态,如果返回的状态值为0,表示命令正常执行,如果不为0,则表示命令执行异常。要注意的是,该方式执行linux命令,会直接打印出命令执行的结果,但是不会作为对象返回,因此程序无法直接获取命令执行的结果。
无法获取命令执行后的返回信息
import os os.system('ls')
2. 使用os.popen
os.popen(cmd)方式,不会阻塞主进程,执行命令的子进程会和主进程同步运行,如果想要进行阻塞,等到命令执行完再执行下一步,可以通过os.wait()函数等到子进程执行完毕。
os.popen()会返回一个对象,该对象可文件对象类似,支持文件对象的读写接口,该对象会保存命令执行的结果,可以通过对象的read()函数获取结果内容。因此,该方式相比于os.system()的特点是,不阻塞子进程,可以直接获取命令执行的结构。
能够获取命令执行后的返回信息
import os data=os.popen('ls').readlines() print(data)
3. 使用模块 subprocess
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位置,才能读取)
通过subprocess模块可以更灵活地执行命令,并获取执行后的返回信息。
import subprocess # 使用Popen执行命令,并捕获标准输出 result = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # 读取并解码标准输出 output_bytes = result.stdout.read() output_str = output_bytes.decode('utf-8') # 输出结果 print(output_str) # 或者逐行输出结果 for line in output_str.splitlines(): print(line)
参数解释:
shell=True
:指示在shell中运行命令。stdout=subprocess.PIPE
:捕获命令的标准输出。stderr=subprocess.STDOUT
:将标准错误输出重定向到标准输出。
通过使用subprocess模块,可以更方便地处理命令执行的输出,并在需要时对其进行进一步处理。
到此这篇关于python执行linux系统命令的三种方式小结的文章就介绍到这了,更多相关python执行linux系统命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!