相信很多小伙伴在自己写完了一个py程序,特别是GUI(Graphical Uesr Interface --图形用户接口),写完之后就是特别有成就感,就想把这种喜悦分享给别人,这个时候有两种选择: 1.直接把源代码复制粘贴给对方发过去,让对方直接用pycharm来打开你发过来的py文件,这样就可以在对方的电脑上运行你的程序了。 这种方法的优点:简单粗暴。 缺点就是: 1.装B的B格不够高,对方获得了你的py源程序的话,接收方会理所当然的觉得好像自己也行(就好像你告诉了某个人正确的答案后,然后问ta选哪个,显然对方就可以轻而易举说出答案),这样对方就会觉得你just so so. 2.另一种缺点或者说是问题就是说,如果你的源程序中使用图片,文档,或者其他ico图标之类,这个时候你直接给对方发送你的源程序是会在对方的电脑中报错的,这是因为你的源程序引用到了这些图片或者文档,而且这个引用路径只会在你的电脑上,不会随着你的源程序而打包,但是由于对方的没有你的文件路径,所以就会报错,这个时候就要跳到下面“黄2”步骤。 如果没有源程序中没有任何本地电脑图片或者文档这个时候直接通过:
pip pyinstaller
pyinstaller -F -w -i 图标名.ico 文件名.py
```python
import printheart
但是这里的话,我们只讨论怎么将一个.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项目路径下新建一个文件夹,取一个你喜欢的名字,然后把所有的资源都拖到里面,这是一个规范,为以后开发提供很多方便。 好了,到这其实就已经完成了,接下来,我直接展示代码和相应的操作图片。
import os
import sys
def get_resources_path(relative_path):
if(getattr(sys,"frozen",False)):
base_path=sys._MEIPASS
else:
base_path=os.path.abspath(".")
return os.path.join(base_path,relative_path)
退出,保存,再去pycharm 中运行
pyinstaller -F -w denglu.spec
|