模块-subprocess
os模块执行系统命令 编辑
os.system('system cmd'),返回系统执行结果,0为成功,非0失败
os.popen('system cmd'),返回系统命令执行返回结果
subprocess也是执行命令,在python3中,subprocess替换os.system,os.spawn,os.popen功能。
subprocess.run()推荐
例:
import subprocess #执行单命令 cmd_result=subprocess.run(['ipconfig','/all'],stderr=subprocess.PIPE,stdout=subprocess.PIPE,check=True) #check=True:报错则报CalledProcessError错误 #check=False,默认,程序不会报错,命令执行的错误返回在sederr中 #命令执行结果 print(cmd_result.stdout) #系统命令添加其他参数 cmd_result=subprocess.run('df -h | grep disk1',stderr=subprocess.PIPE,stdout=subprocess.PIPE,shell=True) #1、命令以字符串方式传入,不用列表 #2、shell=True,告诉subprocess将命令直接执行,不进行拼接
subprocess.call()
例:
import subprocess #命令执行完后直接反回命令执行结果和执行状态 subprocess.call('ipconfig /all') #正常执行返回,否则抛出异常 subprocess.check_call(['ls','-l']) #接收字符串格式命令,反回元组,第一个状态,第二个结果 subprocess.getstatusoutput('ls /bin/ls') #接收字符串格式命令,并反回结果 subprocess.getoutput('ls /bin/ls') #执行命令,返回结果,非打印 subprocess.check_output('ls -l')
subprocess.Popen(),run和call的底层封装
run和Popen区别,Popen另起一个进程处理当前命令,run在当前进程中执行
例:
import subprocess #args:shell命令,可以是字符串,list,元组 #stdin,stdout,stderr:分别代表标准输入、输出、错误句柄 #preexec_fn:Unix平台有效,用于指定一个可执行对象,将在子进程执行之前被调用 #shell:True或者Flase,字符串方式传入命令,True表示不对命令进行解析 #cwd:设置子进程当前目录 #env:指定子进程环境变量,不指定则从父进程继承 result=subprocess.Popen('cmd',shell=True,stdout=subprocess.PIPE) result.poll()#获取进程执行结果状态,0表示命令无错误 result.wait()#等待子进程结束 result.pid#进程号 result.terminate()#发送停止信号,不强制停掉 result.kill()#强制结束进程 result.stdout.read()#命令执行结果 #交互 #该方法定义在一个py文件中,命名为interaction.py def interaction(): while True: input=input('Enter msg:') if input=='q': break else: print(input) interaction() #subprocess.Popen()交互 result=subprocess.Popen('python interaction.py',stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE,shell=True) result.communicate(b'send')#给进进程发送数据,只能交互一次,如果程序需要交互多次,则会报错 #发送信号 import signal result.send_signal(signal=signal.SIGTERM)#结束进程