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

    subprocess模块、

    一、python执行命令方法

    1、os.system()

    os.system()的返回值是脚本的退出状态码,0表示成功; 其他均为失败

    执行命令出错,并不会影响主进程执行

    res = os.system('ls')
    print(res)  # 0
    
    res = os.system('dddd')
    print(res)  # 32512
    
    print(os.system('ls'))
    print(os.system('ddd'))
    print(111)
    
    0
    32512
    111
    

    2、subprocess模块

    1)subprocess包提供了三个开启子进程的方法:

    • subprocess.call()
    • subprocess.check_call()
    • subprocess.check_output()

    2)三种方法区别在于返回结果不同:

    • call() 返回子进程的执行返回码
    • check_call() 返回子进程的执行返回码的处理结果,返回码是0则返回0,否则出错的话会raise CalledProcessError
    • check_output() 返回码是0则返回子进程向stdout输出的结果,否则也raise CalledProcessError

    3)传递命令字符串作为参数,可以用以下两种形式

    • 列表形式:['ping','www.baidu.com','-c','3']
    • 字符串形式:"ping www.baidu.com -c 3"

    4)在开启子进程的时候,可以加上shell=True的参数来让python开启一个shell,通过shell来解释获得的命令。

    • 一般在windows下运行的程序最好都把shell=True加上,这样才能顺利地执行dos命令
    • linux下似乎不加也没啥关系。因为linux下未指明用shell执行的话会调用/bin/sh来执行,但是dos下系统不会默认用cmd.exe来执行命令,所以要加上shell=True。

    5)这三个方法都是对subprocess.Popen方法的一个包装,让父进程挂起等待的,在子进程结束之前,父进程不会继续往下运行

    6)subprocess.Popen()方法不会让父进程等待其完成的, 如要父进程等待子进程,必须调用wait()方法

    二、subprocess.Popen()方法

    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: 字符串或列表
          stdin, stdout and stderr: None->继承父进程;PIPE->创建管道; 等等
    
          preexec_fn: (POSIX only) 在创建(fork)和执行(exec)之间执行
    
          shell: unix相当于在args前面添加"/bin/bash -c";widows下相当于添加"cmd.exe /c"
    
          cwd: 设置shell执行的工作目录
    
          env: 设置环境变量
    
        Attributes:
            stdin, stdout, stderr, pid, returncode
        """
    

    三、在一个shell中执行多条命令

    方式一:

    创建一个shell,通过stdin.write()来不断执行命令

    之一每个命令多要用utf-8编码, 结尾表示模拟回车执行命令

    p = subprocess.Popen("/bin/bash", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    p.stdin.write('chmod +x /data/start.sh
    '.encode('utf-8'))
    p.stdin.write('cd /data
    '.encode('utf-8'))
    p.stdin.write('./start.sh
    '.encode('utf-8'))
    p.stdin.close()
    p.wait()
    

    方式二:

    将多条命令整合到一条中,然后执行

    p = subprocess.Popen('chmod +x /data/start.sh && cd /data && ./start.sh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    p.wait()
    
    博客内容仅供参考,部分参考他人优秀博文,仅供学习使用
  • 相关阅读:
    试着把.net的GC讲清楚(2)
    试着把.net的GC讲清楚(1)
    【特性】select语句中使用字符串链接获取字段值失败
    twemproxy分片处理原理--剖析twemproxy代码正编
    robot framework的使用说明
    网络故障模拟,cpu高压以及docker中的实现
    我眼中的robot framework
    twemproxyMemcache协议解析探索——剖析twemproxy代码正编补充
    twemproxy代理主干流程——剖析twemproxy代码正编
    Leetcode 617 Merge Two Binary Trees 二叉树
  • 原文地址:https://www.cnblogs.com/linagcheng/p/14379208.html
Copyright © 2011-2022 走看看