Python本地创建包经Pipfile editable安装后无法导入的问题
本地可编辑安装Python共享包导入失败问题解决
问题背景
- 在apps目录同级创建packages目录,用来存放跨应用共享的可复用代码,后续计划发布,当前用本地可编辑模式测试
- mobile目录的Pipfile配置如下:
[packages] pronto_auth = {editable = true, path = "../../packages/auth"} pronto_apis = {editable = true, path = "../../packages/apis"} flet = "*"
- 安装成功后,Pipfile.lock里的包名自动转成短横线形式(比如
pronto-apis) - 用
from pronto_apis.apis.main.src.main import add_two_numbers导入时,出现错误:Import "pronto_apis.apis.main.src.main" could not be resolved - 不想用
from packages.apis.main.src.main import add_two_numbers这种导入方式,违背共享包的设计初衷 - 包的setup.py配置如下:
from setuptools import setup, find_packages setup( name='pronto_apis', version='0.0.1', packages=find_packages(), description='A brief description of your package', install_requires=[], )
排查及解决方法
1. 核对包目录结构是否符合Python规范
find_packages()默认会递归查找当前目录下带__init__.py的子目录作为包。你的pronto_apis包应该遵循以下结构:
packages/apis/ ├── pronto_apis/ # 顶层包目录,名称要和setup.py里的name字段一致 │ ├── apis/ │ │ ├── main/ │ │ │ ├── src/ │ │ │ │ ├── __init__.py │ │ │ │ └── main.py │ │ │ └── __init__.py │ │ └── __init__.py │ └── __init__.py └── setup.py # 放在apis目录下,和pronto_apis目录同级
如果你的目录是packages/apis/apis/main/...这种结构,find_packages()会把apis当成顶层包,而非pronto_apis,直接导致导入路径错误。
2. 修正setup.py的packages参数
如果目录结构没问题,但find_packages()没正确识别,可显式指定顶层包:
from setuptools import setup, find_packages setup( name='pronto_apis', version='0.0.1', packages=['pronto_apis'], # 显式指定顶层包 package_dir={'': '.'}, # 明确包的根目录 description='A brief description of your package', install_requires=[], )
3. 重新安装可编辑包
缓存可能导致异常,先卸载旧包再重新安装:
pip uninstall pronto-auth pronto-apis # 进入auth包目录安装 cd ../../packages/auth pip install -e . # 进入apis包目录安装 cd ../apis pip install -e .
或者用pipenv同步环境:
pipenv sync --dev
4. 检查IDE的解释器配置
如果是IDE(比如VS Code)提示无法解析,大概率是IDE没识别到虚拟环境里的可编辑包。确认IDE使用的是mobile目录下的Pipenv虚拟环境,然后重新加载窗口或刷新Python解释器路径。
5. 验证包的安装状态
进入虚拟环境,执行pip list,查看pronto-apis和pronto-auth是否存在,且路径指向你的packages目录。然后在Python交互环境测试导入:
from pronto_apis.apis.main.src.main import add_two_numbers print(add_two_numbers(1,2))
如果交互环境能成功导入,说明是IDE的问题;如果还是报错,继续排查包结构或安装步骤。
内容的提问来源于stack exchange,提问作者Mohamed Mohamed
相关产品推荐
相关产品推荐

