# coding: utf-8 import os import sys import tarfile import zipfile import re import platform def get_pkgname(tar_name): ends = ['.tar.gz', '.tar', '.gz', '.gz2', '.bz', '.bz2', '-win32.zip', '-x86.zip', '-bin.zip', '.zip','.exe'] for end in ends: if tar_name.endswith(end): return tar_name.rstrip(end) def unpack_tar(filename, destpath, path=None, get_name=False, fix_path=None): u""" 解压包,若windows,默认解压zip格式的压缩包:压缩包内不能有根目录,否则调用后要存放的文件夹下会又有一个文件夹 调用方式unzipFile(包路径, 要存放的文件夹名) :param filename: 压缩包位置,绝对路径 :param destpath: 解压目录。绝对路径 :param path: 解压后的目录名称(windows环境必须输入) :param get_name: :param fix_path: :return: """ if not os.path.exists(filename): return False if not os.path.exists(destpath): os.mkdir(destpath, 0777) if not sys.platform.startswith('win'): t = tarfile.open(filename) files = t.getnames() dir_lists = [] for i in files: if os.sep in i: dirname = i.split('/')[0] if dirname not in dir_lists: dir_lists.append(i.split('/')[0]) # 为1表明只有一个主目录 if len(dir_lists) == 1: untar_path = os.path.join(destpath, dir_lists[0]) t.extractall(path=destpath) else: untar_path = os.path.join(destpath, path) t.extractall(path=untar_path) return untar_path else: dir_name = None zfobj = zipfile.ZipFile(filename) if get_name: for obj_name in zfobj.namelist(): if obj_name.endswith('/') and obj_name.count('/') == 1: dir_name = obj_name.split('/')[0] break # destpath为C:时,不加分隔符会直接拼接 if destpath.endswith(':'): destpath = destpath + os.sep if fix_path: destpath = os.path.join(destpath, fix_path) zfobj.extractall(path=destpath) zfobj.close() if dir_name: return dir_name else: return True def install_pkgs(package, baseDir): sys_type = platform.architecture()[0] package_name = '' for package_item in package: # 若不存在已解压的包,进行解压 package_name = get_pkgname(re.split(r'\\|/', package_item)[-1]) if sys_type == '64bit' and '-x86' in package_name or \ sys_type == '32bit' and '-x64' in package_name: return False, '包类型与系统类型不符' pkg_path = os.path.join(baseDir, package_name) if not os.path.exists(pkg_path): try: package_name = unpack_tar(package_item, baseDir, get_name=True) if isinstance(package_name, bool): package_name = get_pkgname(re.split(r'\\|/', package_item)[-1]) except Exception as e: if 'Permission denied' in '{}'.format(e): return False, u'文件操作失败,请查看文件是否已存在或没有相应权限' return True, package_name def unpack_name(filename): return unpack_tar(filename, '/opt', get_name=True)