如何列出Python脚本中实际使用的所有包?
检查Python脚本实际使用的第三方包
以下几种方法可以帮你精准找出脚本里实际被调用的包,剔除那些只导入但没用到的:
1. 用静态分析工具自动检测
用pylint或pyflakes
这两个工具能直接扫描脚本,标记出未使用的导入。
- 安装:
pip install pylint(或pip install pyflakes) - 运行命令:
pylint your_script.py
针对你的示例脚本,它会输出类似Unused import numpy的提示,剩下的pandas就是实际用到的包。
用autoflake直接清理未使用的导入
这个工具不仅能检测,还能自动移除未使用的导入语句,处理后剩下的导入就是必需的:
- 安装:
pip install autoflake - 运行命令:
autoflake --remove-all-unused-imports your_script.py
执行后你的示例脚本会只剩下import pandas as pd这一行导入。
2. 手动排查(适合小型脚本)
把脚本里的导入语句逐个注释掉,然后运行脚本:
- 如果脚本正常运行,说明这个包没被使用;
- 如果脚本报错(比如
NameError: name 'pd' is not defined),说明这个包是实际用到的。
像你的示例,注释掉import numpy as np后脚本能正常执行,就说明numpy没被使用。
3. 用AST模块自定义检查脚本
如果你想自己实现逻辑,可以用Python内置的ast模块解析脚本的抽象语法树,对比导入的包和实际引用的名称:
import ast import sys def get_used_packages(script_path): with open(script_path, 'r', encoding='utf-8') as f: tree = ast.parse(f.read()) # 收集所有导入的包及其别名 imported = {} for node in ast.walk(tree): if isinstance(node, ast.Import): for alias in node.names: imported[alias.name.split('.')[0]] = alias.asname or alias.name elif isinstance(node, ast.ImportFrom): if node.module: imported[node.module.split('.')[0]] = node.module # 收集所有被引用的名称 used_names = set() for node in ast.walk(tree): if isinstance(node, ast.Name): used_names.add(node.id) # 匹配实际使用的包 used_packages = set() for pkg, alias in imported.items(): if alias in used_names: used_packages.add(pkg) return used_packages if __name__ == '__main__': if len(sys.argv) != 2: print("Usage: python check_used_pkgs.py your_script.py") sys.exit(1) used = get_used_packages(sys.argv[1]) print("实际使用的包:", used)
运行这个脚本,传入你的目标脚本路径,就能得到类似实际使用的包: {'pandas'}的结果。
内容的提问来源于stack exchange,提问作者mjoy
相关产品推荐
相关产品推荐

