windows10とdocker-composeでpyqtgraph(とpyqt5)のセットアップ
はじめに
windows10でpythonのグラフ描画高速化のためにpyqtgraphを使おうとして,長時間嵌ったのでメモ.
やること
- docker,docker-composeのセッティング
- windwos10へのxserverのインストール
- python環境のDockerfile作成(※Debian11以降のもの,bullseyeを使用すること) とDockerfile内でグラフィック用のライブラリ等インストール
- dokcer-composeを作成し起動.
環境
[OS]
- windows10 pro
[docker image]
- python3.9.8-bullseye
背景
普段dockerを用いてpythonプログラミングを行いmatplotlibで描画していたが, 描画が遅いことが不満だったため,描画が早いと言われるpyqtgraphを使用しようと考えた.
pyqtgraphはpyqt5やpysideを利用したライブラリで高速という話である.
グラフィック周りの設定でかなり苦労したため,備忘として記載する. pyqt5はQtベースのGUIライブラリらしいので,GUI開発にも使える...かも.
実施手順
1. x-serverのインストール
windows10にx-serverをインストールし,起動する. 起動時に"Disable access control"にチェックを入れること.
詳しいやり方は下記参照.
VcXsrv(Xサーバー)をWindowsにインストールしLinuxのGUIをリモート操作する設定方法 | りんか ネット
2.Dockerfileの作成
ベースイメージには公式の(python)Docker Hubを使用する.
今回は3.9.8を使用する.(別ベージョンでも可とは思う)
個人的な好みでタグ選択はできるだけ細かくして指定している.
この際にDebian11以降ベースのものを選択しないと,後述するライブラリインストールの際に必要なライブラリが見つからず嵌る.
そして,pyqtgraph関連のパッケージとdocker内で起動するxserverをインストールする.
FROM python:3.9.8-bullseye USER root WORKDIR /src RUN apt-get update RUN pip install --upgrade pip RUN pip install pyqtgraph &&\ pip install Pyqt5 RUN apt-get -y install xserver-xorg
次に,qt関連で必要なプラグインをインストールする.
これはpython環境内でpyqtgraphを使用しようとした際に下記のようなqt関連のエラーが出たら対応するものになる.
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
インストールが必要なプラグインについては,コマンドライン上でfind /usr | grep "qxcb"
としてlibqxcb.soの場所を探し,
ldd ~/libqxcb.so
として中身をみる.
そして,not found
となっているパッケージについてapt-get
でインストールする.
RUN apt install -y libxkbcommon-x11-0 &&\ apt-get install -y libxcb*
なお,今回,libxcb~というパッケージが多くヒットして全部指定するのは面倒だったので,libxcb*
という表記で横着している.
これでDockerfile内の基本的な設定は完了する.
参考:
なお,docker-composeでビルド時にxserver-xorg
のインストールでkeyboardlayoutを聞かれて止まることがある.
その際は,下記を追加する.
ARG DEBIAN_FRONTEND=noninteractive
最終的にDokcerfileはこうなる.(ちょっとRUNのまとめ方を変えている)
FROM python:3.9.8-bullseye USER root WORKDIR /src ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update RUN pip install --upgrade pip RUN pip install pyqtgraph &&\ pip install Pyqt5 RUN apt-get -y install xserver-xorg &&\ apt install -y libxkbcommon-x11-0 &&\ apt-get install -y libxcb*
3. docker-composeの作成
次にdocker-composeを作成する.
ここでのポイントは,環境変数の設定を行なっていることであり,他の部分は普通のdocker-composeと同様.
docker version18.03からはDISPLAY=XXX.XXX.XXX.X
にはwindows10のipアドレスを指定する.これはwindows10のコマンドプロンプト上でipconfig
と打つと表示される.host.docker.internal:0.0
が使用できるため,これを用いたほうが楽である.
また,:0.0
はx-server起動時に設定したポート番号でデフォルトでは0.
LIBGL_ALWAYS_INDIRECT=1
とXDG_RUNTIME_DIR=1
はQt関連の環境変数と思われるがいまいち不明.
指定しなくてもpyqygraphは動作するが,warningが出て鬱陶しいので指定しておく.
version: '3' services: python: build: . volumes: - .:/src #カレントディレクトリとdocker内の/srcディレクトリをマウント environment: - DISPLAY= host.docker.internal:0.0 - LIBGL_ALWAYS_INDIRECT=1 - XDG_RUNTIME_DIR=1
以上で設定は終わりであり,docker-compose up
とするとビルドされる.
二回目以降では,x-serverを起動してからdocker-composeを起動すると使える.
pyqtgraphの動作確認
コマンドラインにpython -m pyqtgraph.examples
と打ち込む,
もしくはpythonを起動してpyqtgraphをimportし,exampleを表示できるか確認する.
import pyqtgraph.examples
pyqtgraph.examples.run()
もっとも簡単な、PyQtGraphのお試し法 - Qiita
これでグラフのサンプル集が起動したら成功である.