今日工作小结与技术备忘
今天我们主要围绕一个基于 Poetry 和 Conda 的 MONAI 检测项目,解决了一系列从环境配置到依赖安装的复杂问题。整个过程就像一次深度探案,最终成功理清了所有障碍。
一、今日遇到的主要问题与解决方案
我们今天解决了四个核心的“拦路虎”:
1. Poetry 安装与网络问题
- 现象:
- 最初,在安装 Poetry 依赖时,出现
No matching distribution found for dulwich
的错误。 - 解决了上一个问题后,又遇到了
Connection timed out
,下载cryptography
包失败。
- 最初,在安装 Poetry 依赖时,出现
- 原因分析:
dulwich
找不到,是因为执行安装的 Python 版本(系统默认的 Python 3.6.8)过低,不满足 Poetry 依赖的要求。- 连接超时是典型的网络问题,访问官方 PyPI 源不稳定。
- 解决方案:
- 激活 Conda 环境:先执行
conda activate <您的环境>
,确保在一个满足版本要求(Python > 3.8)的环境中执行安装命令。 - 更换国内镜像源:执行
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
,将 pip 下载源更换为清华镜像,一劳永逸地解决了网络问题。
- 激活 Conda 环境:先执行
2. Pillow 库编译失败
- 现象:安装依赖时,
Pillow
包编译失败,报错The headers or library files could not be found for jpeg
。 - 原因分析:
Pillow
在编译时需要链接到操作系统的底层 C 库libjpeg
。系统中缺少了用于编译的开发文件(.h
头文件)。- 由于您没有
sudo
权限,无法通过yum
在系统层面安装。 - 即便用 Conda 安装了
jpeg
,Poetry 的隔离构建环境也默认找不到 Conda 环境中的库。
- 解决方案:
- Conda 安装依赖:在 Conda 环境中执行
conda install jpeg zlib
,将 C 库安装到用户目录下。 - 指定编译路径:在运行
poetry install
之前,通过export LDFLAGS="-L$CONDA_PREFIX/lib"
和export CPPFLAGS="-I$CONDA_PREFIX/include"
这两行命令,明确告诉编译器去哪里寻找库文件和头文件。
- Conda 安装依赖:在 Conda 环境中执行
3. Open3D 库安装失败
- 现象:
open3d
安装失败,报错Unable to find installation candidates
和skipped as your project's environment does not support the identified abi tags
。 - 原因分析:这是一个二进制不兼容问题。子项目
lung
的pyproject.toml
文件中,版本被“写死”为open3d = "0.18.0"
,而这个版本的预编译包(wheel)与您当前的 Python 或系统环境不兼容。 - 解决方案:
- 修改版本约束:编辑子项目的
pyproject.toml
文件,将open3d = "0.18.0"
修改为open3d = "^0.18.0"
,允许 Poetry 寻找更新、更兼容的版本。 - 硬重置:在修改配置后,通过删除
poetry.lock
文件 (rm poetry.lock
),然后重新运行poetry install
,强制 Poetry 从零开始、根据最新的规则解析所有依赖。
- 修改版本约束:编辑子项目的
4. Python 导入与 MONAI 变换问题
- 现象:
- 运行脚本时出现
ModuleNotFoundError: No module named 'lung'
。 - 自定义变换中出现
ImportError: attempted relative import with no known parent package
。 - 添加 GLA 增强后,出现
Num foregrounds 0
的警告。
- 运行脚本时出现
- 原因分析:
ModuleNotFoundError
是因为没有执行poetry install
,项目本身未被安装到环境中。- 相对导入错误是因为直接运行了模块文件,应改为运行主脚本。
Num foregrounds 0
的警告是因为自定义变换丢失了 MONAI 的MetaTensor
元数据,导致后续坐标变换失败。
- 解决方案:
- 始终记得运行
poetry install
来同步环境。 - 将模块内的相对导入
from .module
改为绝对导入from module
。 - 修改自定义 MONAI 变换,确保在处理
MetaTensor
后,将meta
信息复制并重新附加到新的MetaTensor
上,保证元数据在流水线中正确传递。
- 始终记得运行
**4. cannot import name ‘vtkCapsuleSource’ from ‘vtkmodules.vtkFiltersSources’ **
- 解决方案:poetry add vtk@9.4.1
二、常用知识与命令备忘
1. Linux / Shell
export VAR="value"
:设置环境变量,并使其对所有子进程可见。PATH
环境变量:系统的“命令地址簿”,决定了你在任何路径下能直接运行哪些命令。~/.bashrc
或~/.zshrc
:Shell 的启动配置文件,写入其中的命令会在每次打开新终端时自动执行。source ~/.bashrc
:重新加载配置文件,让修改立即生效。vim
基本退出:先按Esc
键,然后输入:q!
并回车,表示“强制退出且不保存”。rm <文件名>
:删除文件。
2. Conda
- 与系统包管理器的区别:
conda
在用户个人目录下管理独立的环境;yum
/rpm
管理整个操作系统的公共软件。两者互不干扰。 conda install <包名>
:不仅能装 Python 包,还能安装像jpeg
这样的 C 库。conda list -n <环境名> | grep <包名>
:检查在指定 Conda 环境中是否安装了某个包。$CONDA_PREFIX
:一个非常有用的环境变量,它总是指向当前已激活的 Conda 环境的根目录。
3. Poetry & Python
- 命令分工:
poetry lock
: 规划阶段,只计算依赖并生成poetry.lock
蓝图文件。poetry install
: 施工阶段,严格按照poetry.lock
的蓝图来安装/同步环境。poetry update <包名>
: 更新阶段,根据pyproject.toml
的规则去寻找某个包的最新兼容版本,并更新poetry.lock
。
- 版本约束:
="1.2.3"
:精确版本,写死。="^1.2.3"
:兼容版本,允许升级到1.x.x
但不能到2.0.0
。这是推荐的写法。
- 编译指导:
LDFLAGS="-L/path/to/lib"
:告诉链接器去哪里找库文件(.so
)。CPPFLAGS="-I/path/to/include"
:告诉编译器去哪里找头文件(.h
)。
4. MONAI
MetaTensor
: MONAI 的核心概念,它是一个“背着背包”的张量,背包(.meta
字典)里装着仿射矩阵等空间信息。- 自定义变换:在创建自己的变换类时,如果操作涉及
numpy
转换,务必确保MetaTensor
的meta
信息被保留并传递下去,否则会导致后续的空间坐标变换失败。
希望这份总结能帮您巩固今天的收获!