やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Raspbian stretch PyQt5 でウインドウを表示できなかった(ModuleNotFoundError: No module named 'PyQt5.sip')

 PyQt5は使えませんでしたとさ……。今までの苦労は一体……。

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 2018-06-27
  • Qt 5.7.1
  • pyenv 1.2.8

 2018-11-23時点。

インストール方法

 上記をそのまま真似した。ただしバージョンが違う。

前回まで

手順

テストコードを実行する(失敗)

  1. テストコードを作成する
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    button = QPushButton('button', window)
    window.show()
    sys.exit(app.exec_())
  1. 実行する
(Qt) $ python /tmp/work/test.py
  1. エラー発生……
Traceback (most recent call last):
  File "/tmp/work/test.py", line 2, in <module>
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton 
ModuleNotFoundError: No module named 'PyQt5.sip'

 解決できず……。

解決を試みる

  1. PyQt5-sipのインストール
  2. sip.so, sip.pyiのリンク
  3. パス確認
  4. ファイル名変更

1. PyQt5-sipのインストール

 それっぽいパッケージがある。

(Qt) $ pip search pyqt5
PyQt5-sip (4.19.13)               - Python extension module support for
                                    PyQt5
...
(Qt) $ pip install PyQt5-sip
...
  Could not find a version that satisfies the requirement PyQt5-sip (from versions: )
No matching distribution found for PyQt5-sip
...

 インストールできなかった……。

2. sip.so, sip.pyiのリンク

ln -s  /usr/local/lib/python3.6/site-packages/sip.so /Users/youruser/.pyenv/versions/electrum/lib/python3.6/site-packages/sip.so
ln -s  /usr/local/lib/python3.6/site-packages/sip.pyi /Users/youruser/.pyenv/versions/electrum/lib/python3.6/site-packages/sip.pyi

 上記を自分の環境に合わせる。

  • venv仮想環境にインストールしたSIP
    • /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip.so
    • /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip.pyi
  • pyenvが参照するライブラリパス
    • /home/pi/.pyenv/versions/3.7.1/lib/python3.7/site-packages
      • (ここにはsip.so, sip.pyiファイルが無かった)

 sip.so, sip.pyiファイルのシンボリックリンクを作成する。

ln -s  /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip.so /home/pi/.pyenv/versions/3.7.1/lib/python3.7/site-packages/sip.so
ln -s  /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip.pyi /home/pi/.pyenv/versions/3.7.1/lib/python3.7/site-packages/sip.pyi

 再びテストコードを実行するも、同様のエラー……。

3. パス確認

(Qt) $ pyenv which sip
/home/pi/root/env/py/Qt/bin/sip
````

$ pip show sip Name: sip Version: 4.19.13 Summary: None Home-page: None Author: None Author-email: None License: None Location: /home/pi/root/env/py/Qt/lib/python3.7/site-packages Requires: Required-by: You are using pip version 10.0.1, however version 18.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command.




(Qt) $ pip show PyQt5 Name: PyQt5 Version: 5.11.3 Summary: None Home-page: None Author: None Author-email: None License: None Location: /home/pi/root/env/py/Qt/lib/python3.7/site-packages Requires: Required-by:

 Pythonのバージョンと参照パスを確認する。

$ python

import sys print(sys.version) 3.7.1 (default, Nov 23 2018, 11:16:04) [GCC 6.3.0 20170516] print(sys.path) ['', '/home/pi/.pyenv/versions/3.7.1/lib/python37.zip', '/home/pi/.pyenv/versions/3.7.1/lib/python3.7', '/home/pi/.pyenv/versions/3.7.1/lib/python3.7/lib-dynload', '/home/pi/root/env/py/Qt/lib/python3.7/site-packages']

* `pip show sip`の`Location`は`sys.path`に含まれているので問題なく参照されるはず
* `sys.path`に`/home/pi/root/env/py/Qt/lib/python3.7/site-packages`が含まれることからシンボリックリンクを作成せずとも`sip.so`が参照できたはず

 今一度エラー文言を確認する。

ModuleNotFoundError: No module named 'PyQt5.sip'

 `sip`は問題ないが`PyQt5.sip`という名前が解決できない? テストコードには書いていないので、PyQt5内部で参照していると思われる。前回PyQt5をコンパイルしたときに作成されなかったのか?

 おそらくネット上の情報とはバージョンが違うことから、何かが変更されたのだろう。

### 4. ファイル名変更

* [https://teratail.com/questions/131959:title]

 テストコードのファイル名を`test.py`にしていたけど、Pythonライブラリと同じらしいので`testQt.py`に変更した。再度テストコードを実行するも同様のエラー。

(Qt) $ python /tmp/work/testQt.py ... ModuleNotFoundError: No module named 'PyQt5.sip'

# 所感

 動かせなかった……。最後の最後でやっぱりPythonの環境構築は罠だらけ。これだからPythonは嫌いよ。どうしたらいいの?

 もうPyQt5は諦めてC++で開発しよう……。