• Python3之subprocess模块


    一.简介

      subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。

    # subprocess用来替换多个旧模块和函数
    
    os.system
    os.spawn*
    os.popen*
    popen2.*
    commands.*
    

      运行python的时候,我们都是在创建并运行一个进程,linux中一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在python中,我们通过标准库中的subprocess包来fork一个子进程,并且运行一个外部的程序。subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。

    二.使用

    1. call

      执行命令,返回状态码,shell = True允许shell命令时字符串形式

    subprocess.check_call(["ls", "-l"])
    subprocess.check_call("exit 1", shell=True)
    

    2. check_call

      执行命令,如果执行状态码是0,则返回0,否则抛出异常

    subprocess.check_call(["ls", "-l"])
    subprocess.check_call("exit 1", shell=True) 

    3. check_output

      执行命令,如果状态码是0,则返回执行结果,否则抛出异常

    subprocess.check_output(["echo", "Hello World!"])
    subprocess.check_output("exit 1", shell=True)
    

    4. subprocess.Popen(...) 

      用于执行复杂的系统命令

    参数:

    • args: 可以是字符串或者序列类型(如:list, tuple)。默认的,要执行的程序应该是序列的第一个字段,如果是单个字符串,它的解析依赖于平台。在unix中,如果args是一个字符串,那么这个字符串解释成被执行程序的名字或路径,然而,这种情况只能用在不需要参数的程序。
    • bufsieze: 指定缓冲。0表示无缓冲,1表示缓冲,任何其他的整数值表示缓冲大小,负数值表示使用系统默认缓冲,通常表示完全缓冲。默认值为0即没有缓冲。
    • stdin, stdout, stderr:分别表示程序的标准输入,输出,错误句柄
    • preexec_fn : 只在unix平台有效,用于指定一个可执行对象,它将在子进程中运行之前被调用
    • close_fds : 在windows平台下,如果close_fds被设置为true,则新创建的子进程将不会继承父进程的输入,输出,错误管道。所以不能将close_fds设置为true同时重定向子进程的标准输入,输出与错误。
    • shell : 默认值为False, 声明了是否使用shell来执行程序,如果shell=True,它将args看做一个字符串,而不是一个序列。在unix系统中,且shell=True, shell默认使用/bin/sh。
    • cwd : 用于设置子进程的当前目录。当它不为None时,子程序在执行前,它的当前路径会被替换成cwd的值。这个路径并不会被添加到可执行程序的搜索路径,所以cwd不能是相对路径。
    • env : 用于指定子进程的环境变量。如果env=None,子进程的环境变量将从父进程中继承。当它不为None时,它是新进程的环境变量的映射。可以用它来代替当前进程的环境。
    • universal_newlines : 不同系统的换行符不同, 文件对象stdout和stderr都被以文本文件的方式打开
    • startupinfo 与 createionflags只在windows下生效。将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

    执行普通命令:

    import subprocess
    ret1 = subprocess.Popen(["mkdir","t1"])
    ret2 = subprocess.Popen("mkdir t2", shell=True)
    

    终端输入的命令分为两种:

    1. 输入即可得到输出,如:ifconfig
    2. 输入进行某环境,依赖在输入,如: python
    import subprocess
    
    obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
    
    import subprocess
    
    obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    obj.stdin.write("print(1)
    ")
    obj.stdin.write("print(2)")
    obj.stdin.close()
    
    cmd_out = obj.stdout.read()
    obj.stdout.close()
    cmd_error = obj.stderr.read()
    obj.stderr.close()
    
    print(cmd_out)
    print(cmd_error)
    
    import subprocess
    
    obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    obj.stdin.write("print(1)
    ")
    obj.stdin.write("print(2)")
    
    out_error_list = obj.communicate()
    print(out_error_list)
    import subprocess
    
    obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    out_error_list = obj.communicate('print("hello")')
    print(out_error_list)
    

    备注:更多详细关于subprocess点击这里

  • 相关阅读:
    Scala学习随笔——控制语句
    Scala学习随笔——深入类和对象
    Scala学习随笔——Scala起步
    HashMap,HashTable,concurrentHashMap,LinkedHashMap 区别
    vector
    LinkedList,HashSet,HashMap
    ArrayList底层实现
    jion()说明
    yiled(),wait(),sleep()方法区别
    synchronized关键字
  • 原文地址:https://www.cnblogs.com/wang-yc/p/5624880.html
Copyright © 2020-2023  润新知