Pyinstaller打包文件

、安装及基本操作

Pyinstaller可以使用pip安装,在命令行下输入下面这行就可以了。

pip install pyinstaller

如果下载安装包,那么要注意下载相应的win32/64版本,建议所有的程序都统一成32位或是64位版本,这样会减少很多问题。

安装完毕之后,就可以通过以下命令打包了

先转到主脚本所在的地址,例如:

cd C:UsersAdministratorprojects	omato

然后执行如下命令:

pyinstaller start.py -F

其中start.py为主脚本,主脚本中调用的模块文件会被自动打包。第三个参数是操作命令,常用的命令有

-F 打包成单个文件
-D 打包成单个文件夹形式
 
-c 控制台模式,执行程序会跳出控制台,
-w 窗口模式,不会跳出控制台 

基础的命令就这些,程序名和图标等建议在spec文件中设置。

二、文件调用(音频,图片等)

一开始打包时便不清楚文件调用问题,因此文件一旦移动到别处就没法正常调用。后来看到别人的教程,但这部分也是模棱两可,让人理解不了。后来结合官方文档和别人的教程,终于弄清楚了。

首先在脚本定义一个读取相对路径的函数:

复制代码
 1 Import os
 2 Import sys
 3  
 4 def resource_path(relative_path):
 5     """
 6     定义一个读取相对路径的函数
 7       """
 8     if hasattr(sys, "_MEIPASS"):
 9         base_path = sys._MEIPASS
10     else:
11         base_path = os.path.abspath(".")
12     return os.path.join(base_path, relative_path)
复制代码

然后在需要调用文件的地方用如下格式包裹:

resource_path('resources/complete.wav')

然后在生成的.spec文件exe = EXE()中加入下面这行:

[('resources/complete.wav',r'C:UsersAdministrator
esourcescomplete.wav','music'),],

元组内的三个项:

第一个为代码中resource_path包裹的地址;

第二个是文件的实际地址;

第三个是打包进程序的文件名字。

这样打包后文件会被正确引用。

如下所示:

复制代码
 1 exe = EXE(pyz,
 2           a.scripts,
 3           a.binaries,
 4           a.zipfiles,
 5           a.datas,
 6           [('resources/complete.wav',r'C:UsersAdministratorprojectsDiary
esourcescomplete.wav','music'),],
 7           name='Diary',  # 这里可以设置可执行文件的名字
 8           icon='diary.ico',# 设置图标
 9           debug=False,
10           strip=None,
11           upx=True,
12           console=True ) # 是否开启控制台模式
复制代码

注意加地址前的r以及行尾的逗号,更新过spec文件后,再重新打包只需要执行pyinstaller start.spec 就可以了。

三、添加图标

图标的设置有两种方式,一种是在执行打包命令时加入下面这句:

--icon=xxx.ico

第二种(推荐)是用文本编辑器或记事本打开执行打包后文件夹内新生成的xxx.spec文件,然后在exe =()中加入一行:

icon = ’xxx.ico‘

(见上面的代码第八行)

xxx.ico 为你要设置的图标文件,其他格式需要转换成ico格式,可在这里在线转换。

(图标文件要放在程序根目录下)

四、其他

  1. 64windows上打包的程序不能在32位上运行,反之却可以。
  2. 每次更改完代码或是spec文件,只需要再重新执行一下pyinsyaller start.spec -F就可以了

五、替代品

如果pyinstaller没有解决你的问题,那么你可以尝试一下下面这两个替代品:

py2exe

cx_Freeze

原文地址:https://www.cnblogs.com/Mike2019/p/13359056.html