mieki256's diary



2016/11/29(火) [n年前の日記]

#1 [python] Pythonスクリプトをexe化

Windows + Pythonの環境で、Pythonスクリプト(PySideを使ったスクリプト)をexe化したいなと。

exe化する方法はいくつかあるようで。
_Packaging PySide applications on Windows - Qt Wiki

一番簡単なのは Pyinstaller らしいけど、exe化したソレの起動が遅いという話を見かけて。なので今回は、設定ファイルを書かないといけない代わりに起動が比較的速いと評されてる py2exe を試してみたり。

ただ、この py2exe、Python 2.7 までしか対応してないらしい。自分の手元の環境では Python 2.7 を使ってるからいいけれど、もし Python 3.x を使ってる場合は別の選択肢を選ぶことになるのだろうなと。

py2exeのインストール。 :

_py2exe は、 _py2exe - Browse /py2exe/0.6.9 at SourceForge.net からダウンロード。py2exe-0.6.9.win32-py2.7.exe を入手。

実行すると、Python 2.7インストールフォルダ\Lib\site-packages\py2exe\ のあたりにインストール、してくれたのかな。たぶん。

設定ファイル setup.cy を書く。 :

以下のページを参考にして記述。

_py2exeモジュールについて ・ PythonMatrixJp
_exe変換(py2exe) - Python入門から応用までの学習サイト
_py2exeでPythonのスクリプトを実行ファイル(exe)にする【py2exe】 - ぴよぴよ.py
_[Python] pyInstallerの遅さにがっかりしてpy2exeにしたら爆速で驚いた件 ・ Nobwak's Lair
_py2exe のハマりどころメモ - プログラマのネタ帳
_Pythonでプログラムを作るときのTips - つかさのほえほえ日記
_PyQt でクロスプラットフォームなデスクトップアプリケーションを | Kosei Kitahara's Blog
_PyQt を py2exe でフリージング | Kosei Kitahara's Blog

今回は PySide を使ってるので、以下のように書いてみた。
# -*- coding: utf-8 -*-
"""py2exe config."""

import sys
import os

if sys.platform == "win32":
    # Windows
    import py2exe
    from distutils.core import setup

    IMAGELIB_DIR = r"D:\Python\Python27\Lib\site-packages\PySide\plugins\imageformats"
    imgfiles = [os.path.join(IMAGELIB_DIR, i) for i in [
        "qgif4.dll",
        "qgifd4.dll",
        "qico4.dll",
        "qicod4.dll",
        "qjpeg4.dll",
        "qjpegd4.dll",
        "qmng4.dll",
        "qmngd4.dll",
        "qsvg4.dll",
        "qsvgd4.dll",
        "qtga4.dll",
        "qtgad4.dll",
        "qtiff4.dll",
        "qtiffd4.dll",
    ]]

    data_files = [("imageformats", imgfiles)]

    py2exe_options = {
        "compressed": 1,
        "optimize": 2,
        "bundle_files": 3
    }

    setup(
        data_files=data_files,
        options={"py2exe": py2exe_options},
        # console = [
        windows=[
            {"script": "stampixelart.py"}
        ],
        zipfile="lib/libs.zip"
    )

if sys.platform == 'darwin':
    # OS X
    pass

if sys.platform == 'linux2':
    # Linux
    pass

IMAGELIB_DIR のあたりは自分の環境に合わせて書き換える必要有。もしかすると setup.cfg なるものを書いてこのへん設定すべき、なのかもしれないけれどサンプルが見つからなくて…。

PySide の標準状態では扱える画像フォーマットがそれほど多くないので、plugins を使って svgその他に対応してるらしいのだけど。py2exe はそのあたりイイ感じにしてくれない。よって、必要になりそうな dll を imgfiles のあたりで全部列挙して data_files で渡してやって「コレもコピーしといてくれよな」と py2exe に指示してる、のだと思う。

py2exe に渡すオプションとしては compressed、optimize、bundle_files 等があるようだけど。"bundle_files" : 3 にすると、1つの exeファイルにアレもコレも入れるのではなく、各ファイルをバラバラにしておいてくれるらしいので、そのように。というのも、PySide ってライセンスがLGPLだったから、それぞれ個別のファイルになってないとマズいのかなと思ったわけで。それと、3 を指定しないとそもそもウチでは動かない、という話もチラホラ見かけたし。

setup() の個所で、console = [ ] と書けばコンソールアプリとして、windows=[ ] と書けばGUIアプリとして扱ってくれるらしい。

zipfile=None という記述もあちこで見かけたけど、手元の環境でソレをしたらエラーが出てしまった。仕方ないのでファイル名を指定。

exe化を実行。 :

python setup.py py2exe と打てば、buildフォルダとdistフォルダが作られて、distフォルダの中にexe化されたソレが出来上がる。

distフォルダの中には、動作に必要な他のファイルも色々入ってるので、他の環境に渡す際はdistフォルダごと渡す、ものらしい。

py2exeは、exe化が終わると、最後に、「〜.dllも動作に必要なんだけどライセンスの問題で同梱するわけにはいかないのでそのあたりはそっちでどうにかしてくれよな」的に、ずらずらとdllの一覧を表示してくれる。今回、Windows10 x64 上で動かしたら、以下の一覧が出力された。

*** binary dependencies ***
Your executable(s) also depend on these dlls which are not included,
you may or may not need to distribute them.

Make sure you have the license if you distribute any of them, and
make sure you don't distribute files belonging to the operating system.

   OLEAUT32.dll - C:\WINDOWS\system32\OLEAUT32.dll
   USER32.dll - C:\WINDOWS\system32\USER32.dll
   IMM32.dll - C:\WINDOWS\system32\IMM32.dll
   SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll
   ole32.dll - C:\WINDOWS\system32\ole32.dll
   MSVCP90.dll - C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86\MSVCP90.dll
   WINMM.dll - C:\WINDOWS\system32\WINMM.dll
   COMDLG32.dll - C:\WINDOWS\system32\COMDLG32.dll
   ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll
   WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll
   WINSPOOL.DRV - C:\WINDOWS\system32\WINSPOOL.DRV
   GDI32.dll - C:\WINDOWS\system32\GDI32.dll
   VERSION.dll - C:\WINDOWS\system32\VERSION.dll
   KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll

C:WINDOWS\system32\以下のファイルは、Windows環境ならたぶん入ってるんだろうと想像できるけど。MSVCP90.dll てのが…。

MSVCP90.dll は、Microsoft Visual C++ 2008 再頒布可能パッケージ (x86)、に入ってるらしい、が…。

_Microsoft Visual C++ 2008 再頒布可能パッケージ - 窓の杜ライブラリ

コレ、インストールしようとすると、一番容量が大きいHDDのルートフォルダに謎ファイルをばら撒くんだよな…。

更に。 _Using py2exe the right way | Python Tips によると、「コレをインストールしてみたんだけど相変わらず 『見つからねえぞ』って言われて、HDDの中を検索してたまたま見つかったヤツをアプリのフォルダにコピーしたら動いた」みたいな話もあるようで。

このあたり、結局どうすればいいのか、さっぱり分からず。

#2 [python][ubuntu][linux] PySideを使ったスクリプトをUbuntu Linux上で動かしてみたり

今まで、Windows10 x64上で、Python 2.7.12 + PySide 1.2.4 + Pillow 3.4.2 を使ったスクリプトを動かしていたけど。コレをLinux上で動かせるのか気になってきたので試してみたり。

仮想PCソフト、VMware Workstation Player を使って、Ubuntu Linux 16.04 LTS を起動。

端末を開いて、python --version と打ってみたら、2.7.12 と表示された。Python 2.7 はインストールされてるらしい。

PySide のインストールは、 _PySide Binaries Linux - Qt Wiki で解説、されてるのかな。たぶん。件のページでは、apt のリポジトリを追加するように書いてあるけど、どうやら Ubuntu 16.04 LTS では標準でも PySide関連が用意されているようで。以下を打つだけで、PySide がインストールできたっぽい。
sudo apt-get install python-pyside
1.2.2-2build2 がインストールされた。最新版ではない、な…。 _PySide 1.2.4 : Python Package Index を眺めた感じでは、2年ほど放置されている模様。でもまあ、動けばいいか…。

Pillow(PIL)もインストールする。これは pip でインストールできた。と思う。たぶん。
sudo pip install Pillow
3.4.2 がインストールされた。これは最新版だな…。

VMwareの共有フォルダ機能を利用して、WindowsからPythonスクリプトをコピーしてきて、Ubuntu上で実行。

あっさり動いた。素晴らしい。

メニュー上でsvgファイルを使ったアイコンが表示されてない気もするけど…。PySideのバージョンが古いせいだろうか。

_PySide 1.2.4 : Python Package Index を眺めると、「Linux用のバイナリは用意してないから自分でビルドしろよな」と書いてある。 _Building PySide on a Linux System (Ubuntu 12.04 - 14.04) ・ PySide 1.2.4 documentation で、ビルドの仕方が説明してある。

最新版を使いたければ自分でビルド、そこまでしたくないし古い版でもOKだぜって時は apt-get でインストール、ということでいいのかな…。

ビルドしてみた。 :

_Building PySide on a Linux System (Ubuntu 12.04 - 14.04) ・ PySide 1.2.4 documentation に従って、VMware + Ubuntu 16.04 LTS 上で PySide をビルドしてみたり。

まずは必要なパッケージを sudo apt-get でインストールしていくのだけど。qtmobility-dev が無いな…。どうやら Ubuntu 16.04 LTS では qtmobility-dev は無くなったらしい。 _qtmobility-dev missing package on Ubuntu 16.04 - Issue #67 - pyside/pyside-setup でも報告が。とりあえず、qtmobility-dev 以外をインストールして先に進んだり。

2時間ほどかかって、他の作業は一応進んだ、ように見えた。distディレクトリに PySide-1.2.4-cp27-cp27mu-linux_x86_64.whl が生成されている。sudo pip install dost/PySide-1.2.4-cp27-cp27mu-linux_x86_64.whl で試しにインストール。

$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide
>>> PySide.__version__
'1.2.4'
PySide 1.2.4 がインストールできたっぽい。

ちなみに、この状態でPySideを使ったスクリプトを動かしてみたけど、メニューにアイコンは出てこなかった。Windows版とLinux版ではそのあたりの動作が違うのかもしれず。

簡単にインストールできるスクリプトもあるっぽい。 :


以上、1 日分です。

過去ログ表示

Prev - 2016/11 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project