PyCharm容器调试Python应用前如何自动安装Poetry依赖
问题背景
- 开发环境:Windows 系统 + PyCharm Professional 2022.1.2
- 依赖管理方案:使用 Poetry 管理Python应用依赖,所有依赖声明统一存放在
pyproject.toml文件中 - 需求:在Linux环境的Docker容器内调试应用,已完成远程Docker解释器配置,启动应用时抛出如下错误:
70a53fea2bae:python -u /opt/project/myapp/cli/main.py serve Traceback (most recent call last): File "/opt/project/myapp/cli/main.py", line 7, in <module> from myapp.dashboard import serve_dashboard File "/opt/project/myapp/__init__.py", line 1, in <module> from myapp.pipeline.api.data_reader import ExperimentReader File "/opt/project/myapp/pipeline/api/data_reader.py", line 7, in <module> from pandas import DataFrame ModuleNotFoundError: No module named 'pandas' Process finished with exit code 1
- 错误根因:Docker容器内未安装
pyproject.toml声明的项目依赖,需要配置PyCharm在应用启动前自动执行poetry install完成依赖安装。
配置方法
可选择以下任意一种方案实现需求:
方案1:配置运行前自动执行依赖安装命令
- 点击PyCharm右上角运行/调试配置的下拉菜单,选择「Edit Configurations...」
- 选中用来启动项目的对应Python运行配置项
- 找到配置页中的「Before launch」(启动前执行)区域,点击区域左上角的
+按钮 - 在弹出的操作列表中选择「Run External Tool」(运行外部工具)
- 在外部工具选择窗口点击
+新建自定义工具,按如下参数填写:- Name:可自定义,比如
容器内安装Poetry依赖 - Program:选择本地的
docker可执行文件路径 - Arguments:填写
exec $ContainerName$ poetry install --no-root,如果PyCharm每次运行自动创建临时容器,可直接将Program选为已配置的Docker远程解释器对应的Poetry可执行路径,Arguments填install --no-root,工作目录设置为容器内项目映射路径/opt/project - Working directory:选择本地项目的根目录即可
- Name:可自定义,比如
- 保存新建的外部工具,确认它已被添加到启动前执行列表,将它的执行顺序拖动到「Run Python script」项之前
- 保存运行配置即可,下次启动应用时会先自动在容器内执行依赖安装,再启动项目代码
方案2:镜像构建阶段预装依赖(更推荐)
这个方案不需要每次启动应用都重复执行安装步骤,调试效率更高:
- 编写项目对应的Dockerfile时,提前加入Poetry安装步骤、依赖文件拷贝步骤和依赖安装步骤,核心示例片段:
# 基础镜像根据实际需求选择,这里以python3.10为例 FROM python:3.10-slim # 提前安装Poetry RUN pip install poetry # 配置Poetry不创建虚拟环境(容器内无需单独搭建虚拟环境) RUN poetry config virtualenvs.create false # 先拷贝依赖声明文件,充分利用Docker构建缓存 COPY pyproject.toml poetry.lock ./ # 提前安装所有依赖 RUN poetry install --no-root # 后续拷贝项目代码、配置启动命令的逻辑按实际需求编写
- 用这个Dockerfile构建项目镜像,再把PyCharm的Docker解释器指向这个镜像创建的容器,启动时就不会再出现缺包的问题。
注意:如果使用方案1,要提前确认对应Docker容器内已经安装了Poetry,否则执行
poetry install时会抛出命令不存在的错误。
内容的提问来源于stack exchange,提问作者urig
相关产品推荐
相关产品推荐

