You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同级目录测试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安装可编辑包后,出现两个问题:

  1. pip freeze输出异常的Git远程路径,而非本地包路径:
black==22.10.0
-e git+https://github.com/xxx/xxx.git@5da71eb9ecb1cb08c930edd1d052fa209375f38d#egg=src_code&subdirectory=lambdas
  1. 无法导入本地构建的包,src_code.egg-info/top_level.txt内容为:
module1
module2

异常原因

  1. Git仓库自动关联:pip在安装可编辑包时,若当前项目处于Git仓库内,会自动将本地路径替换为Git远程仓库URL,导致pip freeze显示远程地址而非本地包路径。
  2. 包结构配置错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:40:43