Python调用Shell命令有哪些常见模块?1、os模块#os.system(command)
其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256表示未找到,该方法适用于shell命令不需要输出内容的场景。
[root@db01~]$ vim 1.pyimportos
ret= os.system('/usr/local/mysql/bin/mysql --login-path=dba -BNse "show databases;"')print(ret, type(ret))
[root@db01~]$ python3 1.py
app01
information_schema
mysql
performance_schema
sys
0
#os.open(command)
该方法以文件的形式返回shell指令运行后的结果,需要获取内容时可使用read(),readline(),readlines()方法。
[root@db01~]$ vim 1.pyimportos
ret= os.popen('/usr/local/mysql/bin/mysql --login-path=dba -BNse "show databases;"')print(ret, type(ret))print(ret.read())
[root@db01~]$ python3 1.pyapp01
information_schema
mysql
performance_schema
sys#os.exec()
2、commands模块
commands模块是python2.X的内置模块。
python2中的commands模块在python3.x被subprocess取代了。
(1)commands.getstatusoutput(command),其以字符串的形式返回的是输出结果和状态码,即(status,output)。
(2)commands.getoutput(command),返回cmd的输出结果。
(3)commands.getstatus(file),返回ls -l file的执行结果字符串,调用了getoutput,不建议使用此方法。
[root@db01~]$ vim 1.pyimportcommands
(status, output)= commands.getstatusoutput('/usr/local/mysql/bin/mysql --login-path=zhouwanchun -BNse "show databases;"')print(status)print(output)3、subprocess模块
允许创建很多子进程,创建的时候能指定子进程和子进程的输入、输出、错误输出管道,执行后能获取输出结果和执行状态。
(1)subprocess.run() python3.5中新增的函数,执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。
(2)subprocess.call() 执行指定的命令,返回命令执行状态,功能类似os.system()。
(3)subprocess.check_call() python2.5中新增的函数,执行指定的命令,如果执行成功则返回状态码,否则抛出异常。
说明:
subprocess.run(args,*, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)
subprocess.run(args,*, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
subprocess.call(args,*, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
subprocess.check_call(args,*, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
subprocess.Popen()
args:表示shell指令,若以字符串形式给出shell指令,如"ls -l"则需要使shell=Ture。否则默认已数组形式表示shell变量,如"ls","-l"。
当使用比较复杂的shell语句时,可以先使用shlex模块的shlex.split()方法来帮助格式化命令,然后在传递给run()方法或Popen。#shell:命令解释器,相当于调用cmd 执行指定的命令。#stdout:正确结果丢到管道中。#stderr:错了丢到另一个管道中。
[root@db01~]$ vim 1.pyimportsubprocessimportshlex
command= "/usr/local/mysql/bin/mysql --login-path=dba -BNse 'show databases;'"args=shlex.split(command)
subprocess.Popen(args)
[root@db01~]#python3 1.py
information_schema
app01
mysql
performance_schema
sys
[root@db01~]$ vim 1.pyimportsubprocess
ret= subprocess.call("/usr/local/mysql/bin/mysql --login-path=dba -BNse 'show databases;'", shell=True)print(ret, type(ret))
[root@db01~]#python3 1.py
information_schema
app01
mysql
performance_schema
sys
0