[Python神器] AI生成的代码跑不起来?ImportError?用这个工具一键反向推导 pip 包名!

44 阅读3分钟

[Python神器] AI生成的代码跑不起来?ImportError?用这个工具一键反向推导 pip 包名!

背景:AI 时代的“依赖地狱”

在 Cursor、GitHub Copilot 和 ChatGPT 普及的今天,我们的开发模式变了。以前是我们先 pip install 再写代码,现在是 AI 直接甩给我们一段完美的代码:

import cv2
from PIL import Image
import sklearn
from google.cloud import storage
import ujson

代码逻辑看起来没问题,但当你试图运行它时:

ModuleNotFoundError: No module named 'cv2'

ModuleNotFoundError: No module named 'sklearn'

你开始疯狂 Google:

  • cv2 是装 opencv-python 还是 opencv-python-headless
  • PIL 是装 Pillow 吗?
  • sklearn 对应的包名是啥来着?scikit-learn
  • google.cloud.storage 是装 google 还是 google-cloud 还是 google-cloud-storage

如果项目里有几十个文件,几百个 import,手动查找简直是噩梦。传统的 pip freeze 需要环境里已经装好了包,而 pipreqs 等工具在处理复杂映射(如 cv2, PIL)时往往不够准确。

为了解决这个问题,我开发了 pyimport2pkg

什么是 PyImport2Pkg?

GitHub 地址buptanswer/pyimport2pkg

PyPI 地址pip install pyimport2pkg

PyImport2Pkg 是一个 Python 导入语句到 pip 包名的反向映射工具。它不靠猜,而是基于 PyPI 大数据构建的映射数据库,专门解决“知道模块名但不知道包名”的问题。

它的核心能力:

  1. 准确识别异名包:完美处理 cv2opencv-pythonPILPillow 等经典难题。
  2. 命名空间支持:精准区分 google.cloud.storagegoogle.ads,不会笼统地让你装 google
  3. 智能分析:递归扫描项目,区分必需依赖可选依赖(能识别 try-except 块)。
  4. 速度飞快:基于本地优化的 SQLite 数据库,毫秒级查询。

快速上手

1. 安装

需要 Python 3.10+:

pip install pyimport2pkg

2. 一键生成 requirements.txt

在你的项目根目录下运行:

pyimport2pkg analyze . -o requirements.txt

它会自动扫描所有 .py 文件,解析 import,匹配最佳的 pip 包,并生成文件。

3. 单独查询某个令人困惑的包

比如你想知道 cv2 到底该装啥:

pyimport2pkg query cv2

输出:

Module: cv2
Source: hardcoded
Candidates:
  1. opencv-python (recommended)
  2. opencv-contrib-python
  3. opencv-python-headless

技术硬核:为什么它比 pipreqs 好用?

在开发 pyimport2pkg 之前,我深入研究了 Python 的导入机制(详见我的 GitHub 项目文档)。

很多工具只是简单的字符串匹配,而 pyimport2pkg 解决了以下 14 种极端情况:

  • 命名空间包 (Namespace Packages) :如 zope.*, azure.* 的精确解析。
  • 版本感知:自动检测你的 Python 版本(例如 enum34 在 Py3.4+ 不需要安装)。
  • 别名注入:处理像 win32api 这种物理文件在 win32 目录下但 import 名字完全不同的情况。
  • 幽灵依赖:分析代码逻辑中的条件导入。

性能实测

项目规模分析时间
小型 (<100 文件)< 1 秒
大型 (1000+ 文件)5-30 秒

总结

在 AI 辅助编程的时代,不要把时间浪费在“找包名”这种重复劳动上。pyimport2pkg 就是你 IDE 里的最佳僚机。

目前项目已经发布 v1.0.0 稳定版,欢迎大家 Star ⭐ 和试用!

传送门github.com/buptanswer/…