mini_toolbox.pip_list 源代码

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
""" 
Note:
    提供命令行工具 ``pip_list``, 用于格式化显示pip库安装日期, 使用 ``-h`` 查看命令行帮助
"""

__all__ = ['gen_pip_list']

import warnings

warnings.filterwarnings(action='ignore', message='pkg_resources is deprecated as an API')

import os
import sys
import time
import argparse
import pkg_resources
from typing import List, Tuple


[文档]def gen_pip_list() -> Tuple[List[str], List[int]]: """ 用于查找并返回pip库信息, 包含: 库名/版本/安装时间 Returns: Tuple[List[str], List[int]]: data(List[str])为所有pip库的信息, 结构为\ ``[库名, 版本, 安装时间]``, size(List[int])为各字段所有值的最大长度, 用于后续格式化输出 """ data = [['Package', 'Version', 'InstallTime']] size = [len(x) for x in data[0]] time_format = '%Y-%m-%d %H:%M:%S' for package in pkg_resources.working_set: pkg_dir, pkg_name, pkg_ver = package.location, package.key, package.version # 计算时间 pkg_path = os.path.join(pkg_dir, package.egg_name().split(pkg_ver)[0] + pkg_ver) if os.path.exists(pkg_path + '.egg-info'): pkg_path = pkg_path + '.egg-info' elif os.path.exists(pkg_path + '.dist-info'): pkg_path = pkg_path + '.dist-info' else: pkg_path = pkg_dir pkg_ctime = time.strftime(time_format, time.localtime(os.path.getctime(pkg_path))) # 插入数据 tmp_data = [pkg_name, pkg_ver, pkg_ctime] # 与header对应 for num in range(len(tmp_data)): if size[num] < len(tmp_data[num]): size[num] = len(tmp_data[num]) data.append(tmp_data) # 插入行首与数据之间的分隔符 data.insert(1, list(map(lambda x: '-' * x, size))) return data, size
def main(): """ 用于命令行直接调用输出, 格式化显示pip库安装日期, 使用 ``-h`` 查看命令行帮助 """ parser = argparse.ArgumentParser(description='pip库格式化显示') parser.add_argument('-n', help='按名称排序', action='store_true') parser.add_argument('-t', help='按安装时间排序', action='store_true') args = parser.parse_args() data, size = gen_pip_list() # 数据排序 if args.n: pkgs_data = sorted(data[2:], key=lambda x: x[0]) elif args.t: pkgs_data = sorted(data[2:], key=lambda x: x[2]) else: pkgs_data = data[2:] # 格式化打印 for item in data[:2] + pkgs_data: print("%-*s %-*s %-*s" % (size[0], item[0], size[1], item[1], size[2], item[2]), flush=True) sys.exit(0) if __name__ == '__main__': main()