LoginSignup
1
1

More than 1 year has passed since last update.

pyinstallerで実行ファイル化したら"qt.qpa.plugin"が出た話

Last updated at Posted at 2021-06-16

pythonは環境ごとにモジュールを入れなければいけないなど、非常に環境構築が面倒です。なので、実行ファイル化のためのツール「pyinstaller」はありがたい存在です。しかし、Ubuntuで実行ファイル化をして実際に動かしてみると、画像認識(OpenCV)が上手く処理していないことが判明。解決策があまり出てこなかったので、記録ついでに。

作業環境

Ubuntu20.04
python(pyinstaller、opencv-python、opencv-contrib-pythonインストール済み)
※windowsは実行ファイル化の際にそれらしいdllファイルを作ってくれるので、今回のようなエラーは発生しないと思います。

今回は実行ファイルをonefileにせずpyinstallerを動かしています。

エラー内容

qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "/home/ユーザ名/opt/etc/Desktop/dist/main/cv2/qt/plugins"
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

以前投稿した画像認識処理と似たようなコードを使用しています(画像取り込み→結果をウィンドウ表示)。
カメラで画像を取り込めたものの、取り込めた画像を表示できないようです。因みに画像取り込み自体ができていない場合は画像加工の処理で何かしらのエラーが出るはずです。

解決策

結局のところ、pyinstallerのファイル参照が不十分なのが原因でした。
エラー内容と照らし合わせると、cv2フォルダの中にあるqtフォルダを参照できなかったとのこと。なので、まずqtフォルダを作業環境のcv2フォルダからコピぺします(cv2フォルダは、デフォの環境なら~/.local/lib/python3.8/site-packagesの中に入っているはず)。
これで、plugins以下のフォルダ・ファイルは認識可能となりますが、この状態では全てのソースファイルを参照していないため、引き続きqt.qpa.pluginは出てしまいます。参照していないファイルの確認は、libqxcb.soを閲覧することで分かります。下が参照しきっていないソースファイルの一覧。

$ ldd main/cv2/qt/plugins/platforms/libqxcb.so | grep "not"
    libQt5XcbQpa-70670cdb.so.5.15.0 => not found
    libfreetype-8d3bcff4.so.6.14.0 => not found
    libz-d8a329de.so.1.2.7 => not found
    libQt5Gui-ca084835.so.5.15.0 => not found
    libQt5Core-d92f2856.so.5.15.0 => not found
    libX11-xcb-1ae4fd0e.so.1.0.0 => not found
    libxcb-icccm-413c9f41.so.4.0.0 => not found
    libxcb-image-e82a276d.so.0.0.0 => not found
    libxcb-shm-7a199f70.so.0.0.0 => not found
    libxcb-keysyms-21015570.so.1.0.0 => not found
    libxcb-randr-a96a5a87.so.0.1.0 => not found
    libxcb-render-util-43ce00f5.so.0.0.0 => not found
    libxcb-render-637b984a.so.0.0.0 => not found
    libxcb-shape-25c2b258.so.0.0.0 => not found
    libxcb-sync-89374f40.so.1.0.0 => not found
    libxcb-xfixes-9be3ba6f.so.0.0.0 => not found
    libxcb-xinerama-ae147f87.so.0.0.0 => not found
    libxcb-xkb-9ba31ab3.so.1.0.0 => not found
    libxkbcommon-x11-c65ed502.so.0.0.0 => not found
    libxkbcommon-71ae2972.so.0.0.0 => not found

これらを参照するには、opencv_python.libフォルダを先ほどの作業環境からcv2フォルダと同じディレクトリ(今回の場合はmainフォルダ)へコピペする必要があります。opencv_python.libフォルダの中を見ると、大体同じようなファイルがいくつかあるかと思います。
Screenshot from 2021-06-15 11-47-11 (3).png
このフォルダをコピペして初めて画像取り込み結果のGUIが表示されます。
まとめを兼ねて、最終的なファイル構成図を載せておきます。使用環境からcv2とopencv_python.libを探して、必要なものをコピペするという感じですね。

main
  |- cv2(実行ファイル化の際にフォルダ生成)
  |   |- cv2.cpython-38-x86_64-linux-gnu.so(生成済み)
  |   |- qt(使用環境からコピペする)
  |       |- fonts
  |       |- plugins
  |            |- platforms
  |                   |- libqxcb.so
  |
  |- opencv_python.libs(使用環境からコピペする)
  |      |- 各種ファイル
  |
(中略)
  |
  |- main(実行ファイル)

pyqt5でも同じようなエラーが出るらしいのですが、pyqt5の解決策だけでは足りないというのには注意ですね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1