如何在Python及Colab中无需手动配置别名映射即可打印用户导入模块的名称与版本
自动获取Colab中导入模块的名称与版本(无需手动维护别名映射)
问题背景
你现在在Colab里想要打印已导入模块的名称和版本,但之前的方案需要手动维护一个别名映射字典(比如ref_dict = {'pd': 'pandas', 'np': 'numpy'}),这种方式不仅繁琐,还容易遗漏或出错。有没有更智能的方法来实现这个需求?
优化解决方案
其实我们可以直接通过模块对象的内置属性来自动识别原模块名称,完全不需要手动维护映射表。下面分享两种实用的实现方式:
方式一:遍历全局变量识别模块对象
这种方法会自动扫描全局变量中的所有模块对象,不管你是用原名还是别名导入的,都能准确获取原模块名和版本:
import sys import types # 存储用户导入的模块信息:原模块名 -> 别名、版本 user_modules = {} # 遍历全局变量,筛选出用户导入的模块 for alias, obj in globals().items(): # 排除系统内置的特殊模块和非模块对象 if (isinstance(obj, types.ModuleType) and not alias.startswith('__') and obj.__name__ not in sys.builtin_module_names): mod_name = obj.__name__ # 尝试获取版本,失败则标记为不可用 try: version = obj.__version__ except AttributeError: version = "Not available" user_modules[mod_name] = {"alias": alias, "version": version} # 格式化输出结果 print('--module name & versions imported by user--\n') for mod_name, details in sorted(user_modules.items()): print(f"{mod_name} (imported as {details['alias']}): {details['version']}") # 可选:输出系统内置模块的版本信息 print('\n-----') system_mods = [] for name, obj in globals().items(): if isinstance(obj, types.ModuleType) and (name.startswith('__') or obj.__name__ in sys.builtin_module_names): try: ver = obj.__version__ except AttributeError: ver = "Not available" system_mods.append(f"{name}: {ver}") print('\n'.join(system_mods))
方式二:用pkg_resources获取更精准的包版本
如果你需要更准确的包版本(比如某些模块属于某个大的包,直接取模块__version__可能不够准确),可以用pkg_resources(Colab环境默认已安装):
import sys import types import pkg_resources user_imported = {} for alias, obj in globals().items(): if (isinstance(obj, types.ModuleType) and not alias.startswith('__') and obj.__name__ not in sys.builtin_module_names): mod_name = obj.__name__ # 优先从包资源获取版本,失败则 fallback 到模块自身的__version__ try: version = pkg_resources.get_distribution(mod_name).version except (pkg_resources.DistributionNotFound, AttributeError): version = obj.__version__ if hasattr(obj, '__version__') else "Not available" user_imported[mod_name] = {"alias": alias, "version": version} # 输出整理后的结果 print('--module name & versions imported by user--\n') for mod, info in sorted(user_imported.items()): print(f"{mod} (imported as {info['alias']}): {info['version']}")
方案优势
- 完全自动化:不需要手动维护别名映射,不管是
import pandas还是import pandas as pd都能自动识别 - 精准筛选:区分用户导入的模块和系统内置模块,避免输出无关内容
- 容错性强:多种方式尝试获取版本信息,减少"Not available"的情况
内容的提问来源于stack exchange,提问作者이준혁
相关产品推荐
相关产品推荐

