PyInstaller打包加密python项目
window和Linux下使用的方法相同,windows下打包为.exe,Linux打包没有扩展名
打包
pip install pyinstaller # 安装
pyinstaller -F main.py # 将主文件以及该目录、文件夹下所有的.py文件打包为单个可执行文件
主要参数:
-F 打包成单个可执行文件
-D 打包成文件夹
--clean 在构建之前,清理PyInstaller缓存并删除临时文件(多次打包会报错,最好清除缓存)
--upx-dir 结合UPX压缩打包(--upx-dir=path/pux)
--key 指定加密密钥来用AES256来混淆Python字节码(实际性能参见官方使用手册),需要安装crypto库
使用
windows下:
main.exe 你的参数
Linux下:
./main 你的参数 # ubuntu
踩过的坑
1.打包项目中包含不是.py文件的配置文件等
错误提示:找不到XXX文件
基本原理:Pyinstaller 可以将资源文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源。
import os
import sys
#获取临时文件夹中的资源
def resource_path(relative_path):
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
path=resource_path('conf\xxx1.conf') #用path替换项目中引用XXX.txt的位置
将资源文件打包的方法:pyinstaller -F main.py
在当前目录下生成 main.spec文件,修改文件
# -*- mode: python ; coding: utf-8 -*-
#windows下
block_cipher = None
a = Analysis(['main.py'],
pathex=['C:\\Users\\xxx\\Desktop\\main'],
binaries=[],
datas=[('conf\\xxx1.conf','conf'),
('conf\\xxx2.conf','conf')], <------添加你的资源文件
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='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
最后打包命令:pyinstaller -F main.spec
2.总是打包不成单个执行文件,而打包成一个文件夹
如果之前用- D
命令生成了.spec
文件,而你添加了datas
之后,还在使用这个.spec
文件打包,那么就会导致你一直生成一个文件夹,而不是单个执行文件。
3.crypto安装不上
pycrypto,pycryptodome和crypto是一个东西;pycryptodome是pycrypto的延伸版本,用法和pycrypto 是一模一样。
出现报错:将Python38\Lib\site-packages下的Cryptodome文件夹名修改成Crypto:(py3.7之后需要改)
关于反编译
exe反编译:python pyinstxtractor.py main.exe
(pyinstxtractor.py网上找的脚本)
pyc反编译:在线反编译pyc或者工具python-uncompyle6
exe反编译之后,找到了一些.pyc文件,但是无论使用在线反编译pyc或是工具都不能反编译出来,使用或不使用--key
也都一样。同时也尝试对正常执行py文件情况下生成pyc进行反编译,在线或是工具都是可以反编译的。
浅尝辄止,有明白的还请指教
更多推荐
所有评论(0)