windows下将整个python工程编译成单个EXE或者单个目录带EXE文件。python编译成EXE文件后,可以独立使用。亲测,一个复杂的python工程包含多个包多个模块,可以生成exe文件。
目的
工具
PyInstaller(windows,源代码python3.6)
步骤
项目根目录下新建frozen_dir.py
冻结路径(防止编译成exe后相对路径找不到)# -*- coding: utf-8 -*-
import sys
import os
# 冻结路径,所有路径以此为基准,打包后才能使用
def app_path():
"""Returns the base application path."""
if hasattr(sys, 'frozen'):
# Handles PyInstaller
return os.path.dirname(sys.executable).replace("", "/")
return os.path.dirname(__file__).replace("", "/")
路径引用import frozen_dir
root_path = frozen_dir.app_path()
path = os.path.join(root_path, default_path)
根目录下新建入口文件main.pyfrom test import main
if __name__ == '__main__':
main()
根目录下新建编译文件build.py# -*- coding: utf-8 -*-
import PyInstaller.__main__
import frozen_dir
SETUP_PATH = frozen_dir.app_path()
def build():
PyInstaller.__main__.run([
'--name=%s' % "main", # 生成的exe文件名
['--onedir', '--onefile'][0], # 单个目录 or 单个文件
'--noconfirm', # Replace output directory without asking for confimation
['--windowed', '--console'][1],
'--add-binary=./python3.dll;.', # 外部的包引入
'--add-binary=%s' % SETUP_PATH + '/config/logging.yaml;config', # 配置项
'--add-data=%s' % SETUP_PATH + '/config/config.ini;config', # 分号隔开,前面是添加路径,后面是添加到哪个目录
'--hidden-import=%s' % 'sqlalchemy.ext.baked',
'--hidden-import=%s' % 'frozen_dir', # 手动添加包,用于处理 module not found
'main.py', # 入口文件
])
if __name__ == '__main__':
build()
运行build文件,根目录下dist/main/main.exe 为可执行文件,双击可运行。运行闪退的话,可以cmd进入到相关路径运行main.exe,缺失的包在build.py文件中添加hidden-imports项。