说明
为什么写这篇文章?
近期在使用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/ 目录下的测试脚本自行编写测试用例。