如果想在系统上执行命令, 应该用subprocess模块

subprocess模块允许你产生新的子进程,连接到input/output/error管道,并且获得它们的返回码(值).  这个模块用来替换下面旧的模块和函数

  • os.system(),
  • os.spawn*(),
  • os.popen*()
  • popen2.*()
  • commands.*()

使用subprocess模块,主要会用到它的Popen类

1、命令以序列的方式执行.

>>> proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> stdout, stderr = proc.communicate()         # 获取标准输入和标准输出

2、命令以字符串的方式执行

>>> proc = subprocess.Popen('ls -l', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>> stdout, stderr = proc.communicate()        # 获取标准输出和标准错误
  • 命令可以用字符串序列,如果是序列,shell参数应该为Flase (默认), 如果是字符串,shell参数为True,如果shell=True它会在linux shell里面执行,官方文档推荐命令以序列的方式执行,因为用字符串可能会有歧义。
  • communicate 方法可以从process中获取到标准输出和错误

练习:

def sh(cmdline):
    """
    : 执行shell命令返回结果, 等同于subprocess.getoutput(cmdline)
    : params: cmdline 命令
    : return : str
    """
    process = subprocess.Popen(cmdline, stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE, shell=True)
    process.wait()
    stdout, stderr = process.communicate()

    if stdout:
        return str(stdout.strip(), encoding='utf-8')
    if stderr:
        return str(stderr.strip(), encoding='utf-8')
sh

相关文章:

  • 2021-07-28
  • 2021-05-23
  • 2021-05-29
  • 2021-12-28
  • 2021-11-20