zoukankan      html  css  js  c++  java
  • subprocess模块笔记

    subprocess笔记

    import subprocess
    
    subprocess.call("netstat -ano")
    #父进程等待子进程完成任务,返回执行结果和结束信息0或非0
    
    subprocess.check_call('netstat -ano1')
    #父进程等待子进程完成任务,如果returncode返回不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性
    
    subprocess.check_output(["netstat", "-ano"],shell=True)#调用cmd命令
    #执行命令,返回执行的结果,而不是打印
    
    subprocess.check_output(['type','queue实例.py'],shell=True)
    #python通过命令打开py文件获取内容
    
    subprocess.run(["netstat", "-ano"],shell=True)
    #shell 需要交给linux shell自己去解析 subprocess.getoutput('id')#接受字符串形式的命令,放回执行结果 #'id' 不是内部或外部命令,也不是可运行的程序 subprocess.getstatusoutput('pwd')#接收字符串格式命令,返回一个元祖形式结果,第一个元素为执行状态,第二个为执行结果 #(1, "'pwd' 不是内部或外部命令,也不是可运行的程序 或批处理文件。")
    以上subprocess使用的方法,都是对subprocess.Popen的封装,我们就来看看这个Popen
    def __init__(self, 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命令,可以是字符串,也可以是命令各个参数组成的序列。当该参数的值是一个字符串时,该命令的解释过程是与平台相关的,因此通常建议将args参数作为一个序列传递。
    bufsize: 指定缓存策略,0表示不缓冲,1表示行缓冲,其他大于1的数字表示缓冲区大小,负数 表示使用系统默认缓冲策略。
    stdin, stdout, stderr: 分别表示程序标准输入、输出、错误句柄。
    preexec_fn: 用于指定一个将在子进程运行之前被调用的可执行对象,只在Unix平台下有效。
    close_fds: 如果该参数的值为True,则除了0,1和2之外的所有文件描述符都将会在子进程执行之前被关闭。
    shell: 该参数用于标识是否使用shell作为要执行的程序,如果shell值为True,则建议将args参数作为一个字符串传递而不要作为一个序列传递。
    cwd: 如果该参数值不是None,则该函数将会在执行这个子进程之前改变当前工作目录。
    env: 用于指定子进程的环境变量,如果env=None,那么子进程的环境变量将从父进程中继承。如果env!=None,它的值必须是一个映射对象。
    universal_newlines: 如果该参数值为True,则该文件对象的stdin,stdout和stderr将会作为文本流被打开,否则他们将会被作为二进制流被打开。
    startupinfo和creationflags: 这两个参数只在Windows下有效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如主窗口的外观,进程优先级等。

    Popon之api:
      Popen.poll()   用于检查子进程(命令)是否已经执行结束,没结束返回None,结束后返回状态码。
      Popen.wait(timeout=None) 等待子进程结束,并返回状态码;如果在timeout指定的秒数之后进程还没有结束,将会抛出一个TimeoutExpired异常。
      Popen.communicate(input=None, timeout=None) 该方法可用来与进程进行交互,比如发送数据到stdin,从stdout和stderr读取数据,直到到达文件末尾。
      Popen.send_signal(signal) 发送指定的信号给这个子进程。
      Popen.terminate() 停止该子进程。
      Popen.kill() 杀死该子进程。
      Popen.pid()  获取进程号

      关于communicate()方法的说明:

    • 该方法中的可选参数 input 应该是将被发送给子进程的数据,或者如没有数据发送给子进程,该参数应该是None。input参数的数据类型必须是字节串,如果universal_newlines参数值为True,则input参数的数据类型必须是字符串。
    • 该方法返回一个元组(stdout_data, stderr_data),这些数据将会是字节穿或字符串(如果universal_newlines的值为True)。
    • 如果在timeout指定的秒数后该进程还没有结束,将会抛出一个TimeoutExpired异常。捕获这个异常,然后重新尝试通信不会丢失任何输出的数据。但是超时之后子进程并没有被杀死,为了合理的清除相应的内容,一个好的应用应该手动杀死这个子进程来结束通信。
    • 需要注意的是,这里读取的数据是缓冲在内存中的,所以,如果数据大小非常大或者是无限的,就不应该使用这个方法

    Popon实例

    cmd='adb devices'
    subprocess.Popen(cmd, stdout=open(log, 'a+'), stderr=open(errorLog,'a+'), shell=True)#返回的结果放入log变量中,返回系统错误的结果放入errorlog变量中

    参考  http://www.cnblogs.com/clarenceyang/p/9811785.html

    版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    drf项目部署到腾讯云
    ruby的DIR.pwd
    ruby+selenium-webdriver测试
    ruby
    ruby类对象和对象
    ruby的实例变量
    ruby在类中访问@,类外访问调用方法
    ruby中=>是什么意思
    ruby
    css content属性
  • 原文地址:https://www.cnblogs.com/RainBol/p/10245671.html
Copyright © 2011-2022 走看看