【实习日记】day02

发布于:2025-07-03 ⋅ 阅读:(26) ⋅ 点赞:(0)

今日工作小结与技术备忘

今天我们主要围绕一个基于 Poetry 和 Conda 的 MONAI 检测项目,解决了一系列从环境配置到依赖安装的复杂问题。整个过程就像一次深度探案,最终成功理清了所有障碍。

一、今日遇到的主要问题与解决方案

我们今天解决了四个核心的“拦路虎”:

1. Poetry 安装与网络问题

  • 现象
    • 最初,在安装 Poetry 依赖时,出现 No matching distribution found for dulwich 的错误。
    • 解决了上一个问题后,又遇到了 Connection timed out,下载 cryptography 包失败。
  • 原因分析
    • 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 下载源更换为清华镜像,一劳永逸地解决了网络问题。

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" 这两行命令,明确告诉编译器去哪里寻找库文件和头文件。

3. Open3D 库安装失败

  • 现象open3d 安装失败,报错 Unable to find installation candidatesskipped as your project's environment does not support the identified abi tags
  • 原因分析:这是一个二进制不兼容问题。子项目 lungpyproject.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 转换,务必确保 MetaTensormeta 信息被保留并传递下去,否则会导致后续的空间坐标变换失败。

希望这份总结能帮您巩固今天的收获!


网站公告

今日签到

点亮在社区的每一天
去签到