如何生成仅包含脚本实际依赖模块的requirements.txt文件?
生成仅包含实际所需模块的requirements.txt方法
不用再手动删pip freeze的冗余依赖了,推荐几种靠谱的方法:
1. 用pipreqs自动扫描代码
这是最常用的工具,专门扫描项目里实际导入的模块:
- 先安装:
pip install pipreqs - 到项目根目录执行:
pipreqs . - 直接生成的requirements.txt只包含代码里用到的第三方模块,自动过滤掉没用到的包
- 注意:如果代码里有动态导入(比如用
importlib.import_module),可能需要手动补全漏掉的模块
2. 用pigar生成带版本建议的依赖
功能比pipreqs更全面,能识别更多导入场景,还会给出版本适配建议:
- 安装:
pip install pigar - 项目根目录执行:
pigar - 生成的文件不仅有依赖,还会标注推荐的版本,甚至能检测出过时的依赖包
3. 用干净虚拟环境生成
不想装工具的话,用虚拟环境确保依赖绝对纯净:
- 创建新虚拟环境:
python -m venv myenv - 激活环境:Windows用
myenv\Scripts\activate,Linux/macOS用source myenv/bin/activate - 一步步安装让脚本正常运行的所有模块
- 执行
pip freeze > requirements.txt,出来的就是完全必要的依赖
4. 自己写简单脚本扫描(Python 3.8+)
如果不想装第三方包,写个小脚本搞定:
import os import ast import sys def get_required_modules(project_path): imports = set() # 遍历所有py文件 for root, _, files in os.walk(project_path): for file in files: if file.endswith(".py"): file_path = os.path.join(root, file) try: with open(file_path, "r", encoding="utf-8") as f: tree = ast.parse(f.read()) # 提取所有导入的模块 for node in ast.walk(tree): if isinstance(node, ast.Import): for alias in node.names: imports.add(alias.name.split(".")[0]) elif isinstance(node, ast.ImportFrom): if node.module: imports.add(node.module.split(".")[0]) except SyntaxError: continue # 过滤标准库模块 std_modules = set(sys.stdlib_module_names) return imports - std_modules if __name__ == "__main__": required = get_required_modules(".") with open("requirements.txt", "w") as f: f.write("\n".join(required))
把这个脚本放在项目根目录运行,会自动扫描所有py文件,提取第三方模块,排除标准库后写入requirements.txt。缺点是处理动态导入这类复杂场景可能不准,适合简单项目。
内容的提问来源于stack exchange,提问作者mason-lancaster
相关产品推荐
相关产品推荐

