执行系统命令(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.getstatusoutput('ping 192.168.1.1')
只返回命令结果
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
aa4.send_singal(singal.xxx) # 直接给进程发送信号(指令),如 kill指令
目前就用到这么几个,以后用到再补充