しばらくPython + pyqt5 + sqlite3によるアプリづくりに熱中していたが、例えばUbuntu20.04で作ったものはUbuntu18.04では動いたが、Ubuntu16.04では動かなかった。
おそらくシステムのライブラリに違いがあるためだろうと思い、Ubuntu16.04でのビルドを試みたのだが、ここであらためてPythonの壁に突き当たった。Ubuntuの場合、Pythonは標準のパッケージマネジャでインストールできるのだけれど、16.04だと標準で3.5.2あたりが最新版となってしまう。これを使ってPyQt5を使おうとすると途中でエラーで落ちてしまう。
そういえばPythonの仮想環境がどうのこうのというのをmacOS上でもやった気がする、と思って調べてみると、なんだか結構ややこしい。結局分かったのは、
・Pythonの仮想環境は複数ある
・その中でpyenvが理解しやすく、使いやすい
ということだった。二行目は人によるかもしれないが、個人的にはこうだった。
で、pyenvはGithub上で公開されており、そのインストール方法も別途公開されているため、それに従い、まずpyenvをインストールする。ちなみにgitとcurlが必要なので予めインストールしておく。pyenvインストール完了時にパス追加のメッセージが出るので指示に従う。
下記のPythonインストールはソースからビルドしており、その際に必要なライブラリやツールを予めインストールしておく。
sudo apt install -y build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev libreadline-dev libsqlite3-dev libopencv-dev tk-dev git
次に、Pythonの例えば現時点での最新版3.9.6をインストールするのだが、pyinstallerはPython関係のライブラリを要求する。なので、インストール時に
env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.6
とした。このバージョンを任意のディレクトリで実行できるようにするには
pyenv global 3.9.6
とする。次はpipをインストールするのだけれど、これもオリジナルサイトからのインストールが良さそうなので、
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
でインストールする。ここでやっとpyinstallerとかpyqt5をインストールすると、どうやらうまく動くようだ。
ちなみに探求心を発揮して、Ubuntu 14.04の場合も上と同様に試してみてPython3.9.6のインストールまでは完了した。ただし、opensslのバージョンが1.0なので1.1をコンパイル・インストールする必要がある。
env PYTHON_CONFIGURE_OPTS="--enable-shared --with-openssl=/home/ユーザ名/openssl" pyenv install 3.9.6
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
というエラーで起動しない。でも、ものとは試しと16.04でパッケージ化したアプリを起動したらあっさりと起動してしまった。あの苦労はなんだったのだろう。
brew install pyenv
の後、
env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.9.6
とやればよいようだ。
ただし、パスへの追加がされていないため、
pyenv init
で出てきた指示に従って.profileに追記する必要がある。
次にpip3はUbuntuと同様にオフィシャルサイトからのダウンロード・インストールを行う。
再び好奇心を発揮してMacBookProの実機にHighSierraをインストールして試してみたところ、Python, pyinstaller, PyQt5のインストールまではいくものの、pyinstallerによるパッケージ化途中でcodesignがなんたらというエラーが出て止まってしまった。エラーが出た個所が表示されていて、codesignしているだけの関数だったので、処理せずにreturnだけするようにしたところ、アプリとしてのパッケージ化までは成功した。
ところが、これをアプリとして起動するとエラーを吐いて止まってしまったのだった。自分の力量ではここまで。システムのあちこちからファイルを収集・統合している結構高度なことをしているのだろうけれど、高々4年くらい前のOSですらこんなに互換性を取るのが難しいとは。