Smart HomeをDIYする

Apple HomeKit は対応製品が少なくて高価なのでHomebridgeでがんばります

macOS VenturaでPython 3を動かす

年に1回のmacOSメジャーアップデートが昨日 (2022年10月25日) 公開されたので、最新版のmacOS Ventura 13.0にクリーンインストールしました。それでPython 3もインストールし直しました。

秋の大アップデート祭

Appleエコシステムで暮らすユーザにとって、秋は毎年恒例のメジャーアップデートの季節です。昨日 (2022年10月25日) 、macOSがVentura 13.0にアップデートされたのと同時に、先月16.0にアップデートされたiOSも16.1にアップデートされました。なので昨日は、

  1. MacmacOS Ventura 13.0にアップデートして、
  2. iPhoneiOS 16.1にアップデートして、
  3. iPadをiPadOS 16.1にアップデートして、
  4. AppleWatchをwatchOS 9.1にアップデートして、
  5. AppleTVをtvOS 16.1にアップデートして、
  6. HomePodソフトウェアバージョン16.1にアップデート

しました。このうち、iOSのホームとHomePodがMatter対応しました。ただMatter対応デバイスがないのでいずれにしても確認できないです。HomePodのThreadは、応答が良くなった気がしなくもないです。NanoleafのThread接続電球が前よりもスムーズに応答するようになりました。パフォーマンスと安定性が改善されたらしいので、関係あるかもしれません。

Macのアップデートでは、元のボリュームを消去してクリーンインストールしました。とはいえ/Users以下は別ドライブに置いているので、ユーザデータは残ってます。また/Applicationsもバックアップとってあるので、アプリアイコンをドラッグ&ドロップで元に戻すだけです。ただターミナルから操作するUNIX系コマンド類は、初期状態に戻ってしまいました。そこでスマートホームに欠かせない(個人の感想です)Pythonを復活させます。

macOSのプログラミング環境

macOSは元々がFreeBSD系のOSなので、UNIX系の開発環境が最初から整ってます。cc, gcc, swift, java, perl, rubyなど主要はプログラミング言語はほとんど揃ってます。もちろんPython 3もあります。イケてるUNIX環境なのでPython 2はありません。

% which python
python not found
% which python3
/usr/bin/python3
% ls -lh /usr/bin/python3
-rwxr-xr-x 76 root wheel  163K 10 18 21:36 /usr/bin/python3

ただ、最近ではライセンスの関係なのか、初期状態では言語系ツールがすぐには動きません。Python 3を動かそうとすると、

% python3      
xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.

 というようなメッセージが出て、ダイアログが出ます。

ここでインストールボタンを押せば、インストールされることもありますが、失敗することもあります。ccコマンドではこれでインストールできたのですが、python3コマンドでは失敗します。

Xcodeをインストールする

ここで要求されている「コマンドラインデベロッパツール」というのは、Xcodeの一部です。なのでXcodeをインストールすれば確実に対応できます。Xcodeには色々なツールもついてますし、これだけの開発環境が無料ですし、簡単に入手できるので、macOSとセットでインストールすべきアプリです(個人の感想です)。

Xcodeは、App Storeにあります。そこでXcodeを検索するとすぐに出てきます。

Xcodeのダウンロード終了後に起動すると、同意を求められます。コマンドラインからプログラム言語を使う場合に必要だったのは、この同意でした。

この後に、開発に必要なツールがインストールされます。

これでXcodeでプログラム開発できる状態になりました。

でも今回はXcodeは使わないので、ここで終了します。

Python 3を起動する

これでpython3が動くようになってます。以下、太字が入力した部分です。

% python3 --version
Python 3.9.6

Python 3の最新バージョンは3.10.4らしく、Raspberry Piにもそれが入っています。ネットを見ると「macOSに入っているPythonは古い」と言われてますが、それは昔の話で、現在はそこそこ最新バージョンが用意されていると思います。pip3もあります。

% pip3 --version
pip 21.2.4 from /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages/pip (python 3.9)

MQTTライブラリをインストールする

次にPythonにライブラリを追加してみます。MQTTは使いたいので、paho-mqttをインストールします。

% pip3 install paho-mqtt
Defaulting to user installation because normal site-packages is not writeable
Collecting paho-mqtt
  Downloading paho-mqtt-1.6.1.tar.gz (99 kB)
     |████████████████████████████████| 99 kB 8.2 MB/s 
Building wheels for collected packages: paho-mqtt
  Building wheel for paho-mqtt (setup.py) ... done
  Created wheel for paho-mqtt: filename=paho_mqtt-1.6.1-py3-none-any.whl size=62133 sha256=514dad7...
  Stored in directory: /Users/xxxxx/Library/Caches/pip/wheels/0f/90/29/db29...
Successfully built paho-mqtt
Installing collected packages: paho-mqtt
Successfully installed paho-mqtt-1.6.1
WARNING: You are using pip version 21.2.4; however, version 22.3 is available.
You should consider upgrading via the '/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip' command.

無事インストールできました。pipを使うたびにバージョンが古いというWARNINGが出るので、指示に従ってアップデートしておきました。pip3のバージョンが上がりました。

% /Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages (21.2.4)
Collecting pip
  Downloading pip-22.3-py3-none-any.whl (2.1 MB)
     |████████████████████████████████| 2.1 MB 7.4 MB/s 
Installing collected packages: pip
% pip3 --version
pip 22.3 from /Volumes/home/xxxxx/Library/Python/3.9/lib/python/site-packages/pip (python 3.9)

Pythonから公衆MQTTブローカを使う

paho-mqttを使った簡単なプログラムを作りました。broker.hivemq.comというパブリックなMQTTブローカーに接続するテストです。公衆のブローカーは、ボランティアで動かしてくれているので、止まっているかもしれません。LAN内にMosquittoなどのMQTTブローカを用意してある方はそちらを使うのが確実です。

#!/usr/bin/python3
from paho.mqtt import client as mqtt_client
address='broker.hivemq.com'
port=1883
sub_topic='pythontest/set'
pub_topic='pythontest/get'
client_id=f'python_856389663' #something random

def on_connect(client, userdata, flags, rc):
    if rc==0:
        print("Connection established.")
        client.publish(pub_topic,"Python client connected.")
    else:
        print("Failed to connect: %d\n",rc)

def on_message(client, userdata, msg):
    print(msg.payload.decode())

client=mqtt_client.Client(client_id)
client.on_connect=on_connect
client.connect(address,port)
client.subscribe(sub_topic)
client.on_message=on_message

client.loop_forever()

MQTTの動作をモニターするために、このMQTTブローカーをサブスクライブします。mosquittoをインストール済みのコンピュータから以下のコマンドを入力します。

$ mosquitto_sub -h broker.hivemq.com  -t pythontest/# -v

別のターミナルウィンドウから、上記のPythonプログラムを以下

% ./mqtttest.py
Connection established.

のように動かすと、MQTTをサブスクライブしたウィンドウにも、

$ mosquitto_sub -h broker.hivemq.com  -t pythontest/# -v
pythontest/get Python client connected.

というメッセージが出るはずです。また、別のターミナルウィンドウから、

$ mosquitto_pub -h broker.hivemq.com  -t pythontest/set -m 'hello'

というコマンドを動かして、helloというメッセージを送れば、pythonを動かしているウィンドウには、

% ./mqtttest.py
Connection established. hello

というようにhelloの文字が表示されるはずです。

まとめ

まっさらな状態のmacOSPython 3を動かす手順を紹介しました。Xcodeをダウンロードして、一回だけ起動してライセンス許諾すれば使用できます。macOSpythonをインストールする方法は、他にも複数あります。それぞれ長所・短所がありますが、Appleによって初めからインストールされているpythonを活かすのがシンプルで良いと思います。