os库中的os.system()只能获取命令是否运行成功,不能获取命令的屏幕输出以及报错信息。
os.popen()可以获取命令的屏幕输出,但是无法区分成功或者失败信息。
使用 subprocess库可以实现:
import os
import re
import subprocess
def subprocess_popen(command, work_dir = None, se_PIPE = True, so_PIPE = True):
# 执行系统命令
# command: str, 要执行的命令
# work_dir: str, 在哪个目录下执行改目录,None表示在当前工作目录执行
# se_PIPE: bool, 是否捕获标准错误输出作为函数返回值,否则输出到屏幕
# so_PIPE: bool, 是否捕获标准输出作为函数返回值,否则输出到屏幕
# 返回值为一个元组:(list: 标准输出,list: 标准错误输出, int: 命令状态码)
code = 'gbk' if os.name == 'nt' else 'utf-8'
so = subprocess.PIPE if so_PIPE else None # 指定标准输出到哪
se = subprocess.PIPE if se_PIPE else None # 指定标准错误输出到哪
p = subprocess.Popen(command, shell=True, stdout=so, stderr=se, cwd=work_dir)
data, error = p.communicate() # communicate()等待子进程结束,从stdout和stderr读数据返回元组
data, error = ('' if i is None else i.decode(code) for i in (data, error))
result = re.split(r'[\r\n]+', data.strip('\r\n'))
error_info = re.split(r'[\r\n]+', error.strip('\r\n'))
return result, error_info, p.returncode