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
    '
  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/shenh/p/9673581.html
Copyright © 2011-2022 走看看