"""
# **********************************************************************************
# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
# [openeuler-jenkins] is licensed under the Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
# http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
# Author:
# Create: 2021-02-07
# Description: shell cmd
# **********************************************************************************
"""
import logging
import subprocess
logger = logging.getLogger("common")
no_fmt_logger = logging.getLogger("no_fmt")
def shell_cmd(cmd, inmsg=None):
"""
创建子进程执行命令,返回执行结果
:param cmd: 命令
:param inmsg: 输入
:return:
"""
logger.debug("exec cmd -- [%s]", cmd)
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
if inmsg:
p.stdin.write(inmsg)
out, err = p.communicate()
logger.debug("iret: %s, rs: %s, err: %s", p.returncode, out, err)
return p.returncode, out, err
def shell_cmd_live(cmd, cap_in=None, cap_out=False, cap_err=False, verbose=False, cmd_verbose=True):
"""
创建子进程执行命令,实时输出结果
:param cmd: 命令
:param cap_in: 输入
:param cap_out: 是否捕捉输出结果
:param cap_err: 是否捕捉错误结果
:param verbose: show cmd output to console, default not
:return:
"""
if cmd_verbose:
logger.debug("exec cmd -- %s", cmd)
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
if cap_in:
p.stdin.write(cap_in)
out = []
while True:
if p.poll() is not None:
break
while True:
line = p.stdout.readline()
if line:
line = line.decode("utf-8", errors="ignore")
line = line.strip()
_ = no_fmt_logger.info(line) if verbose else no_fmt_logger.debug(line)
if cap_out and line and line != "\n":
out.append(line)
else:
break
if cap_out:
logger.debug("total %s lines output", len(out))
ret = p.poll()
err = None
if ret:
logger.debug("return code %s", ret)
while True:
line = p.stderr.readline()
if not line:
break
err = line.decode("utf-8", errors="ignore").strip()
_ = no_fmt_logger.error(err) if verbose else no_fmt_logger.debug(err)
return ret, out, err if cap_err else None
def shell_cmd_unicode(cmd):
if isinstance(cmd, str):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
else:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out, err = p.communicate()
logger.debug("iret: %s, rs: %s, err: %s", p.returncode, out, err)
if not isinstance(out, str):
out = str(out, errors='ignore')
return p.returncode, out