Python扫描目录提取import语句

📅 发布时间:2026/7/5 16:57:12 👁️ 浏览次数:
Python扫描目录提取import语句
Python脚本用于扫描指定目录下所有的.py文件提取其中所有的import语句中的模块名包括相对导入去重后按时间戳命名输出到文本文件。#!/usr/bin/env python3# -*- coding: utf-8 -*- 扫描目录下所有 Python 文件提取所有 import 语句中的模块名 去重后保存到以时间戳命名的文本文件中。 importosimportsysimportastimportargparsefromdatetimeimportdatetimedefextract_imports_from_file(filepath): 解析单个 Python 文件返回该文件中导入的所有模块名集合。 支持 - import module - import module as alias - from module import name - from module import name as alias - 相对导入from . import x, from ..sub import y 等 modulesset()try:withopen(filepath,r,encodingutf-8)asf:contentf.read()treeast.parse(content,filenamefilepath)fornodeinast.walk(tree):ifisinstance(node,ast.Import):# import module, import module as aliasforaliasinnode.names:modules.add(alias.name)# 完整模块名elifisinstance(node,ast.ImportFrom):# from module import ...ifnode.module:# 绝对导入或相对导入但指定了模块如 from .sub import xifnode.level0:# 相对导入模块名前加对应数量的点module.*node.levelnode.moduleelse:modulenode.moduleelse:# 纯相对导入如 from . import x, from .. import ymodule.*node.level modules.add(module)exceptExceptionase:print(f警告解析文件{filepath}时出错{e},filesys.stderr)returnmodulesdefmain():parserargparse.ArgumentParser(description扫描目录下的 Python 文件提取所有 import 模块名并去重输出。)parser.add_argument(directory,nargs?,default.,help要扫描的目录默认当前目录)argsparser.parse_args()target_dirargs.directoryifnotos.path.isdir(target_dir):print(f错误{target_dir} 不是一个有效的目录。,filesys.stderr)sys.exit(1)all_modulesset()# 递归遍历目录forroot,dirs,filesinos.walk(target_dir):forfileinfiles:iffile.endswith(.py):filepathos.path.join(root,file)modulesextract_imports_from_file(filepath)all_modules.update(modules)ifnotall_modules:print(未找到任何 import 语句。)return# 排序后输出sorted_modulessorted(all_modules)# 生成时间戳文件名timestampdatetime.now().strftime(%Y%m%d_%H%M%S)output_filenamefimports_{timestamp}.txtwithopen(output_filename,w,encodingutf-8)asf:formoduleinsorted_modules:f.write(module\n)print(f共找到{len(sorted_modules)}个唯一模块。)print(f结果已写入{output_filename})if__name____main__:main()使用方法将上述代码保存为.py文件例如scan_imports.py。在终端中运行python scan_imports.py[要扫描的目录]如果不指定目录则默认扫描当前目录。脚本会在当前目录下生成一个类似imports_20250311_143022.txt的文件每行列出一个模块名已去重。功能说明递归扫描指定目录下所有.py文件。使用 Python 的ast模块解析代码准确提取各种形式的import语句包括别名和相对导入。对于from ... import ...记录from后面的模块名相对导入会保留前导点号。对于import ...记录import后面的模块名包括点号分隔的子模块。去重后按字母顺序排序输出到以时间戳命名的文本文件。