单仓库下两个Python应用共享模型的导入问题求助
解决单仓库多Python应用共享代码的导入问题
1. 规范目录结构
先把仓库结构调整为Python包识别的标准格式,必须给shared目录添加__init__.py(空文件即可),示例结构如下:
your-repo/ ├── api/ │ ├── main.py # REST API入口文件 │ └── requirements.txt ├── worker/ │ ├── worker.py # Worker入口文件 │ └── requirements.txt ├── shared/ │ ├── __init__.py │ ├── models.py # 包含ProvisioningRequest模型 │ └── utils.py # 共享工具函数 └── setup.py # 包配置文件
2. 编写setup.py配置
在仓库根目录创建setup.py,将shared注册为可安装的Python包:
from setuptools import setup, find_packages setup( name="shared", version="0.1.0", packages=find_packages(), include_package_data=True, )
3. 本地运行配置
本地开发时,用可编辑安装模式把shared包安装到Python环境,修改共享代码后无需重新安装即可生效:
- 打开终端进入仓库根目录
- 执行命令:
pip install -e .
之后在api/main.py或worker/worker.py里直接写:
from shared.models import ProvisioningRequest
即可正常导入,不会再触发相对导入错误。
4. Docker/ECR部署配置
每个应用的Dockerfile中,先安装shared包,再安装自身依赖:
API的Dockerfile示例(api/Dockerfile):
FROM python:3.11-slim WORKDIR /app # 复制根目录的setup.py和shared目录到容器 COPY ../setup.py . COPY ../shared ./shared # 安装shared包 RUN pip install . # 复制API代码和依赖文件 COPY . . RUN pip install -r requirements.txt # 启动API服务 CMD ["python", "main.py"]
Worker的Dockerfile示例(worker/Dockerfile):
FROM python:3.11-slim WORKDIR /app COPY ../setup.py . COPY ../shared ./shared RUN pip install . COPY . . RUN pip install -r requirements.txt # 启动Worker进程 CMD ["python", "worker.py"]
构建镜像时,必须从仓库根目录执行命令,比如构建API镜像:docker build -t api-image -f api/Dockerfile .,确保setup.py和shared目录能被正确复制。
5. 常见问题排查
- 检查Python环境:执行
pip list确认shared包已安装 - 确认
shared/__init__.py存在,无此文件Python无法识别该目录为包 - 不要手动修改
sys.path,这种方式易导致环境不一致,优先用setup.py的标准化方案
内容的提问来源于stack exchange,提问作者ajrice6713
相关产品推荐
相关产品推荐

