模块-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)#结束进程

  

posted @ 2018-03-30 23:32  丫丫625202  阅读(195)  评论(0编辑  收藏  举报