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