VTKの構築#

Kitwareは PyPI VTK でVTK用のPythonホイールを提供していますが,場合によってはソースからVTKをビルドする必要があります(たとえば,Pythonの新リリース,EGLレンダリング,追加機能など). pyvistavtk を提供しないため,手動でビルドするか,PyPIからデフォルトのホイールをインストールする必要があります.

注釈

既成のホイールが必要な場合は,pyvista-wheels にさまざまな既成のホイールがありますが,自分で作った方がよいかもしれません.これらは "公式" なホイールではなく,VTK が直接提供する "公式" なホイールの変種を優先して,すぐに削除される予定です.

VTKのビルド方法 を参照してください.以下の説明は,EGLのような非標準的な状況でPythonホイールをビルドしたい場合を想定しています.

ホイールを作る#

ソースからVTKを構築するのはかなりストレートです.デフォルトのビルド設定を使用し,次のスクリプトを使用して ninja を使用し,VTKのPythonホイールをビルドします.このスクリプトはpython 3を使用していますが,最新のPythonバージョンを使用することができます.その他の便利なオプションについては, conda-forge recipe を参照してください.以下のほとんどのオプションは,構築時間を短縮し,ホイールサイズを小さくするように設計されています.

注釈

また,便利な CMake 設定ファイルをいくつか公開しましたので, banesullivan/vtk-cmake <https://github.com/banesullivan/vtk-cmake> から採用することができます.これらの設定は,ここで説明したビルドのバリエーションをカバーし,VTKホイールのバリエーションを再現性よくビルドするプロセスをより簡単にします.

#!/bin/bash

# Install build dependencies

# Linux/Debian
sudo add-apt-repository -y ppa:deadsnakes/ppa  # if on Ubuntu 20.04 or 18.04, building 3.10 for example
sudo apt update
sudo apt install -y ninja-build cmake libgl1-mesa-dev python3-dev git
sudo apt install -y python3.10-dev python3.10-distutils  # if using deadsnakes + Python 3.10
# If on 18.04, you'll need a newer cmake. You can follow VTK's instructions @ https://apt.kitware.com

# Linux/CentOS
sudo yum install epel-release
sudo yum install ninja-build cmake mesa-libGL-devel mesa-libGLU-devel

git clone https://gitlab.kitware.com/vtk/vtk.git
mkdir vtk/build
cd vtk/build
git checkout v9.1.0  # optional to select a version, but recommended

export PYBIN=/usr/bin/python3.10  # select your version of choice
cmake -GNinja \
      -DCMAKE_BUILD_TYPE=Release \
      -DVTK_BUILD_TESTING=OFF \
      -DVTK_BUILD_DOCUMENTATION=OFF \
      -DVTK_BUILD_EXAMPLES=OFF \
      -DVTK_DATA_EXCLUDE_FROM_ALL:BOOL=ON \
      -DVTK_MODULE_ENABLE_VTK_PythonInterpreter:STRING=NO \
      -DVTK_MODULE_ENABLE_VTK_WebCore:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebGLExporter:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebPython:STRING=YES \
      -DVTK_WHEEL_BUILD=ON \
      -DVTK_PYTHON_VERSION=3 \
      -DVTK_WRAP_PYTHON=ON \
      -DVTK_OPENGL_HAS_EGL=False \
      -DPython3_EXECUTABLE=$PYBIN ../
ninja

# build wheel in dist
$PYBIN -m pip install wheel
$PYBIN setup.py bdist_wheel
$PYBIN -m pip install dist/vtk-*.whl  # optionally install it

オフスクリーンプロットのGPUサポート#

VTKはEGLを使用したレンダリングをサポートしており,仮想フレームバッファをインストールせずにGPUハードウェアアクセラレーションを使用して迅速なオフスクリーンレンダリングを可能にします.デフォルトのVTKホイールにはこの機能はありませんが,上記の cmake コマンドを次のように変更することで,GPUサポートを使用したオフスクリーンVTKを作成できます.

#!/bin/bash

# install build dependencies (Linux/Debian)
apt-get update
apt-get install -y ninja-build cmake libegl1-mesa-dev python3-dev

# build using EGL
git clone https://github.com/Kitware/VTK
mkdir VTK/build
cd VTK/build \
git checkout v9.1.0
cd /VTK/build
cmake -GNinja \
  -DCMAKE_BUILD_TYPE=Release \
  -DVTK_BUILD_TESTING=OFF \
  -DVTK_BUILD_DOCUMENTATION=OFF \
  -DVTK_BUILD_EXAMPLES=OFF \
  -DVTK_MODULE_ENABLE_VTK_PythonInterpreter:STRING=NO \
  -DVTK_MODULE_ENABLE_VTK_WebCore:STRING=YES \
  -DVTK_MODULE_ENABLE_VTK_WebGLExporter:STRING=YES \
  -DVTK_MODULE_ENABLE_VTK_WebPython:STRING=YES \
  -DVTK_WHEEL_BUILD=ON \
  -DVTK_PYTHON_VERSION=3 \
  -DVTK_WRAP_PYTHON=ON \
  -DVTK_OPENGL_HAS_EGL:BOOL=ON \
  -DVTK_USE_X:BOOL=OFF \
  -DVTK_USE_COCOA:BOOL=OFF \
  -DVTK_DEFAULT_RENDER_WINDOW_HEADLESS:BOOL=ON \
  -DPython3_EXECUTABLE=/usr/bin/python3 ../
ninja

# build the python wheel
python3 -m pip install wheel \
python3 setup.py bdist_wheel \
pip install dist/vtk-*.whl

これにより,Xサーバを使用したすべてのプロットが無効になるため,このモジュールは,静止イメージを保存するか,またはレンダーウィンドウをディスプレイ(例: pyvista.set_jupyter_backend('server') とjupyterlab)とともに別のコンピュータにストリーミングする予定のあるヘッドレスディスプレイでのみ使用するようにしてください.言い換えれば,このホイールはVTKをスクリーン外の環境では使えなくするので,Xサーバのないヘッドレスシステムにインストールすることだけを計画してください.

OSMesaの構築#

OSMesaはCPUベースのホストでより高い可視化性能を提供します.xvfb`` の代わりに,これを使用してください.

sudo apt-get install libosmesa6-dev cmake ninja-build

git clone https://github.com/Kitware/VTK.git
cd VTK
git checkout v9.1.0
mkdir build
cd build

PYBIN=/usr/bin/python
cmake -GNinja \
      -DCMAKE_BUILD_TYPE=Release \
      -DVTK_BUILD_TESTING=OFF \
      -DVTK_BUILD_DOCUMENTATION=OFF \
      -DVTK_BUILD_EXAMPLES=OFF \
      -DVTK_DATA_EXCLUDE_FROM_ALL:BOOL=ON \
      -DVTK_MODULE_ENABLE_VTK_PythonInterpreter:STRING=NO \
      -DVTK_MODULE_ENABLE_VTK_WebCore:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebGLExporter:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebPython:STRING=YES \
      -DVTK_WHEEL_BUILD=ON \
      -DVTK_PYTHON_VERSION=3 \
      -DVTK_WRAP_PYTHON=ON \
      -DVTK_OPENGL_HAS_EGL=False \
      -DVTK_OPENGL_HAS_OSMESA=True \
      -DVTK_USE_COCOA=FALSE \
      -DVTK_USE_X=FALSE \
      -DVTK_DEFAULT_RENDER_WINDOW_HEADLESS=True \
      -DPython3_EXECUTABLE=$PYBIN ../
ninja
$PYBIN setup.py bdist_wheel

Wheels は dist ディレクトリに生成されます.

ManyLinux wheel の構築#

上記の方向性はVTKのローカルビルドを構築するのに適していますが,これらのwheelは,それらが構築されたLinuxのバージョンによるABI互換性の問題を考えると,ローカルインストールの外部で共有することは困難です.これを回避するには, manylinux のdockerイメージを使ってwheelをビルドします.

そのためには, git clone``d ``vtk ディレクトリに以下の内容の build_wheels.sh を作成し,実行権限を与えます (chmod +x build_wheels.sh):

#!/bin/bash
# builds python wheels on docker container and tests installation

set -e -x

# build based on python version from args
PYTHON_VERSION="$1"
case $PYTHON_VERSION in
3.8)
  PYBIN="/opt/python/cp38-cp38/bin/python"
  ;;
3.9)
  PYBIN="/opt/python/cp39-cp39/bin/python"
  ;;
3.10)
  PYBIN="/opt/python/cp310-cp310/bin/python"
  ;;
3.11)
  PYBIN="/opt/python/cp311-cp311/bin/python"
  ;;
esac

yum install -y ninja-build cmake mesa-libGL-devel mesa-libGLU-devel

rm -rf /io/build
mkdir /io/build -p
cd /io/build

cmake -GNinja \
      -DCMAKE_BUILD_TYPE=Release \
      -DVTK_BUILD_TESTING=OFF \
      -DVTK_BUILD_DOCUMENTATION=OFF \
      -DVTK_BUILD_EXAMPLES=OFF \
      -DVTK_DATA_EXCLUDE_FROM_ALL:BOOL=ON \
      -DVTK_MODULE_ENABLE_VTK_PythonInterpreter:STRING=NO \
      -DVTK_MODULE_ENABLE_VTK_WebCore:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebGLExporter:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebPython:STRING=YES \
      -DVTK_WHEEL_BUILD=ON \
      -DVTK_PYTHON_VERSION=3 \
      -DVTK_WRAP_PYTHON=ON \
      -DVTK_OPENGL_HAS_EGL=False \
      -DPython3_EXECUTABLE=$PYBIN ../
ninja-build

# build wheel in dist
rm -rf dist
$PYBIN -m pip install wheel
$PYBIN setup.py bdist_wheel

# cleanup wheel
rm -rf wheelhouse
auditwheel repair dist/*.whl

このスクリプトは,次のコマンドで呼び出すことができます:

export PYTHON_VERSION=3.10
docker run --cpus 4.5 -e \
       --rm -v `pwd`:/io quay.io/pypa/manylinux2014_x86_64 \
       /io/build_wheels.sh $PYTHON_VERSION

最終的に build/wheelhouse/vtk-*.whl ができあがるはずです.

注釈

EGLバージョンのwheelを作成するには,前のセクションの指示に従ってください.インストール依存関係に mesa-libEGL-devel を追加します.

Raspberry Pi上のPython VTK Wheel(64ビット)構築#

32ビット版Raspberry Pi(ARMv7)で構築することは可能だが,32ビット版のホイールを構築する際にはいくつかの問題が生じます( manylinux issue 84 を参照).32ビットで構築しようとする場合は, dockcross を使ってwheelを構築してみてください.そうしないとメモリの制限が生じる可能性があります(特に1GBのRAMしかない場合).

aarch64 manylinux wheel のビルドは, quay.io/pypa/manylinux2014_aarch64 イメージを使ったDockerで行うことができます.以下を実行します:

PYTHON_VERSION=3.8
rm -rf build
docker run -e \
       --rm -v `pwd`:/io quay.io/pypa/manylinux2014_aarch64 \
       /io/build_wheels.sh $PYTHON_VERSION

ここで, build_wheels.sh は次のようになります:

#!/bin/bash
# builds python wheels on docker container and tests installation

set -e -x

# build based on python version from args
PYTHON_VERSION="$1"
case $PYTHON_VERSION in
3.8)
  PYBIN="/opt/python/cp38-cp38/bin/python"
  ;;
3.9)
  PYBIN="/opt/python/cp39-cp39/bin/python"
  ;;
3.10)
  PYBIN="/opt/python/cp310-cp310/bin/python"
  ;;
3.11)
  PYBIN="/opt/python/cp311-cp311/bin/python"
  ;;
esac

/bin/bash
yum install epel-release
yum install ninja-build
yum install mesa-libEGL-devel  # only needed when building EGL

mkdir /io/build -p
cd /io/build

cmake -GNinja \
      -DCMAKE_BUILD_TYPE=Release \
      -DVTK_BUILD_TESTING=OFF \
      -DVTK_BUILD_DOCUMENTATION=OFF \
      -DVTK_BUILD_EXAMPLES=OFF \
      -DVTK_DATA_EXCLUDE_FROM_ALL:BOOL=ON \
      -DVTK_MODULE_ENABLE_VTK_PythonInterpreter:STRING=NO \
      -DVTK_MODULE_ENABLE_VTK_WebCore:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebGLExporter:STRING=YES \
      -DVTK_MODULE_ENABLE_VTK_WebPython:STRING=YES \
      -DVTK_WHEEL_BUILD=ON \
      -DVTK_PYTHON_VERSION=3 \
      -DVTK_WRAP_PYTHON=ON \
      -DVTK_OPENGL_HAS_EGL=False \
      -DPython3_EXECUTABLE=$PYBIN ../
ninja-build

# build wheel
rm -rf dist
$PYBIN setup.py bdist_wheel

# cleanup wheel
rm -rf wheelhouse
auditwheel repair dist/*.whl
cp wheelhouse/vtk*.whl /io/wheels

wheelで EGL を有効にするかどうかに応じて, DVTK_OPENGL_HAS_EGL を有効または無効にしてください.