前提
これまではローカル環境でPyQt5を使ってアプリケーションの開発をしていました。
今度新しいPCに移行する予定なので、その時環境開発で躓かないようにDockerに移行することに決めました。
そしてコンテナを作成しましたがPyQt5がうまく動かず、いろいろ試行錯誤をしましたが現在お手上げに近いです。
debian:stable-slimのイメージを使いそこにpythonを入れた状態のコンテナで、PyQt5以外のモジュールは通常通り動作しています。モジュールの競合は起きていないはずです。
仮想環境であることがこのエラーに関係しているかどうかは不明です。
とにかくDocker上でPyQt5(または6)を使用してウェブアプリケーションの開発を行える環境が作れればよいので
以下のエラーの解決の他にもなにか解決策をもっていたらぜひ教えてください。
環境
Windows10 Home
Docker Desktop for Windows
アプリケーションを表示させるためにWindows側にVcXsrvを入れてXlaunchを起動しています。
以下が使用したDockerfileとdocker-compose.ymlです
Dockerfile
1FROM debian:stable-slim 2 3RUN apt-get update -y\ 4 && apt-get upgrade -y \ 5 && apt-get install tzdata -y \ 6 && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \ 7 && apt-get install x11-apps -y \ 8 && apt-get install python3 -y \ 9 && apt-get install python3-pip -y 10 11ENV TZ=Asia/Tokyo 12ENV DISPLAY host.docker.internal:0.0 13 14#以下はPyQt5をある程度動くようにするために実行するコマンド 15#試行錯誤で見つけました。無駄なものもあると思います。 16RUN export QT_DEBUG_PLUGINS=1 \ 17&& apt-get install ffmpeg libsm6 libxext6 -y \ 18&& apt-get install libxcb-icccm4 -y \ 19&& apt-get install libxcb-image0 -y \ 20&& apt-get install libxcb-keysyms1 -y \ 21&& apt-get install libxcb-render-util0 -y \ 22&& apt-get install libxcb-xinerama0 -y \ 23&& apt-get install libxcb-xkb1 -y \ 24&& apt-get install libxkbcommon-x11-0 -y \ 25&& apt-get install libegl1 -y \ 26&& apt-get install libnss3 -y \ 27&& apt-get install libxcomposite1 -y \ 28&& apt-get install libxtst6 -y \ 29&& export LIBGL_ALWAYS_INDIRECT=1 \ 30&& apt-get install -y mesa-utils libgl1-mesa-glx 31 32 33# JupyterLab 34RUN python3 -m pip install --upgrade pip \ 35&& pip install --no-cache-dir \ 36 black \ 37 jupyterlab \ 38 jupyterlab_code_formatter \ 39 jupyterlab-git \ 40 lckr-jupyterlab-variableinspector \ 41 jupyterlab_widgets \ 42 ipywidgets \ 43 import-ipynb 44 45# package 46RUN pip install --no-cache-dir \ 47 numpy \ 48 pandas \ 49 matplotlib \ 50 japanize_matplotlib \ 51 requests \ 52 beautifulsoup4 \ 53 PyQt5 \ 54 PyQtWebEngine
compose.yml
1version: "3" 2services: 3 py3: 4 build: 5 context: ./py3 6 dockerfile: Dockerfile 7 restart: always 8 entrypoint: > 9 jupyter-lab 10 --allow-root 11 --ip=0.0.0.0 12 --port=8887 13 --no-browser 14 --NotebookApp.token='' 15 --notebook-dir=/workspace 16 expose: 17 - "8887" 18 ports: 19 - "127.0.0.1:8887:8887" 20 volumes: 21 - ./py3/root_jupyter:/root/.jupyter 22 - ./workspace:/workspace
実現したいこと
PyQt5のコードを実行し、アプリケーションを表示させる。
発生している問題・エラーメッセージ
エラーコード
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast QGLXContext: Failed to create dummy context [436:436:0420/002409.613422:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
該当のソースコード
以下のコードは簡易的なブラウザを表示するコードです。
PyQtWebEngineに問題があるのではないかと個人的には思っています。
python
1from PyQt5.QtCore import * 2from PyQt5.QtWidgets import * 3from PyQt5.QtGui import * 4from PyQt5.QtWebEngineWidgets import * 5 6import sys 7 8class MainWindow(QMainWindow): 9 10 def __init__(self, *args, **kwargs): 11 super(MainWindow,self).__init__(*args, **kwargs) 12 13 self.browser = QWebEngineView() 14 self.browser.setUrl(QUrl("http://www.google.com")) 15 16 self.setCentralWidget(self.browser) 17 18 self.show() 19 20app = QApplication(sys.argv) 21window = MainWindow() 22 23app.exec_()
ちなみに以下のコードは正常通り動きます
ボタンを押すとconnectedという文字が消去されるプログラムです。
python
1import sys 2from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QLabel 3 4class ExampleWidget(QWidget): 5 6 def __init__(self): 7 super().__init__() 8 self.initUI() 9 10 def initUI(self): 11 self.resize(250, 150) 12 self.move(300, 300) 13 self.setWindowTitle('sample') 14 15 # buttonの設定 16 self.button = QPushButton('Clear!!') 17 self.label = QLabel('connected') 18 19 # buttonのclickでラベルをクリア 20 self.button.clicked.connect(self.label.clear) 21 22 # レイアウト配置 23 self.grid = QGridLayout() 24 self.grid.addWidget(self.button, 0, 0, 1, 1) 25 self.grid.addWidget(self.label, 1, 0, 1, 2) 26 self.setLayout(self.grid) 27 28 # 表示 29 self.show() 30 31 32if __name__ == '__main__': 33 34 app = QApplication(sys.argv) 35 ew = ExampleWidget() 36 sys.exit(app.exec_())
試したこと
別のアプローチとしてPyQt5が初めから使えるようになっている(はずの)イメージを利用して環境を作ろうとしました。
fadawar/docker-pyqt5というイメージを使用して以下のDockerfileで環境を作成しました
Dockerfile
1FROM fadawar/docker-pyqt5:latest 2 3RUN apt-get update -y \ 4 && apt-get upgrade -y \ 5 && apt-get install python3-pip -y 6 7ENV DISPLAY host.docker.internal:0.0 8 9# JupyterLab 10RUN pip install --no-cache-dir \ 11 black \ 12 jupyterlab \ 13 jupyterlab_code_formatter \ 14 jupyterlab-git \ 15 lckr-jupyterlab-variableinspector \ 16 jupyterlab_widgets \ 17 ipywidgets \ 18 import-ipynb 19 20# package 21RUN pip install --no-cache-dir \ 22 numpy \ 23 pandas \ 24 matplotlib \ 25 japanize_matplotlib \ 26 requests \ 27 beautifulsoup4 28
しかし先ほどと同じブラウザーを表示するプログラムで以下のエラーを吐きました
error1
1--------------------------------------------------------------------------- 2ModuleNotFoundError Traceback (most recent call last) 3Input In [1], in <cell line: 4>() 4 2 from PyQt5.QtWidgets import * 5 3 from PyQt5.QtGui import * 6----> 4 from PyQt5.QtWebEngineWidgets import * 7 6 import sys 8 8 class MainWindow(QMainWindow): 9 10ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'
このエラーを解決するために
pip install PyQtWebEngine
を実行し再び同じコードを実行すると以下のようなエラーになりました。
error2
1--------------------------------------------------------------------------- 2ImportError Traceback (most recent call last) 3Input In [1], in <cell line: 4>() 4 2 from PyQt5.QtWidgets import * 5 3 from PyQt5.QtGui import * 6----> 4 from PyQt5.QtWebEngineWidgets import * 7 6 import sys 8 8 class MainWindow(QMainWindow): 9 10ImportError: libsmime3.so: cannot open shared object file: No such file or directory
このエラーを解決するために調べて手当たり次第に試してみましたが効果はありませんでした
他にjozo/pyqt5というイメージも試しましたが同様でした

あなたの回答
tips
プレビュー