Python脚本实现扫描指定目录下.py文件并提取import语句

 更新时间:2026年03月12日 08:31:54   作者:weixin_30777913  
这篇文章主要为大家详细介绍了如何使用Python脚本实现扫描指定目录下.py文件并提取import语句,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

Python脚本用于扫描指定目录下所有的.py文件,提取其中所有的import语句中的模块名(包括相对导入),去重后按时间戳命名输出到文本文件。

完整代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
扫描目录下所有 Python 文件,提取所有 import 语句中的模块名,
去重后保存到以时间戳命名的文本文件中。
"""

import os
import sys
import ast
import argparse
from datetime import datetime


def extract_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 等)
    """
    modules = set()
    try:
        with open(filepath, 'r', encoding='utf-8') as f:
            content = f.read()
        tree = ast.parse(content, filename=filepath)

        for node in ast.walk(tree):
            if isinstance(node, ast.Import):
                # import module, import module as alias
                for alias in node.names:
                    modules.add(alias.name)  # 完整模块名
            elif isinstance(node, ast.ImportFrom):
                # from module import ...
                if node.module:
                    # 绝对导入或相对导入但指定了模块(如 from .sub import x)
                    if node.level > 0:
                        # 相对导入,模块名前加对应数量的点
                        module = '.' * node.level + node.module
                    else:
                        module = node.module
                else:
                    # 纯相对导入(如 from . import x, from .. import y)
                    module = '.' * node.level
                modules.add(module)
    except Exception as e:
        print(f"警告:解析文件 {filepath} 时出错:{e}", file=sys.stderr)

    return modules


def main():
    parser = argparse.ArgumentParser(
        description='扫描目录下的 Python 文件,提取所有 import 模块名并去重输出。'
    )
    parser.add_argument(
        'directory',
        nargs='?',
        default='.',
        help='要扫描的目录(默认:当前目录)'
    )
    args = parser.parse_args()

    target_dir = args.directory
    if not os.path.isdir(target_dir):
        print(f"错误:'{target_dir}' 不是一个有效的目录。", file=sys.stderr)
        sys.exit(1)

    all_modules = set()

    # 递归遍历目录
    for root, dirs, files in os.walk(target_dir):
        for file in files:
            if file.endswith('.py'):
                filepath = os.path.join(root, file)
                modules = extract_imports_from_file(filepath)
                all_modules.update(modules)

    if not all_modules:
        print("未找到任何 import 语句。")
        return

    # 排序后输出
    sorted_modules = sorted(all_modules)

    # 生成时间戳文件名
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    output_filename = f"imports_{timestamp}.txt"

    with open(output_filename, 'w', encoding='utf-8') as f:
        for module in sorted_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 后面的模块名(包括点号分隔的子模块)。
  • 去重后按字母顺序排序,输出到以时间戳命名的文本文件。

到此这篇关于Python脚本实现扫描指定目录下.py文件并提取import语句的文章就介绍到这了,更多相关Python扫描py文件并提取import语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python socket编程实例详解

    Python socket编程实例详解

    这篇文章主要介绍了Python socket编程,以实例形式较为详细的分析了Python中socket模块的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • Python OpenCV实战之与机器学习的碰撞

    Python OpenCV实战之与机器学习的碰撞

    机器学习是人工智能的子集,为计算机以及其它具有计算能力的系统提供自动预测或决策的能力。本文主要介绍了OpenCV 提供的常见机器学习算法和技术,用于解决计算机视觉项目中的实际问题,需要的朋友可以参考一下
    2021-12-12
  • 对Pandas MultiIndex(多重索引)详解

    对Pandas MultiIndex(多重索引)详解

    今天小编就为大家分享一篇对Pandas MultiIndex(多重索引)详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 解决Jupyter无法导入已安装的 module问题

    解决Jupyter无法导入已安装的 module问题

    这篇文章主要介绍了解决Jupyter无法导入已安装的 module问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python range函数生成一系列连续整数的内部机制解析

    Python range函数生成一系列连续整数的内部机制解析

    这篇文章主要为大家介绍了Python range函数生成一系列连续整数的内部机制解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Python基础学习之函数和代码复用详解

    Python基础学习之函数和代码复用详解

    函数能提高应用的模块性,和代码的重复利用率,下面这篇文章主要给大家介绍了关于Python基础学习之函数和代码复用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • python中dict获取关键字与值的实现

    python中dict获取关键字与值的实现

    这篇文章主要介绍了python中dict获取关键字与值的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Python如何截图保存的三种方法(小结)

    Python如何截图保存的三种方法(小结)

    这篇文章主要介绍了Python如何截图保存的三种方法(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 使用pytorch读取数据集

    使用pytorch读取数据集

    这篇文章主要介绍了使用pytorch读取数据集,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Pyhton多线程采集图片方式

    Pyhton多线程采集图片方式

    这篇文章主要介绍了Pyhton多线程采集图片方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论