zoukankan      html  css  js  c++  java
  • 压缩和解压安装包

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

      

  • 相关阅读:
    Jenkins, How to Start, Stop or Restart your Instance
    Windows Batch: Remove file extension
    download web folder using wget
    Mac OS 下 控制台的代理设定
    Elasticsearch 配置IP白名单
    Elasticsearch 开启安全认证
    Redis安装手册
    laravel 使用自带的用户注册登录功能并修改登录方式
    go 安装环境
    laraveladmin 使用
  • 原文地址:https://www.cnblogs.com/slqt/p/10948036.html
Copyright © 2011-2022 走看看