LOADING

加载过慢请开启缓存 浏览器默认开启

【踩坑记录】PyMesh编译与安装

说明

为什么写这篇文章?

近期在使用2024 CVPR论文Point2CAD项目时,需要依赖PyMesh库。然而该项目README未提供PyMesh的编译安装指南,且PyMesh官方文档仅针对Linux系统,更关键的是——这个已近五年未更新的库,官方并未发布pip包,只能手动编译安装。因此记录下整个过程,希望能帮到遇到同样问题的开发者。

能否跳过手动编译?

很遗憾,不能。PyMesh依赖大量C++库,这些库的官方支持主要面向Linux系统,且PyMesh官方文档不够详尽。更糟糕的是,其GitHub仓库main分支存在BUG(没错,官方代码有问题!需要自行修复!甚至有人在issue中询问仓库是否已废弃,但官方至今未回应)。

能否在Windows上编译?

由于PyMesh依赖的C++库官方主要支持Linux,目前我尚未在Windows系统上成功编译安装PyMesh,建议优先使用Linux环境尝试。

原仓库存在哪些问题?

原仓库 https://github.com/PyMesh/PyMesh.git 已近五年未更新,其中的第三方包甚至停留在七年前的版本。

需要说明的是,这里的第三方包特指 $PYMESHPATH/third_party 目录下的依赖库。由于长期缺乏维护,这些包要么需要替换,要么需要调试修复。

我的解决方案是直接替换这些过时的第三方包,升级到2024年12月30日的最新版本,并修复项目中存在的BUG。该仓库目前主要问题包括:

  • Draco、MMG 和 pybind11 三个第三方包版本过旧且存在语法问题
  • PyMesh/tools/Triangulation/MMG 目录下的 Delaunay.cpp 文件中存在函数参数不匹配的问题

这些问题已在我 fork 的仓库中修复。如果你希望在原仓库基础上调试,可先参考 这篇文章 进行安装,再参考 这篇文章 进行调试。

为什么不提交Pull Request?

原仓库的Pull Request已近五年未合并,社区维护近乎停滞。

环境与配置

基础环境

我的编译环境是Ubuntu系统,执行uname -a的输出为:

Linux autodl-container-2c8d41acaf-60b17b68 5.15.0-119-generic #129-Ubuntu SMP Fri Aug 2 19:25:20 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

环境部署在AutoDL平台的虚拟机上(非广告,博主日常使用云平台虚拟机便于环境迁移),配置如下:

编译环境配置

这里的环境准备是面向纯净系统的,我默认没有安装任何其他的工具和库。执行以下命令安装必要的依赖:

# 更新apt
sudo apt-get update
sudo apt-get upgrade

# 安装系统依赖
sudo apt-get install \
    libeigen3-dev \
    libgmp-dev \
    libgmpxx4ldbl \
    libmpfr-dev \
    libboost-dev \
    libboost-thread-dev \
    libtbb-dev \
    python3-dev

# 安装基础库
sudo apt install gcc
sudo apt install g++
sudo apt install cmake
sudo apt install python3 # 如果安装了conda,这一行就不用写了

克隆代码

从我的修复版本仓库克隆代码:

git clone https://github.com/cyling250/PyMesh.git
cd $PYMESHPATH  # $PYMESHPATH 为你本地的PyMesh代码路径

安装Python依赖

首先使用Conda创建Python环境(示例使用Python 3.10):

conda create -n py310 python=3.10
source activate py310  # Linux

安装项目依赖:

pip install -r $PYMESHPATH/python/requirements.txt

编译PyMesh

初始化子模块

本项目将第三方库维护成了子模块,需要先初始化子模块:

git submodule update --init --recursive

编译第三方包

项目提供了第三方包编译脚本,直接执行即可:

cd $PYMESHPATH/third_party
./build.py all

提示:如果使用我的修复版本仓库,编译应该能顺利通过;若使用官方原仓库,编译可能失败,可参考 调试教程 解决问题。

编译PyMesh

执行以下命令编译PyMesh:

cd $PYMESHPATH
mkdir -p build
cd build
cmake ..
make -j$(nproc)  # 使用多线程加速编译
# make tests  # 测试命令目前存在报错,但不影响基本功能使用

安装PyMesh

执行以下命令安装PyMesh:

cd $PYMESHPATH
./setup.py install

注意事项:原仓库README.md中推荐使用 python -c "import pymesh; pymesh.test()" 测试安装是否成功,但该功能在我的修复版本中不可用。

这是因为原仓库使用了 numpy.testing.Tester 进行测试,这是早期NumPy用于自身单元测试的内部工具,并非为第三方开发者设计的公共API。随着NumPy测试框架的重构和标准化,该类已在NumPy 1.24版本中被彻底移除。

若需测试功能,建议参考项目 ./python/pymesh/ 目录下的测试脚本自行编写测试用例。