多分他にもハマる方が出てくるきそうな気がするので簡単に紹介します.
問題
Ubuntu 22.04 になると Python 3.10 以降になるのですが,このバージョンでは apt や pip でインストールされる PyBluez が正常に動作しなくなります.具体的には,そのまま実行すると下記のようなエラーが出ると思います.
1 2 |
bluez.hci_send_cmd(self.btle_sock, OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE, cmd_pkt) SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats |
Python 3.10 対応
この問題自体は,下記で議論されており,GitHub にある最新版で既に修正されています.
そのため,下記のように GitHub から pip でインストールすれば回避可能です.
1 2 |
sudo apt install libbluetooth-dev pip install git+https://github.com/pybluez/pybluez |
GitHub 版 PyBluez の問題
上記の対応で上手くいけばよいのですが,PyBluez の使い方によっては,次のエラーが発生していしまうと思います.
1 |
UnicodeDecodeError: ‘utf8’ codec can’t decode byte xx in position x |
これは,Python 3 に対応するため,2019に行われた下記の commit での変更に起因します.
この変更において,PyString_FromStringAndSize は一律 PyUnicode_FromStringAndSize に置き換えられています.
ほとんどの場合,これはうまく動くのですが,Bluez が返した値が utf-8 として不正な値になっていた場合,上記のエラーが発生します.これを回避するには,該当部分を PyUnicode_FromStringAndSize から PyBytes_FromStringAndSize に変更すれば OK です.
hci_send_req に関してこの置き換えを行ったものを,下記に置きました.
hci_send_req でエラーが出て困っている方は,次のようにして PyBluez をインストールしてもらえれば解決すると思います.
1 |
pip install git+https://github.com/kimata/pybluez |
まとめ
現時点(22年6月)において,Python 3.10 以降で PyBluez を使うには色々課題がありそうです.
必要に応じてソースを修正すると動くようになります.
コメント