Python

しばらく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

 

しかし、PyQt5を用いたPythonスクリプト

 

 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.

 

というエラーで起動しない。でも、ものとは試しと16.04でパッケージ化したアプリを起動したらあっさりと起動してしまった。あの苦労はなんだったのだろう。

 

ちなみにmacOSの場合はbrewをインストールした上で、

 

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ですらこんなに互換性を取るのが難しいとは。