python程序打包exe

380 阅读1分钟

前言

将python程序 xxx.py打包成 xxx.exe,随时随地运行

步骤

一、安装pyinstaller

1、pip install pyinstaller

二、进入虚拟环境进行打包

由于项目一般在虚拟环境下进行开发,所以进入虚拟环境进行打包

1、进入虚拟环境

workon virenv

2、打包指令

pyinstaller -F translation.py -i translate.ico -p D:\projects\pyvirtualenv\translate\Lib\site-packages

参数备注:

translation.py:要打包的python脚本程序 translate.ico:需要使用的程序图标 D:\projects\pyvirtualenv\translate\Lib\site-packages:使用的运行环境

执行以上指令就,将在当前目录生成一个配置文件translation.spec,并在dist目录下生成一个translation.exe。

translation.spec文件很重要,可通过修改该文件,添加需要import的包和资源文件。如图片、有用的文件等资源。

修改此文件后,需要执行指令,将资源再次打包:

pyinstaller xxx.spec

3、xxx.spec

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

block_cipher = None


a = Analysis(['main.py'],
             pathex=['D:\\projects\\pyvirtualenv\\translate\\Lib\\site-packages', 'D:\\projects\\MLTC\\mltc-pa'],
             binaries=[],
             datas=[('dicts','dicts'),('elasticsearch-7.9.1','elasticsearch-7.9.1')],
             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 )

其中资源文件的打包主要修改datas参数,例如

datas=[('dicts','dicts'),('elasticsearch-7.9.1','elasticsearch-7.9.1')],

进行打包后,资源文件的访问方式会有一些不同,需要访问一个临时目录,可使用以下的函数,生成访问路径。可兼容原python程序的路径

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)

在使用时,在代码中修改:

dictDir2 = resource_path('/'.join(('dicts','aa','v.txt')))