如何获取src目录下各Python脚本中导入的唯一模块列表
获取Python项目中所有导入的唯一模块列表
项目情况
我的项目代码都在src文件夹下,结构大致如下:
├── src <- 项目源码目录 │ │ │ ├── data <- 数据下载/生成脚本 │ │ │ ├── features <- 原始数据转特征脚本 │ │ │ ├── models <- 模型训练与预测脚本
以data文件夹为例,里面有多个.py脚本:
├── data │ ├── create_dataframe.py ├── imputation.py ...
需求
我要提取所有.py脚本里导入的唯一第三方模块名称,不用管版本。比如:
create_dataframe.py代码:import pandas as pdimputation.py代码:import pandas as pd import numpy as np from tqdm import tqdm
期望得到这样的输出:
Output: ['pandas', 'numpy', 'tqdm']
实现方法
方法一:自己写Python脚本解析
可以写一个递归遍历文件、匹配导入语句的脚本,直接拿到结果:
import os import re def get_file_imports(file_path): modules = set() # 匹配两种导入格式的正则 import_re = re.compile(r'^\s*import\s+(\w+)\s*(?:as\s+\w+)?', re.MULTILINE) from_import_re = re.compile(r'^\s*from\s+(\w+)\s+import', re.MULTILINE) with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: content = f.read() # 提取import xxx的模块 modules.update(import_re.findall(content)) # 提取from xxx import的模块 modules.update(from_import_re.findall(content)) return modules def collect_all_modules(root_dir): all_modules = set() # 递归遍历所有.py文件 for dirpath, _, filenames in os.walk(root_dir): for file in filenames: if file.endswith('.py'): file_path = os.path.join(dirpath, file) all_modules.update(get_file_imports(file_path)) # 转成排序后的列表返回 return sorted(list(all_modules)) if __name__ == '__main__': target_dir = './src' result = collect_all_modules(target_dir) print(f"Output: {result}")
注意点
- 脚本会自动跳过编码异常的文件,避免中断
- 只提取顶级模块名(比如
from sklearn.ensemble import RandomForest只会提取sklearn) - 集合自动去重,最后输出排序后的列表
方法二:用第三方工具pipreqs快速生成
如果不想自己写代码,用pipreqs工具更省心:
- 先安装工具:
pip install pipreqs
- 在项目根目录执行命令(指定
src目录,忽略版本号):
pipreqs ./src --encoding=utf-8 --no-version
执行后会在src目录下生成requirements.txt,内容就是去重后的模块名:
pandas numpy tqdm
优势
- 能处理更复杂的导入场景(比如嵌套模块、相对导入自动过滤)
- 不需要自己写正则匹配,工具已经做好了逻辑处理
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

