今日工作小结与技术备忘
今天我们主要围绕一个基于 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信息被保留并传递下去,否则会导致后续的空间坐标变换失败。
希望这份总结能帮您巩固今天的收获!