(结尾附上使用.spec打包时,增加--key命令进行加密)

最近写了个功能GUI,需要对源码打包生成exe可执行文件,结果遇到了几个坑,耗费了些时间才解决,现在进行个总结,希望网友们能更加快速入门pyinstall。这个总结并不全面,因为已经足够我使用了,按照步骤可快速打包完成。仅供大家参考!


说明

本文偏向于多文件打包,单文件本身也难度不大,而且多文件的方法也适用于单文件。

pyinstaller 官方

pyinstaller 官网 https://pypi.org/project/pyinstaller/
pyinstaller 官方文档 https://pyinstaller.readthedocs.io/

pyinstaller 常用的命令:

-F:仅仅生成一个文件,不暴露其他信息,启动较慢。
-D:(默认)生成一个文件夹,包含可执行文件和相关动态链接库和资源文件等,启动快。
-w:窗口模式打包,不显示控制台。
-c:跟图标路径,作为应用icon。
-n 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

单文件打包(简单说明)

以下每行代码代表一种打包方式,仅列举了常用的几种,test.py文件为打包的python源码文件

pyinstaller -F -i ./test.ico --key 035634 test.py	# 配置图标、防反编译打包
pyinstaller -F -i ./test.ico test.py				# 配置图标
pyinstaller -F test.py								# 默认打包方式
打包成一个exe文件还是一个文件夹(-F -D问题)

-D是默认的,打包成一个文件夹,文件夹中含有可执行文件和相关动态链接库和资源文件,优点是执行速度快,也就是打开软件的速度快。上面的说法对单文件和多文件都适用。


步骤

1. 整理文件目录:

(将.py文件放到项目根目录下,其他格式文件放到文件夹如file1里)

|—file1
|—— ###.csv
|—— ###.jpg
|—file2
|—— ###.txt
|—test1.py
|—test2.py
|— …

2. 安装库文件:

pip install Pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

3. 生成spec文件:

pyi-makespec -D -w--key 23456 gui4.py
(需要任何命令,在这一个步骤中加入,如 --key 23456,加入后生成的spec文件将会自动配置相关命令内容,详情请查看.spec文件。注意:无法在pyinstaller ###.spec时候配置任何命令)

4. 修改spec文件:

下面.spec文件作为参考,下文有相关步骤解释。

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

block_cipher = pyi_crypto.PyiBlockCipher(key='570333')
SETUP_DIR = 'D:\\Users\\Desktop\\GUI5'

a = Analysis(['gui4.py','GetFollowerData.py','GetLikesData.py','GetUserData.py','MyLog1.py','MyLog2.py'],
             pathex=[SETUP_DIR],
             binaries=[],
             datas=[(SETUP_DIR + '\\file','file'),(SETUP_DIR + '\\user_files','user_files')],
             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, 
          [],
          exclude_binaries=True,
          name='biliFM',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None,
          icon=SETUP_DIR + '\\file\\icon.ico' )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas, 
               strip=False,
               upx=True,
               upx_exclude=[],
               name='biliFM')

a. 可使用常量如SETUP_DIR设置一个工程文件路径,以简化后面的路径
b. 将所有.py文件名添加到Analysis(['','',''])
c. 添加工程文件绝对路径到pathex['']
d. 将其他文件夹和文件夹名称添加到datas[(,),(,)] ,空文件夹无效,可添加占位文件,如空的txt文件
e. 通过 consolo = True 或 False 设置控制台显示
f. 通过 name= 设置exe文件的文件名
g. 通过 icon= 设置exe文件图标(如果第二步没有适用-n命令,则.spec文件中没有这行代码,可通过手动添加,其他代码也同样如此)
h. (如果执行exe出现No Module named xxx),在Hidden import中添加
i. 将所有路径中的\替换为\\

5. 开始打包

运行.spec文件,如pyinstaller test.spec

6. 反编译测试(如果有需要可进行这一步)

a. 克隆python-exe-unpacker中的pyinstxtractor.py文件到exe所在目录
b. 运行python pyinstxtractor.py ###.exe(如果使用了--key,且已经发挥作用,那么反编译会产生error,可起到一定的防止反编译效果)


结尾还是想说一下,刚接触pyinstall时候,不知道使用spec打包怎么进行加密,就算使用了--key命令,让然不起作用。后来才发现,需要在生成.spec文件的时候加入命令,如pyi-makespec -D -w --key 23456 gui4.py。加入的命令会在.spec文件中有所体现,具体可亲自尝试探索!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐