趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • Python2.7のプログラムをexe化する

    投稿日 2018年 6月 11日 コメントはありません

    次に、Python2.7で作ったプログラムを配布用にexe化してみます。
    まず、仮想環境を作ります。

    D:\virtual-python>py -2 -m virtualenv py2exe1 --system-site-packages
    New python executable in D:\virtual-python\py2exe1\Scripts\python.exe
    Installing setuptools, pip, wheel...done.
    D:\virtual-python>cd py2exe1
    D:\virtual-python\py2exe1>scripts\activate.bat
    (py2exe1) D:\virtual-python\py2exe1>

    次に、py2exeをインストールします。試しにpipでやってみると、

    (py2exe1) D:\virtual-python\py2exe1>py -2 -m pip install py2exe
    Collecting py2exe
    Downloading https://files.pythonhosted.org/packages/e9/a9/040d38b60bca5b19ff5599a6cbe52b4b9a4fb27986a44fc35f72d9e729e6/py2exe-0.9.2.2.zip (129kB)
    100% |################################| 133kB 2.3MB/s
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\setup.py", line 10, in <module>
    raise RuntimeError("This package requires Python 3.3 or later")
    RuntimeError: This package requires Python 3.3 or later
    
    ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\
    
    (py2exe1) D:\virtual-python\py2exe1>

    ということで、pipでインストールできるpy2exeはpython3.3以降が必要、ということでエラーになります。ですので、sourceforgeから2.7用のインストーラをダウンロードしてきて実行します。インストーラはexe形式のGUIになっていて、デフォルトでは大元のsite-packagesの下にインストールされるようです。

    exeに変換するにはセットアップスクリプトが必要なようですので、まずは以下の内容で作成しました。

    from distutils.core import setup
    import py2exe
        
    option = {
        'compressed' : 1,
        'optimize' : 2,
        'bundle_files' : 1,
    }
    
    setup(
        options = {
            'py2exe' : option ,
        },
        console = [
            {'script' : 'main.py'}
        ],
        zipfile = None,
    )

    今回は、メインのスクリプト(処理が始まるところ)は main.py なので、main.py を指定。bundle_filesに1を指定すると、生成したexeファイルにランタイムdllを含めてくれるので、配布が楽になります。(代わりにサイズが大きくなります)

    自作のログ解析ツールをLOGというサブディレクトリにソースコードを一式置いてexe化してみました。

    (py2exe1) D:\virtual-python\py2exe1>cd LOG
    (py2exe1) D:\virtual-python\py2exe1\LOG>python setup.py py2exe
    running py2exe
    creating D:\virtual-python\py2exe1\LOG\build
     :
     :(途中略)
     :
    copying C:\Python27\DLLs\unicodedata.pyd -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
    *** copy dlls ***
    copying C:\WINDOWS\system32\CRYPT32.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
    copying C:\WINDOWS\system32\python27.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7
    setting sys.winver for 'D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7\python27.dll' to 'py2exe'
    copying C:\Python27\lib\site-packages\py2exe\run.exe -> D:\virtual-python\py2exe1\LOG\dist\main.exe
    Adding python27.dll as resource to D:\virtual-python\py2exe1\LOG\dist\main.exe
    The following modules appear to be missing
    ['ElementC14N', '_scproxy', 'cElementTree', 'distutils.command', 'distutils.command.build_ext', ... ]
    
    *** 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
       SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll
       ole32.dll - C:\WINDOWS\system32\ole32.dll
       ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll
       WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll
       GDI32.dll - C:\WINDOWS\system32\GDI32.dll
       KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll
    
    (py2exe1) D:\virtual-python\py2exe1\LOG>

    それほど時間がかからずに処理が終わり、buildとdistというサブディレクトリができて、distの下にmain.exe という実行ファイルが作成されていました。今回の場合はサイズは6MBほど、できた実行ファイルを実行してみると、特に問題なく動作しました。

    ということで、意外にあっさりexe化に成功しました。


  • Windows10にPython環境を構築

    投稿日 2018年 6月 10日 コメントはありません

    訳あって、Windows10(たまたま32bit版)上でPythonの環境を構築しています。
    で、Python2.7系とPython3系を同時に使いたいのと、Pythonの仮想環境を利用したい(作ったスクリプトを他人に使わせるには必要なパッケージが明確になってないといけない)ので、いろいろ調べながらやってます。

    1.Pythonのインストール

    まず、Python3系をインストーラを使ってインストールします。インストール時には「Add Python to environment variables」のチェックは外しておきます。py.exeに起動するPythonを選ばせるためみたいです。

    次に、Python2系をやはりインストーラを使ってインストールします。インストール時には「Register Extensions」を外します。

    インストールできたかどうかは

    C:\>py -2 -V
    C:\>py -3 -V

    としてそれぞれPython2系、Python3系が起動できているか確認します。

    2.virtualenvのインストール

    Python2系用の仮想環境を作成するvirtualenvをインストールします。

    デフォルトの文字コードがasciiだと失敗するようなので、デフォルトの文字コードを変更します。C:\Python27\Lib\site-packages の下に、sitecustomize.py という名前で以下のファイルを作成します。

    import sys
    sys.setdefaultencoding('cp932')

    作成したら、反映されていることを確認します。

    c:\Python27>py -2
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    次に、pipをバージョンアップします。

    c:\Python27>py -2 -m pip install --upgrade pip
    Collecting pip
    Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 451kB/s
    Installing collected packages: pip
    Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
    Successfully uninstalled pip-9.0.3
    Successfully installed pip-10.0.1
    
    c:\Python27>

    次に、virtualenvをインストールします

    c:\Python27>py -2 -m pip install virtualenv
    Collecting virtualenv
    Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
    100% |################################| 1.9MB 2.2MB/s
    Installing collected packages: virtualenv
    The script virtualenv.exe is installed in 'C:\Python27\Scripts' which is not on PATH.
    Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
    Successfully installed virtualenv-16.0.0
    
    c:\Python27>

    3.virtualenvを使ってみる

    早速Python2.7の仮想環境を作ってみます。

    D:\>mkdir virtual-python
    D:\>cd virtual-python
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    :
    :(中略)
    :
    File "D:\virtual-python\testenv\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 7: ordinal not in range(128)
    ----------------------------------------
    :
    :(中略)
    :
    OSError: Command D:\virtual-python\testenv\Scripts\python.exe - setuptools pip wheel failed with error code 2
    D:\virtual-python>

    ということで、エラーになってしまいます。で、エラーの原因はまた「UnicodeDecodeError」です。
    原因は、どっかにあるvirtualenv.pyの中で文字コードがascii決め打ちになっているsite.pyを仮想環境の中に展開して、それを使ってしまうために起きているように見えます。
    いろいろやってみると、virtualenvを再実行しても一旦ディレクトリを消したりはしないようですので、これを逆手にとって、一度実行してエラーになってから、sitecustomize.py をコピーしてやるととりあえず最後まで処理が進むようです。
    具体的には、上記の例の場合、エラーになってから、sitecustomize.py をコピーしてきてから再度 virtualenv を起動します。(注:そんなことをしなくてもいい方法がありました・・・後のほうに書いてあります

    D:\virtual-python>copy C:\Python27\Lib\site-packages\sitecustomize.py d:\virtual-python\testenv\Lib\site-packages\.
    1 個のファイルをコピーしました。
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    Installing setuptools, pip, wheel...done.

    ということで、旨くいきました。仮想環境への移行も

    D:\virtual-python>cd testenv
    D:\virtual-python\testenv>Scripts\activate.bat
    (testenv) D:\virtual-python\testenv>python -V
    Python 2.7.15
    (testenv) D:\virtual-python\testenv>
    

    でうまくいくようです。
    この上で、scriptsフォルダの下にあるactivate.batを動かして仮想環境に移行後、python2用に作成したスクリプトを動かしてみましたが、無事に動作しました。

    直後に追記)
    こんな回りくどいことをしなくても、–system-site-packages と付ければOKのようです。
    (下記1行目がその例です)

    D:\virtual-python>py -2 -m virtualenv testenv2 --system-site-packages
    New python executable in D:\virtual-python\testenv2\Scripts\python.exe
    Installing setuptools, pip, wheel...done.
    D:\virtual-python>cd testenv2
    D:\virtual-python\testenv2>Scripts\activate.bat
    (testenv2) D:\virtual-python\testenv2>python -V
    Python 2.7.15
    (testenv2) D:\virtual-python\testenv2>python
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    4.venvを使ってみる

    Python3系用の仮想環境のvenvを使ってみます。こちらはpython3系には標準で入っているので簡単です。使い方はvirtualenvとほぼ同じ。

    D:\>cd virtual-python
    D:\virtual-python>py -3 -m venv testenv3
    D:\virtual-python>cd testenv3
    D:\virtual-python\testenv3>Scripts\activate.bat
    (testenv3) D:\virtual-python\testenv3>python -V
    Python 3.6.5
    (testenv3) D:\virtual-python\testenv3>

    でPython3系が動くことが確認できました。