![]() |
ノート/PythonアプリのWin上でのexe化2017-01-01http://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FPython%A5%A2%A5%D7%A5%EA%A4%CEWin%BE%E5%A4%C7%A4%CEexe%B2%BD2017-01-01 |
![]() |
ノート/ノート
4961 2017-01-06 (金) 17:53:26
Pythonアプリを(Pythonインタープリタを持っていない)Windows上で動かすために、パッケージ化をすることになるのだが、いくつかの仕組がある。
いろいろな人がいろいろ言っていて、よくわからないのだが、cx_Freezeはいろいろ試してみると、どうも指定はいろいろできるが、使い慣れないとうまくいかないみたいだ。
他方、PyInstallerはほとんど何もしなくてよいので便利だが、その分自由度がないのと、もしかすると環境のバージョンに依存して動かなくなることがあるのかもしれない。
裸よりは、Anacondaが楽なようだ。今だとAnaconda3でPython3をインストールしてしまうことになる。
Anaconda で Python 環境をインストールする に従うと、Anacondaのダウンロードページ https://www.continuum.io/downloads から(今だとPython3.5を選んで)インストール。3.6は出たてなので、いろいろと足りないものがある。
anacondaに入っているみたい。いろいろ入れてみたけれど、anacondaインストール直後で使えた。
Windowsアプリの場合はコンソールを介したくない(アイコンをダブルクリックして終わり)という感覚があるので、どうしてもGUIを作りこむ必要がある。PythonでGUIを何にするかも大きな決断だが、割とよく見かけるQtを使ってみる。Qtのバージョンも4がいいのか新しい5がいいのか? ネットを検索すると古いサンプルが多いのだが、まあ新しいバージョンにしておこう。どうしてアッパーコンパチにならないのか?
何もしないウィンドウ
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == '__main__': app = QApplication(sys.argv) w = QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())
入力を受け取って階乗を計算するプログラム
#!/usr/bin/env python from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton) def factorial(n): if n < 0: return -1 elif n == 0: return 1 else: return n * factorial(n-1) class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.inputLine = QLineEdit() self.outputLine = QLineEdit() self.outputLine.setReadOnly(True) self.calcButton = QPushButton("&Calc") self.calcButton.clicked.connect(self.calc) lineLayout = QGridLayout() lineLayout.addWidget(QLabel("num"), 0, 0) lineLayout.addWidget(self.inputLine, 0, 1) lineLayout.addWidget(QLabel("result"), 1, 0) lineLayout.addWidget(self.outputLine, 1, 1) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.calcButton) mainLayout = QHBoxLayout() mainLayout.addLayout(lineLayout) mainLayout.addLayout(buttonLayout) self.setLayout(mainLayout) self.setWindowTitle("Factorial") def calc(self): n = int(self.inputLine.text()) r = factorial(n) self.outputLine.setText(str(r)) if __name__ == '__main__': import sys app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_())
pipで簡単にインストールできる。
pip install pyinstaller
pyinstaller -F --noconsole myfact.py
結果として、ディレクトリdistの下に
2017/01/02 14:32 28,955,732 myfact.exe
ができた。Pythonの実行環境とQtの環境を全部パッケージしているので、29MBと、かなり大きい。
漢字も問題なく使えるようだが、Windows上でShift-JISで漢字文字列定数を入れると怒られる。エディタでUTF-8でストアするようにしておけば、大丈夫だった。
サンプル集
UI作成ツールについて
Windows下でAnaconda3を入れた環境で、(HOME)\Anaconda3\Library\bin\designer.exeを起動すればよいらしい。 パスが通っているらしいので、コマンドプロンプトで単にdesingerとすればよかった。
古いけれどこんなのもあった。