pyinstaller打包python应用之方法(含打包图片资源)

pyinstaller是python的打包工具,结合我的工程,记录下我的使用过程及经验总结。

1.pyinstaller的简单使用

1.1 打包成一个文件

先cd切换到工程目录下,再执行:

pyinstaller -i study.icns -n exam -w -F main.py

参数说明:
-i: 指定app的图标;
-n: 指定app的名字,默认是主入口的py文件,比如main.py;
-w: 程序运行时不弹出控制台窗口
-F: 生成单个文件(小工程,文件少使用这个即可)

上面语句执行完后,便会在工程根目录上生成:
exam.spec文件,build和dist文件夹。app便在dist文件夹中。

1.2 打包成一个文件夹

-D可以去掉,默认情况下就是打包成文件夹

pyinstaller -w -D main.py

参数说明:
-D: 生成文件夹(大工程,文件多建议使用)

1.3 二次打包

有了spec文件(我的理解是spec文件已记录了打包所需要的相关信息),就不用使用1.1的方法了,可以直接这样:

pyinstaller -y exam.spec

参数说明:
-y: 替换输出目录(默认值:SPECPATH / dist / SPECNAME)而不要求确认.

删除打包生成的文件:

rm -rf build dist

1.4 spec文件

使用前面的方面已经得到了spec文件,当前也可以使用下面方法得到:

pyinstaller options..script.py

正常使用中我们是不需要修改spec文件的,但是下面几种情况需要修改spec文件:

1.需要打包资源文件
2.需要include一些PyInstaller不知道的run-time库
3.为可执行文件添加run-time 选项
4.多程序打包

可以通过下面命令生成spec文件

pyi-makespec options script.py [other scripts ...]

修改完spec文件,就可以通过下面命令来生成app文件了

pyinstaller options script.spec

1.5 spec文件解析

下面是spec文件(我工程的)

# -*- mode: python ; coding: utf-8 -*-
block_cipher = None

a = Analysis(['main.py'],
             pathex=['/Users/wenlong/exam_demo'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             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='exam',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='study.icns')
app = BUNDLE(exe,
             name='exam.app',
             icon='study.icns',
             bundle_identifier=None)

spec文件中主要包含4个class: Analysis, PYZ, EXE和COLLECT。

Analysis以py文件为输入,它会分析py文件的依赖模块,并生成相应的信息。
PYZ是一个.pyz的压缩包,包含程序运行需要的所有依赖。
EXE根据上面两项生成。
COLLECT生成其他部分的输出文件夹,COLLECT也可以没有。

如果要添加资源进去,那么可以修改:

datas=[('res/bg.jpg', 'res'), ('exam.db', '.')]

列表里面是元组,左边是你要添加的filename(相对路径即可),右边是拷贝到项目中之后的文件夹名字。
比如:

  1. (‘res/bg.jpg’, ‘res’) 中的 ‘res/bg.jpg’ 表示工程根目录下res文件夹下有bg.jpg图片,拷贝到项目之后的res文件夹。
  2. (‘exam.db’, ‘.’) 中的’exam.db’是工程根目录下的文件,’.'表示根目录,即拷贝到项目中的根目录下。

2. 打包图片等资源

光修改了spec文件还是不行的,还需要在python中将获取图片/资源的的路径方法改一下,如下:

# 获取路径
import os, sys
def getPath(filename):
    # 方法一(如果要将资源文件打包到app中,使用此法)
    bundle_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__)))
    path = os.path.join(bundle_dir, filename)
    # 方法二获取路径可以,但如果打包资源好像不行。
    # path = os.path.join(os.path.dirname(sys.argv[0]), filename)
    return path

使用上面的方法获取路径,再利用–add-data命令或者修改使用.spec文件再打包即可。

2020-03-02

3.参考

1.官方文档(遇到问题多看看官方的文档,少走弯路,少花时间)
pyinstaller官方文档

https://pyinstaller.readthedocs.io/en/stable/usage.html
2.这个pyinstaller教程也不错
pyinstaller教程

http://legendtkl.com/2015/11/06/pyinstaller/
3.打包图片资源参考了:
打包图片资源

https://www.zhihu.com/question/268105244?sort=created

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值