Python虚拟环境下使用Pyinstaller打包

Posted 浩浩学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python虚拟环境下使用Pyinstaller打包相关的知识,希望对你有一定的参考价值。

PyInstaller ,他是一款帮助我们把整个项目完整打包的工具。目前已经兼容Py3.7,以及 Mac App 和 Windows Exe

由于在进行Pyinstaller打包时,会一同将Pyinstaller所在环境里所有的package一起打进去,这就导致了非常多曾经下载过的,但是在这个项目中没用到的package,也会成为程序的一部分,大大增加了整个文件的大小。例如说,我这个项目其实并没有用到pandas和numpy,但是这两个项目却占了我两百多MB的资源,非常不值得。

这里有一点很关键!不能忘记!Pyinstaller 也是第三方的包,所以新的环境里面一定一定要 pip install Pyinstaller!
虚拟环境的安装请参考:https://www.cnblogs.com/hhaostudy/p/17321646.html

1.虚拟环境安装pyinstaller

 pip install pyinstaller

2.pyi-makespec -w xxx.py 生成spec文件,其中xxx.py是运行时程序的入口py文件。-w不打开console,-c打开console

pyi-makespec -c app.py

执行成功后会自己生成一个spec的文件

3.修改配置文件

# -*- mode: python ; coding: utf-8 -*-
\'\'\'
在打包导入某些模块时,常会出现"RecursionError: maximum recursion depth exceeded"的错误,
这可能是打包时出现了大量的递归超出了python预设的递归深度。
因此需要在spec文件上添加递归深度的设置,
设置一个足够大的值来保证打包的进行,即
\'\'\'
block_cipher = None


a = Analysis(
    [\'app.py\'],
    pathex=[""D:\\\\PythonObjects\\\\HTML&CSS\\\\flask_bootstrap_table"],
    binaries=[],
    datas=[("D:\\\\PythonObjects\\\\HTML&CSS\\\\flask_bootstrap_table\\\\data","data"),
    ("D:\\\\PythonObjects\\\\HTML&CSS\\\\flask_bootstrap_table\\\\data\\\\config.yaml",".")],
    hiddenimports=[],
    hookspath=[],
    hooksconfig=,
    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,
    [],
    exclude_binaries=True,
    name=\'app\',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True, #是否打开黑窗口 true 打开
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon = \'D:\\\\intership\\\\generalExcel2Db\\\\images\\\\logo.ico\' #exe文件的logo
)
coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name=\'app\',
)

这其实就是一个python文件,只不过后缀是spec罢了。

.spec一共会有4个对象,分别是:Analysis、PYZ、EXE、COLLECT。

Analysis用处最多,一个个解释:

  • 第一个参数,是指定我们整个项目的主程序,也就是我们的入口文件。
  • pathex,就是我们的工作目录
  • datas,存放我们的数据。

好了,说到这里就要好好说一说这个Pyinstaller的工作流程了。当我们双击编译好的exe后,他是会创建一个临时目录,把所有需要用的包都解压到那里,然后执行。执行完毕后,临时文件夹就消失了。

这和我们有什么关系呢?想一下,如果你的项目中需要去读取某些文件,甚至是用户的输入参数,怎么办?打包出来的exe 是没有办法通过直接指定参数,类似:python main.py --input=*.xlsx 来读取文件的,因为我之前说了,在执行的时候会把项目解压到一个临时目录,所以原来项目中写好的相对路径也不管用。

hiddenimports ,继续说下去,PyInstaller有时候无法侦察到全部的依赖包,怎么办?我们可以在这个后面加,把PyInstaller编译出来的exe在运行的时候报的缺少模块给写里面。

4.保存spec文件。在cmd中运行pyinstaller xxx.spec即可生成一个dist文件夹和一个build文件夹,exe文件在dist文件夹中即可直接点击运行。

pyinstaller app.spec

5.双击执行exe程序 可以启动程序

Qt for python pyside2/6 使用 PyInstaller打包项目exe

文章目录

说明

使用PyInstaller打包py脚本生成exe,记住一点,千万不要在全局环境 pip install pyinstaller, 使用 pip list 查看是否安装了,如果安装请立即卸载,卸载命令:

pip uninstall pyinstaller

不然很容易一不小心掉坑,后果自负~

初始化虚拟安装环境

创建虚拟环境的目的是为了保持打包环境的干净,避免引入其他的无关的库,导致包过大,或者打包出来的exe不能运行的问题。

不是必须,但是强烈建议

总共三个命令cmd命令提示符中运行。(最好是管理员模式运行)

创建虚拟环境

该命令会创

以上是关于Python虚拟环境下使用Pyinstaller打包的主要内容,如果未能解决你的问题,请参考以下文章

虚拟环境下通过pyinstaller 打包

虚拟环境下通过pyinstaller 打包

Win 下 创建 Python 虚拟环境

Qt for python pyside2/6 使用 PyInstaller打包项目exe

Qt for python pyside2/6 使用 PyInstaller打包项目exe

用 pyinstaller 打包含xpinyin 库的Python程序