打包python程序笔记

Matt-wzy 2023-08-29

把大象装进冰箱,总共分几步?

前期准备

pip install pyinstaller

在环境中安装好项目中需要的包

哦对了,如果你的电脑中有多个python软件或者虚拟环境,请找到对应的pip命令进行执行。

打包

如果你的项目比较简单,或者引用的第三方库自动打包时不会出现故障,则直接运行pyinstaller -F xxx.py即可将指定的python文件进行打包。

打包完成之后的目录结构大致如下:

dir:
|	xxx.py
|	xxx.spec
|-build
|	└-xxx
|		some files here
└-dist
	└-xxx.exe

其中dist文件夹下既是打包生成的文件

如果此时运行xxx.exe没有报错程序正常运行的话,那么恭喜你,你已经完成任务啦~

但是你如果遇上xxx not found之类的错误提示,那么就说明部分运行库或者环境没有成功地被自动识别上,需要我们手动加载,我们以修复使用ddddcor的项目为例。

找到对应的spec文件,并在pathex,datas写入如下内容:

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


block_cipher = None


a = Analysis(
    ['run.py'],
    pathex=[r'C:\Users\username\AppData\Roaming\Python\Python311\site-packages'],
    binaries=[],
    datas=[(r'C:\Users\username\AppData\Roaming\Python\Python311\site-packages\onnxruntime\capi\onnxruntime_providers_shared.dll','onnxruntime\\capi'),(r'C:\Users\username\AppData\Roaming\Python\Python311\site-packages\ddddocr\common.onnx','ddddocr')],
    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,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='run',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

需要注意的是,缺失的文件目录需要根据你电脑上的实际情况进行编写。编辑完成后,删掉已经打包出来的 dist build __pycache__ 这三个文件夹,运行pyinstaller xxx.spec即可完成打包。

加密

想peach呢?写python代码还想着要加密?

啊,这……其实是能加的,只能加一点点,根据这篇文章,安装 pycrypto pip install pycrypto (考虑到pycrypto 安装不上,应该是不需要的)(可能需要安装pycryptodome这个库,不清楚) pip install tinyaes ,然后pyinstaller.exe -F --key 123456 xxx.py,则依赖库里面的内容就能被加密啦,需要注意的是依赖库并不代表所有内容,程序的主函数还是能被反编译出来的。

(2023/10/05补充)额……如果你经过了上述的配置的话,即需要pyinstaller xxx.spec的话情况,请通过编辑spec文件的方式来添加加密选项,而不是使用参数。方法也很简单,只需要在最上方的block_cipher = None处变更为block_cipher = pyi_crypto.PyiBlockCipher(key='这里填写你的秘钥') ,即可完成加密步骤。