PythonでWindowsやMac等のGUIプログラム(いわゆるデスクトップアプリ)が作れることは有名です。
私も会社(製造業)の業務で使うアプリを初めてPython+PyQtで作ってみました。結果的にやろうとしていたことはすべてできたのですが、Pythonで作るGUIアプリは、使い方が限定されるなと感じました。
それと同時に、今までVB.NETで作っていたようなアプリがPythonで実装できたことに大きな感動も覚えました!
私の環境は以下の通りです。
[st-mybox title=”” fontawesome=”” color=”#757575″ bordercolor=”#f3f3f3″ bgcolor=”#f3f3f3″ borderwidth=”0″ borderradius=”5″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]
Windows 7 pro 32bit
python 3.6(Anaconda)
[/st-mybox]
PyQtでGUIアプリ:こんな使い方には向いてない
結論から言うと、問題はPython GUIアプリのexe化です。
Qt Designerを使ったPython GUIアプリの作り方は、色んなサイトを参考にしなんとか作ることができます。そして作ったアプリは、現場のWindowsパソコンで動かすためにexe化をするわけですね。
exe化をせずに、実際にプログラムを使用するWindowsパソコンにPythonの実行環境を構築する方法もあります。しかし、作ったPythonプログラムを複数のPCで使いたいとなると、都度の環境構築は本当に手間です。やはり現実的にはPython GUIアプリのexe化ということになるでしょう。
exe化することで感じた問題点は以下の通りです。
向いてない使い方
- プログラム容量が大きい
- よってサーバーから都度読み込むような使い方が出来ない
私が感じた問題点は上記の2つです。プログラムの動作自体は問題ないのですが、運用上の問題が出ます。
プログラム容量が大きい
Python GUIプログラムのexe化にはいくつか方法があるようですが、私はpyinstallerを使いました。pyinstallerは、Python GUIアプリ用のフォームファイルやメインの実行ファイルをまとめてひとつのexeファイルにしてくれるアプリです。
これを使うと、たしかにexe化ができるのですが、いかんせんファイルの容量が非常に大きい。しかもアプリの起動に時間がかかる・・・。Pythonプログラム中にモジュールをたくさんインポートしていると、この遅さは顕著です。
VB.netで作れば数MBで作れるようなコードでも、pyinstallerでひとつにまとめたexeファイルは数十MB、下手をすると100MB越えます。容量を抑えるためにメインの処理だけexe化して、モジュール等は外部ファイルとして使用するexe化の方法もあります。こちらはアプリの起動が遅いということはありませんでしたが、それでもファイル容量が数十MB。うーん、やっぱりPythonはGUIアプリが苦手なんですかね。
インポートしたモジュールは以下の通りです。僅か400行ほどのコードですが、exe化すると容量が肥大化する要素があるんですね。
[st-mybox title=”” fontawesome=”” color=”#757575″ bordercolor=”#f3f3f3″ bgcolor=”#f3f3f3″ borderwidth=”0″ borderradius=”5″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]
- PyQt関係一式
- sys
- socket
- pySerial
- mysql-connector
[/st-mybox]
HDDが大容量化した現代で、100MB程度のソフトウェアは問題になることはそうそうないと思いましたが、運用する中で次の問題が発生しました。
サーバーから都度読み込むような使い方が出来ない
複数のパソコンで同じアプリを使う場合、バージョン管理等を考えて都度サーバから読み込むような使い方をします。このときに読む込むアプリが100MBもあると、起動にすごく時間がかかるんですよね。起動してしまえば問題なく動くのですが、「パソコンがフリーズしたんじゃ・・・」と思うほど時間がかかるので、これは使えん!と判断しました。
結局、なんとか60MBほどにしぼったexeファイル+モジュール系ファイルを当該のWindowsパソコンにコピーし使っています。この使用方法だと、アプリの更新があったときに、全部のパソコンのアプリを書き換える必要があります。ネットワーク上のパソコンのアプリを管理するソフトなんか入っていませんので手作業になりますね。。。とほほ
exeファイルの容量肥大化の対策は?
exeファイルの容量を抑える方法はあるようです。
[st-mybox title=”” fontawesome=”” color=”#757575″ bordercolor=”#f3f3f3″ bgcolor=”#f3f3f3″ borderwidth=”0″ borderradius=”5″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]
- モジュールをインポートせずに機能を実装する
- py2exeにてexe化をする
- ファイルを圧縮する
[/st-mybox]
などなど、他にも方法があったような気がしますがどれもひと手間かかりますね。モジュール使わず機能実装とか、、、超本格的!できたら本当に容量かるくなりそうですね。私には到底できません。
また、pyinstallerを使わず、「py2exe」でexe化する方法は試してみましたが、私のコードはエラーが出てしまいexe化できませんでした。使っているモジュールの関係だと思いますが、結局どこでひっかかっているかわからず、原因不明です。
ファイルを圧縮する方法は、起動が遅くなるという情報があり、断念しました。
[st-point fontsize=”” fontweight=”bold” bordercolor=””]Python GUIアプリの実行環境がスマートに構築できる方法は無いものか?? [/st-point]
Windowsパソコンに、Python GUIアプリを製作したときの環境をさくっと再構築できれば(しかもリモートで、複数のPCを一斉に)このexe化問題は解決するんですけどね~。私の調べ方が悪いのか、そのような簡単な方法はみつかりませんでした。みなさんPython GUIアプリのexe化は、容量で苦労されているみたい。
「exeファイルをサーバーから読み込んで使う」という特殊な使い方でなければ、容量は多少大きくても目をつむっているんでしょうか?
問題はあったけどPythonでGUIアプリをつくれたことに感動
PythonでGUIアプリが作れることは知っていました。しかし、製造業の現場で使うようなアプリ(シリアル通信やDBアクセス、ソケット通信等)を実際に作れたことには感動しました。
Pythonの良いところは「モジュールの多さ」です。私のように機能の実装が不得意でも、誰かが作ってくれた優秀なモジュールを読み込むだけでアプリが作れてしまうのです。そしてコンソール系の処理が得意なPythonでGUIまで作れてしまいました。
exe化では少しつまづきましたが、当該アプリを現場にリリースして約2ヵ月、、、とくに不具合なく動いています。やっぱり自分の作ったアプリが元気に動いていると嬉しいものですね。今回はPythonで実装したアプリ1号だったので、感慨もひとしおです。やっぱりPythonは楽しい!!
あとは、酒井先生の教え通り、Pythonicなコードを書けるように訓練し、コードの可読性・メンテナンス性を徐々に上げていきたいところです。
[st-card id=785 label=”おすすめ” name=”” bgcolor=”” color=”” readmore=”on”]
さいごに
「スクリプト言語は遅い」と言われていますね。しかし、パソコンの基本性能が上がってきている現代では、コンパイル系の言語とPythonの処理スピードにおいて、イライラするほどの差は無いに感じます。(400行ほどのコードでは正しい評価はできませんが)
プログラマーは複数の言語を使えてこそ優秀とされているみたいですが、私としてはできるだけ言語を行ったり来たりするのは避けたいのです。混乱のもとになりますし、ひとつの言語(Python)を極めていきたいと思います。
PythonによるGUIアプリの世間での評価はそれほど高くないようです。しかし、Qtなどのデイザイナー機能が充実してきて、よりGUIアプリが作りやすくなれば、PythonでのGUIアプリ制作もスタンダードになるかもしれませんね。それ前に製造業系のアプリもWeb化が進むんでしょうか。
今は過渡期なんですね。やりたいことに対して色んなアプローチが取れるのは試していて楽しいです。
こちらの記事もおすすめ
PythonでGUIアプリを作る前にまずWebアプリ化できないか考える
コメント
コメント一覧 (2件)
面白い記事をありがとうございます。
おせっかいかもしれませんがpyinstallerではなくnuitkaでexe化したら作るファイルの速度やサイズは大幅に改善すると思いますよ。
他にもcythonやcodonを使えばpythonの実行速度は大幅に改善できると思います。
有益な情報ありがとうございます!!
nuitka、、、聞いたことありませんでしたが、今度試してみます^^
ファイルサイズ減らせるのは魅力ですね