执行系统命令(win,linux等)并返回结果给python的原理:subprocess打开一个系统命令终端,执行输入的命令,并通过操作系统(也就是连接命令终端和python的管道,因命令终端输出的数据(在系统某个内存位置)和python的数据(也在系统某个内存位置,但是两者的内存位置都能访问的就是操作系统)是不不互通的)返回给python。

subprocess的三种执行方法:

 1>subprocess.run(*popenargs, input=None, timeout=None, check=False, **kwargs)(貌似python3.4没有,装了python3.6有这个方法)

 2>subprocess.call(*popenargs, timeout=None, **kwargs)

 3>subprocess.Popen() # 上面两种是基于这个再封装的

run方法实例

subprocess.run('ping 192.168.1.1')

a = subprocess.run('ping 192.168.1.1', stderr=subprocess.PIPE, stdout=subprocess.PIPE, check=False)

a.stdout # 输出命令的执行结果

a.stderr # 输出错误信息

a2= subprocess.run(['ping', '192.168.1.1'], stderr=subprocess.PIPE, stdout=subprocess.PIPE, check=False)

参数check=True或者False的区别(若是命令有误,True的时候会直接报错,False则不会,需要用stderr去查看错误)


call方法实例

只返回命令的执行状态,0或者非0

b = subprocess.call('ping 192.168.1.1', stderr=subprocess.PIPE, stdout=subprocess.PIPE)

只返回命令的执行状态0 或者异常信息

b = subprocess.check_call('ping 192.168.1.1', stderr=subprocess.PIPE, stdout=subprocess.PIPE)

执行系统命令模块--subprocess

返回元祖形式的执行结果(执行状态, 命令结果)

subprocess.getstatusoutput('ping 192.168.1.1')

执行系统命令模块--subprocess

只返回命令结果

subprocess.getoutput('ping 192.168.1.1')


Popen()方法实例

run与Popen的区别:如果调用的命令需要执行一段时间,run方法会等待命令执行完毕,才能进入下一步操作,

但是Popen方法会立即返回主程序(类似后台执行,不影响主程序),继续主程序操作,命令也在终端里同步执行,可以用

一些方法去检测命令是否执行完毕。

>>> aa = subprocess.run('ping 192.168.1',shell=True,stdout=subprocess.PIPE) # 程序卡在这,直到ping命令执行完毕
>>> aa2 = subprocess.Popen('ping 192.168.1',shell=True,stdout=subprocess.PIPE) # 即刻返回当前主程序,可以用poll

命令查看是否执行完成(多次执行poll,直到完成才会返回相应的执行状态)

>>> aa2.poll()
 >>> aa2.poll()
 >>> aa2.poll()
 1

 aa2.wait() # wait方法则主动等待命令执行完成(等待期间不能做别的事,直到返回执行状态)

由于命令执行可以‘切到后台’,当并不关心执行完成与否或者结果时,可以主动‘杀掉进程’

>>> aa4 = subprocess.Popen('ping 192.168.1',shell=True,stdout=subprocess.PIPE)
 >>> aa4.terminate() #terminal再poll直接就获取到执行状态的结果了
 >>> aa4.poll()
 1

aa4.kill()

aa4.pid #取得进程id

执行系统命令模块--subprocess

 aa4.send_singal(singal.xxx) # 直接给进程发送信号(指令),如 kill指令

执行系统命令模块--subprocess

目前就用到这么几个,以后用到再补充

执行系统命令模块--subprocess






相关文章: