同级目录测试pip安装本地包:pip freeze异常及导入失败排查
本地Python包构建与导入异常分析及修复
问题背景
目录结构:
├── src │ ├── modules │ │ ├── module1 │ │ │ ├── __init__.py │ │ │ └── somecode.py │ │ └── module2 │ └── setup.py └── tests └── test1.py
setup.py代码:
setuptools.setup( name="src_code", version=0.26, description="solves relative imports", author="yer boi", url="", package_data={"": ["LICENSE"]}, package_dir={"": "modules"}, packages=setuptools.find_packages(where="modules"), python_requires=">=3.8", py_modules=[ ], )
已激活.venv虚拟环境,在根目录执行pip install -e src安装可编辑包后,出现两个问题:
pip freeze输出异常的Git远程路径,而非本地包路径:
black==22.10.0 -e git+https://github.com/xxx/xxx.git@5da71eb9ecb1cb08c930edd1d052fa209375f38d#egg=src_code&subdirectory=lambdas
- 无法导入本地构建的包,
src_code.egg-info/top_level.txt内容为:
module1 module2
异常原因
- Git仓库自动关联:pip在安装可编辑包时,若当前项目处于Git仓库内,会自动将本地路径替换为Git远程仓库URL,导致
pip freeze显示远程地址而非本地包路径。 - 包结构配置错误:
setup.py中package_dir={"": "modules"}和find_packages(where="modules")的配置,让module1、module2成为顶层模块,而非归属src_code包下。这意味着你不能用import src_code.module1导入,只能直接import module1,但如果测试代码是按包名src_code导入的,就会失败。同时setup.py放在src目录下,路径解析逻辑也会出现偏差。
修复方案
1. 解决pip freeze显示Git路径问题
安装可编辑包时,添加参数禁用pip的Git自动检测:
pip install -e src --no-use-pep517
或者临时设置环境变量隔离构建:
export PIP_NO_BUILD_ISOLATION=1 pip install -e src
如果只是查看本地包,执行pip freeze时加上--local参数:
pip freeze --local
2. 修正包结构与setup.py配置(解决导入问题)
推荐使用标准的src布局,调整目录结构并修改setup.py:
调整后目录结构
├── src │ └── src_code │ ├── __init__.py │ ├── module1 │ │ ├── __init__.py │ │ └── somecode.py │ └── module2 ├── setup.py └── tests └── test1.py
修改后的setup.py
setuptools.setup( name="src_code", version=0.26, description="solves relative imports", author="yer boi", url="", package_data={"": ["LICENSE"]}, package_dir={"": "src"}, packages=setuptools.find_packages(where="src"), python_requires=">=3.8", )
重新安装包
在项目根目录执行:
pip install -e .
此时pip freeze会显示本地文件路径,src_code.egg-info/top_level.txt内容会变为src_code,你可以在测试代码中用import src_code.module1正常导入。
3. 验证导入
在tests/test1.py中添加测试代码:
import src_code.module1 print("模块导入成功")
激活虚拟环境后运行:
python tests/test1.py
若控制台输出“模块导入成功”,说明修复完成。
内容的提问来源于stack exchange,提问作者tomvonheill
相关产品推荐
相关产品推荐

