导航

 
# 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)

  

posted on 2019-05-30 10:16  slqt  阅读(532)  评论(0编辑  收藏  举报