Tagebuch von Spargel

最近zennに移行しましたhttps://zenn.dev/spargel

windows10とdocker-composeでpyqtgraph(とpyqt5)のセットアップ

はじめに

windows10でpythonのグラフ描画高速化のためにpyqtgraphを使おうとして,長時間嵌ったのでメモ.

やること

  1. docker,docker-composeのセッティング
  2. windwos10へのxserverのインストール
  3. python環境のDockerfile作成(※Debian11以降のもの,bullseyeを使用すること)  とDockerfile内でグラフィック用のライブラリ等インストール
  4. 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内の基本的な設定は完了する.

参考:

`qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.` というエラーが起きたときの対処 - Qiita

なお,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と同様.

DISPLAY=XXX.XXX.XXX.Xにはwindows10のipアドレスを指定する.これはwindows10のコマンドプロンプト上でipconfigと打つと表示される. docker version18.03からはhost.docker.internal:0.0が使用できるため,これを用いたほうが楽である.

また,:0.0はx-server起動時に設定したポート番号でデフォルトでは0.

LIBGL_ALWAYS_INDIRECT=1XDG_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

これでグラフのサンプル集が起動したら成功である.