python使用pyinstaller将程序打包为exe文件

Posted Wdji3n2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python使用pyinstaller将程序打包为exe文件相关的知识,希望对你有一定的参考价值。

前言:如何将python的.py文件打包为exe文件,以打包单独文件的简单程序和打包基于pygame库编写的多模块程序为例,以及如何处理素材文件使打包后的文件可以正常运行,还有一些总结(仅个人见解)

目录

原生编译器打包程序:

展示文件信息

1.安装pyinstaller

2控制台切换到对应路径(路径必须全英文)

3.打包程序(多文件与单文件)

pyCharm打包程序:

(通过pycharm用pyinstall打包多模块文件,以打包一个pygame写出的游戏为例子)

展示文件信息

1.在terminal-Command prompt下安装pyinstaller

2.导出依赖信息,确保虚拟环境(venv)存在需要的库

3.本地指令行输入安装指令打包为(多文件&单文件)

补充说明:

关于报错:

关于多文件与单文件

多文件形式:

单文件形式:


原生编译器打包程序:

展示文件信息

 

 

1.安装pyinstaller

Win+R,输入cmd打开运行控制台,输入

pip install pyinstaller

2控制台切换到对应路径(路径必须全英文)

cd + 路径(非c盘使用cd/d 盘:\\路径)

3.打包程序(多文件与单文件)

输入pyinstaller,会提示你指令说明

打包为多文件:

Pyinstaller –D 主程序名.py

(最后显示successfully说明打包成功) 

 (蓝线标识的文件夹是打包的配置文件,下次打包时需要删除这两个文件,dist是打包好的程序)

打包为单文件:

Pyinstaller –F 主程序名.py

打包好的程序放在当前文件夹dist内

 

pyCharm打包程序:

(通过pycharm用pyinstall打包多模块文件,以打包一个pygame写出的游戏为例子)

展示文件信息

1.在terminal-Command prompt下安装pyinstaller

2.导出依赖信息,确保虚拟环境(venv)存在需要的库

关于解决外部导入的库的问题,只要对应的虚拟环境内存在需要的库,就可以导出;

pycharm可以将对应导入的库放到同级目录venv文件夹内,即虚拟环境,在本地模式下可以打包程序不用单独指定路径,我们可以单独导出需要的环境依赖为文本,

在本地模式下

pip freeze > reqirements.txt

然后在需要的虚拟环境下再安装环境依赖(用于不同系统)

pip install -r reqirements.txt

确保当前虚拟环境下有对应的依赖后就可以打包程序了

3.本地指令行输入安装指令打包为(多文件&单文件)

输入pyinstaller,会提示你指令说明

打包为多文件(在terminal  >  Command prompt窗口输入指令):

pyinstaller –D 主程序名.py

 

 (successfully显示打包成功)

打包后的文件不包含素材,此时运行会闪退,需要将素材拖到同级文件夹下

 导入素材以后就可以直接运行exe了

打包为单文件同上:pyinstaller –F 主程序名.py

(无论单文件还是多文件打包,都无法把素材文件打包到exe内,所以仍然需要将素材放到同级文件夹内)

补充说明:

如果用pycharm打包简单程序同原生编译器,在terminal-Command prompt窗口下输入控制台指令,安装到当前venv环境内就可以导出了

我们的程序往往不仅仅由一个文件构成,可能会包含一些依赖与素材文件,可能是图片或者音频等,我们主要关注的是主程序的代码中是否调用了这些对应的模块,或者主程序调用的模块是否调用了其他的模块,只要在主程序中调用了的模块在打包的时候会一并导入exe文件,但是如果你创建了一个模块,但是没有在主程序中被调用或者在其他模块中被调用,那么这个模块是不会导入exe文件中的。

关于素材文件,音频以及图片素材调用自外部时无法把程序封装到exe文件里,所以无论是打包为多文件还是单文件都需要把程序的素材放到同级文件夹内,这个时候你就会发现exe文件可以正确运行了

关于报错:

如果程序本身存在问题,那么打包后的程序会在打开后遇到错误时直接退出

退出的原因可能有(目前笔者我遇到的):

1.本身程序就存在问题,打包前没有解决

2.对应素材或者环境缺失

可能还会有各种各样的原因,这两项只是我自己遇到的,关于更多细节可以去官网查看pyinstaller的说明

(http://www.pyinstaller.org/)

关于多文件与单文件

多文件形式:

程序打包后保存为包含依赖等其他文件的多个文件,用打包时指定的.py命名的exe文件启动程序,当程序运行时,程序产生的临时文件以及运行的路径会在当前文件夹而不会使用临时文件夹

单文件形式:

程序打包后保存为单个打包时指定的.py命名的exe文件,当程序运行时,程序产生的临时文件会使用临时文件夹存放临时文件以及解包其他文件并以临时文件夹为指定路径

(个人见解,可能描述与说明不是很准确,如果出现错误希望广大读者们可以指正)

python打包程序:使用pyinstaller将pygame的游戏项目转换为exe文件

背景介绍:

临近期末,python课程要求写一个python的程序,找了以下github发现小游戏挺多的,自己比较感兴趣改写了小游戏,写完之后想给别人玩,但是除了计算机专业很少人会安装python的运行环境,于是自己想着如何打包给别人玩。最后打包成功,但是走过很多坑,所以写下本博客。


那么废话不多说我们开始吧。

1.安装pyinstaller

第一步就是安装打包程序pyinstaller
官方网站:https://pyinstaller.readthedocs.io/en/stable/

1.1方法一:使用cmd安装

打开cmd
使用 pip install pyinstaller
如果你比较幸运就会安装成功(但是一般都会出现问题)

1.1.1 问题:升级pip

一般可能会出现下面的情况 “升级pip”

我们可以根据要求升级
使用:python -m pip install --upgrade pip
如果幸运成功,但又可能出现下面的情况

那么我们又使用: python -m pip install --user --upgrade pip
最后再进行安装
如果出现下面的情况 那么就是安装成功

如果确实不行,那么可以使用方法二进行安装,拒绝花里胡哨!
(因为每个电脑不同,出现情况也不同,我自己电脑可以,但是我同学的电脑 没弄出来)

1.2 方法二:使用pycharm直接安装pyinstaller

点击左上角 文件->设置->项目->python解释器->+号 然后直接输入pyinstaller 点击安装软件包即可
(切记安装包时,不要开翻墙的软件)

当然也可能要升级pip,你可以直接在可视化界面操作,也比较简单。

2.安装UPX

安装pyinstaller我们就可以进行打包了
如果不出意外点击运行会出现下面的问题,这样是不能打包成功的。

这样我们可以取官网https://upx.github.io/去下载

这是在github中下载,如果没有翻墙软件会比较慢

下载然后解压 找到upx.exe文件 然后复制到pyinstaller.exe的目录下即可。

2.1问题:如何找到正确的位置

当然如果下载了UPX可能找不到正确的位置。
如何找可能需要自己寻找,因为每台电脑路径都不一样,文件夹可能也不同。
但是如果出现下面的错误也会出错
那就是找到了python3.8里面去了,确定自己的版本(同学电脑会比较多问题,自己的一下就找到了)

3进行程序打包

3.1对数据文件打包

首先在源文件的位置打开cmd,当然你也可以在pycharm中打开终端

然后输入自己的入口文件 进行

运行就会出现这些目录,其中dist中就会出现打包的exe文件。
main.spec相当于打包的配置文件,我们稍后会进行配置。

点击打开main.spec
想要看spec的每个参数的情况可以看
https://blog.csdn.net/m0_50028034/article/details/108240698

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


block_cipher = None


a = Analysis(['main.py'],
             pathex=[],
             binaries=[],
             datas=[],
             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,
          a.binaries,
          a.zipfiles,
          a.datas,  
          [],
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None )

然后将其修改为

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


block_cipher = None


a = Analysis(['main.py','bulletClass.py','enemyTank.py','food.py','game_loader.py','map_loader.py','maps.py','myTank.py','special_effects.py','wall.py'],
             pathex=['E:\\TankWar\\MyTankWar\\src'],
             binaries=[],
             datas=[],
             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,
          a.binaries,
          a.zipfiles,
          a.datas,  
          [],
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None )

然后再运行这个spec即可。

这样就打包完成了,但是还差最后一步 那就是资源的放置。

3.2资源放置问题

3.2.1错误的放置

如果我们是这样的架构,运行文件和图片、音乐等资源文件不在同一个文件夹,那么打包的exe文件相当于main的位置,那么就会出现资源文件要相对放。(因为自己也没了解资源的打包)

那么就会这样,dist文件中装的是exe文件,但资源文件要放在外面,这样只能将这三个文件夹一起压缩发给好友。

如果我们是源文件和资源文件放在一个文件夹下,那么我们可以如下面的方式

然后将下面文件夹压缩发人即可了。

因为第一次接触,时间仓促也没很了解所有的原理,所以希望对你们有帮助

以上是关于python使用pyinstaller将程序打包为exe文件的主要内容,如果未能解决你的问题,请参考以下文章

将Python程序打包为exe方法

python 使用PyInstaller将程序打包

python打包程序:使用pyinstaller将pygame的游戏项目转换为exe文件

2020-05-23 pyinstaller 打包python项目为exe

2020-05-23 pyinstaller 打包python项目为exe

如何使用pyinstaller打包python文件为exe文件