zoukankan      html  css  js  c++  java
  • python subprocess模块详解

    一、subprocess标准库

      python执行shell脚本,通常会使用so模块中的几个方法,如system、spawn*、popen等。subprocess标准库的引入就是为了取代这些老的模块方法。subprocess使用时,父进程创建子进程去执行一个外部程序,并提供了标准输入输出和管道(pipe)的实现方法。

     

    subprocess.Popen()

      subprocess库的一个基础类,下文介绍的subprocess.run、subprocess.call、subprocess.check_call、subprocess.check_output都是在此基础上的封装,若要实现一些复杂的业务流程使用subprocess.Popen()更灵活。

      程序运行subprocess.Popen()类,父进程创建子进程后,不会等待子进程执行完成。如果需要等待子进程,需要加入wait()方法阻塞父进程。

    示例1

    child = subprocess.Popen('ping www.baidu.com')
    print('End')

    示例2

    child = subprocess.Popen('ping www.baidu.com')
    child.wait()
    print('End')

    以上示例1没有等child 执行完就print,示例2父进程先阻塞,等待child执行完再print。

     

    subprocess.Popen(args, bufsize=-1, executable=None,stdin=None, stdout=None, stderr=None,preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,shell=False, cwd=None, env=None, universal_newlines=False,startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False,pass_fds=(), *, encoding=None, errors=None)

    args:shell命令,可以是str类型,或者list和tuple

    bufsize:缓冲区

    stdin、stdout、stderr:标准输入输出和标准错误日志

    subprocess.PIPE:创建Popen对象时,subprocess.PIPE可以初始化stdin、stdout、stderr参数。

     

    标准输出:

    import subprocess
    
    child = subprocess.Popen(['shell','python --version'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr= subprocess.PIPE)
    shell_out = child.stdout.read()
    # shell_out = child.communicate()     也可以使用communicate()方法输出
    shell_error = child.stderr.read()
    print(shell_out)
    print(shell_error)

    其他方法:

    child.poll()    #检查子进程状态
    
    child.kill()     #终止子进程
    
    child.send_signal()  #向子进程发送信号
    
    child.terminate()   #终止子进程

    subprocess.run()

    subprocess.run()函数是Python3.5中新增的一个高级函数,其返回值是一个subprocess.CompletedPorcess类的实例。

    child = subprocess.run('python --version', shell =True)
    print(child)
    
    #CompletedProcess(args='python --version', returncode=0)

    subprocess.call()

    父进程等待子进程完成

    执行成功返回0

    执行失败returncode=2,不会主动抛error

    child = subprocess.call('python --version', shell =True)
    print(child)
    
    #0

    subprocess.check_call()

    父进程等待子进程完成

    执行成功返回0

    returncode不为0,抛出subprocess.CalledProcessError:error信息只有returncode

    child = subprocess.check_call('python --version', shell =True)
    print(child)
    
    #0

    subprocess.check_output()

    父进程等待子进程完成

    执行成功返回output信息

    returncode不为0,抛出subprocess.CalledProcessError:error信息包含returncode和output信息

    child = subprocess.check_output('python --version', shell =True)
    print(child)
    
    #b'Python 3.6.4
    '
  • 相关阅读:
    《面试题 03.05. 栈排序》——惰性更新
    CTF<密码学> writeup 传统知识+古典密码
    有趣的数学(二)
    【】Dedecms友情链接去掉LI的方法介绍
    【】【】打工子弟学校学生们的中国梦何时圆?
    Discuz! 7.2 防注册机注册+发垃圾帖的解决方法
    Windows 8 常用快捷键
    Win7 64位系统下Auto CAD 2010注册激活,出现警告:Make sure you can write to current directory...
    怎么从EXCEL或WORD里提取图片?
    如何将windows xp系统下的outlook express6.0的邮件,帐号及通迅录导入Office Outlook xp/2003/2007中...
  • 原文地址:https://www.cnblogs.com/shenh/p/9673581.html
Copyright © 2011-2022 走看看