一般的程序打包:

pyinstaller -F main.py

如果包含 html、js 等文件需要特别处理一下。

待打包示例源代码 main.py:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 生成资源文件目录访问路径
def resource_path(relative_path):
    if getattr(sys, 'frozen', False):  # 是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

filename = resource_path(os.path.join("web", "mesh.html"))
# 访问 html 文件用 filename 就可以了
print(filename)

打包文件:

首先生成 spec 文件:

pyi-makespec -F main.py

会生成 main.spec 文件,编辑它:

datas 添加 ('web', 'web'),web 文件夹存放了 html、js 等文件,这个文件夹会被打包进去。

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['main.py'],
             pathex=['E:\\projects\\python\\test'],
             binaries=[],
             datas=[('web', 'web')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

开始打包:

pyinstaller -F main.spec