torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

Python、py2exeで実行可能ファイルにする

Python py2exe
約475日前 2015年11月2日18:20
py2exeの簡単な使い方メモです

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



使い方は
python setup.py py2exe


main.pyには任意のファイル名を入れます
なんかうまくいかねえってなったらbundle_filesをとりあえず2にしましょう
(ランタイムdllを含めるか含めないか)

GUIなんかのときは、コンソール画面は必要ないですね
そんなときはconsoleをwindowsに書き直します。以下のように
    windows = [
    {"script"  :  "main.py"}
  ],



__file__がある場合、py2exeはエラーとなります
例えば以下のコードです
BASE_DIR = os.path.dirname(os.path.abspath(__file__))


その場合は、こうします
try:
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
except:
    import sys
    BASE_DIR = os.path.dirname(os.path.abspath(sys.argv[0]))


multiprocessingを使う際も、気をつけましょう
以下のコードはexe化は正常に行われますが、実行するとえらいことになりました。
from multiprocessing import Process


def print_worker(num):
    print(num)


def main():
    process = [Process(
        target=print_worker, args=(num,), daemon=True
    ) for num in range(10)]
    for worker in process:
        worker.start()
    for worker in process:
        worker.join()

if __name__ == "__main__":
    main()



以下のようにします
freeze_support()を呼び出すだけです
from multiprocessing import Process, freeze_support


def print_worker(num):
    print(num)


def main():
    freeze_support()
    process = [Process(
        target=print_worker, args=(num,), daemon=True
    ) for num in range(10)]
    for worker in process:
        worker.start()
    for worker in process:
        worker.join()

if __name__ == "__main__":
    main()