使用pyinstaller打包.py文件生成.exe文件

相信很多小伙伴在自己写完了一个py程序,特别是GUI(Graphical Uesr Interface --图形用户接口),写完之后就是特别有成就感,就想把这种喜悦分享给别人,这个时候有两种选择
1.直接把源代码复制粘贴给对方发过去,让对方直接用pycharm来打开你发过来的py文件,这样就可以在对方的电脑上运行你的程序了。
这种方法的优点:简单粗暴。
缺点就是:
1.装B的B格不够高,对方获得了你的py源程序的话,接收方会理所当然的觉得好像自己也行(就好像你告诉了某个人正确的答案后,然后问ta选哪个,显然对方就可以轻而易举说出答案),这样对方就会觉得你just so so.
2.另一种缺点或者说是问题就是说,如果你的源程序中使用图片,文档,或者其他ico图标之类,这个时候你直接给对方发送你的源程序是会在对方的电脑中报错的,这是因为你的源程序引用到了这些图片或者文档,而且这个引用路径只会在你的电脑上,不会随着你的源程序而打包,但是由于对方的没有你的文件路径,所以就会报错,这个时候就要跳到下面“黄2”步骤。
如果没有源程序中没有任何本地电脑图片或者文档这个时候直接通过:

pip pyinstaller#下载这个pyinstaller这个打包的库
pyinstaller -F -w -i 图标名.ico  文件名.py
#-F就是说打包成单个.exe文件,如果不写-F的话就会默认为-D,会生成很多个文件,有.dll文件类型,也有其他好多文件类型,反正就是单一的.exe文件
#-w(是小写的w),这个作用就是生成不带DOS窗口的界面,就是我们那个我们用Win+R,输入cmd后生成的黑色窗口。一般为了装B的B格更高,一般都会加上-w,但是如果从开发的角度来说的话,最好就是不要加-w,这是因为在这个黑色窗口上可以展现我们的错误,当然如果你的程序中用了输入输出的函数,比如input(),print()函数的话,这个是必须要加上的,这是因为输入输出的信息要在这个DOS显示。
#-i,就是让生成的文件有图标,如果不加-i 图标名.ico的话,就会直接生成默认的图标,也就是python(蟒蛇图标)
#最后一个文件名.py就是你要打包生成的.exe文件的源程序文件,这里只说只有一个.py源程序的情况,在很多情况下,我们写的.py文件有很多,在这个,py文件利用到另一个.py文件这个时候,可以

```python
import printheart#这里的printheart打印爱心可能是自己写的printheart.py,要在这个程序中使用就可以进行这种操作

但是这里的话,我们只讨论怎么将一个.py文件打包的情况,有多个文件打包的情况就是留个悬念等我下次有时间再来揭晓。
2 适用于你的程序引用了本地的图片或者是文档,这个时候不是简单的:pyinstaller -F -w -i 图标名 文件名.py
,这个时候我们首先要明确的方向点在于,简单的pyinstaller -F -w -i 图标名 文件名.py 并不能把本地的资源给打包到.exe文件中,因此接下来的操作就是说,怎么把本地引用文件打包到.exe文件中,要实现这个功能必须进行一下的操作:
在讲操作之前,我给你们整理了几个必备知识点,不会让大家在后面的解释中迷糊。
*必备知识点一pyinstaller文档中写到,打包后的文件路径名储存在sys._MEIPASS这个临时目录中。简单点说就是打包后的文件绝对路径的值在sys._MEIPASS中。你可能疑问要知道这个有什么用?回到我们最初的目的----要把本地的引用资源映射到.exe文件中,所以sys._MEIPASS这个作用就是建立本地引用文件路径与打包后的文件的一个映射。
*必备知识点二 .exe文件的打开,是先加载资源路径,也就是先加载我们的文件引用路径,然后才是文件的运行。根据这个原理,就是说,当我们把我们的文件发给一个接受者,如果我们没有进行资源的映射的话,这个时候,引用资源加载失败,原因是打开.exe文件首先进行的是引用资源的加载,但是这个时候没有引用资源的映射所以会加载失败,就会出现黑窗一闪而过,如果手速可以的话,此时截个屏,上面可能提示fileerror文件错误,找不到资源路径。
*操作系统的知识,os(Opearating system),sys(system) 在sys中有一个属性叫“frozen”意思就是冻结绑定的意思,我们想进行的操作是建立一个绝对路径的映射,如果这个“frozen”属性存在,那么经过pyinstaller打包后的跨操作平台的绝对路径就是sys_MEIPASS,如果这个“frozen”属性不存在的话,那么这个经过pyinstaller打包后的跨操作平台的绝对路径就是os.path.abspath(".")
**如何获取这个“frozen”属性 利用Python中的getattr(object,attr,default)函数,这里object是判断的对象,attr是判断对象是否有这个属性,这个default就是如果这个对象不具有这个属性就返回的值,是布尔类型。
*pyinstaller中有一个pyi-makespec库可以制作spec(配置说明书)文件在这个spec文件中有,有一个叫做datas[],里面存储着各种的引用资源文件,以元组形式datas[(项目路径下的资源文件,打包后的储存这个资源的文件名)],这里涉及到了项目文件,所以建议各位,现在自己的python项目路径下新建一个文件夹,取一个你喜欢的名字,然后把所有的资源都拖到里面,这是一个规范,为以后开发提供很多方便。
好了,到这其实就已经完成了,接下来,我直接展示代码和相应的操作图片。
使用pyinstaller打包.py文件生成.exe文件_第1张图片

import os#导入操作系统的模块
import sys#导入系统的模块
def get_resources_path(relative_path):#传入一个相对路径,获取系统的绝对路径所在目录,
    if(getattr(sys,"frozen",False)):
        base_path=sys._MEIPASS#base_path是绝对路径名
    else:
        base_path=os.path.abspath(".")
    return  os.path.join(base_path,relative_path)#完整的文件名是绝对路径目录加上该目录下的文件名
#在有用到路径的地方直接调用这个函数即可

在这里插入图片描述
使用pyinstaller打包.py文件生成.exe文件_第2张图片
使用pyinstaller打包.py文件生成.exe文件_第3张图片
退出,保存,再去pycharm 中运行

pyinstaller -F -w denglu.spec

使用pyinstaller打包.py文件生成.exe文件_第4张图片
在这里插入图片描述
使用pyinstaller打包.py文件生成.exe文件_第5张图片
使用pyinstaller打包.py文件生成.exe文件_第6张图片

你可能感兴趣的:(编程语言基础,tkinter,pyinstaller,python,gui)