PyInstaller打包加密python项目

694次阅读
没有评论
PyInstaller打包加密python项目

window和Linux下使用的方法相同,windows下打包为.exe,Linux打包没有扩展名

打包

pip install pyinstaller # 安装 pyinstaller F main.py # 将主文件以及该目录、文件夹下所有的.py文件打包为单个可执行文件 主要参数: F 打包成单个可执行文件 D 打包成文件夹 clean 在构建之前,清理PyInstaller缓存并删除临时文件(多次打包会报错,最好清除缓存) upxdir 结合UPX压缩打包(upxdir=path/pux) key 指定加密密钥来用AES256来混淆Python字节码(实际性能参见官方使用手册),需要安装crypto库

PyInstaller使用手册

使用

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('confxxx1.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 是一模一样。
出现报错:将Python38Libsite-packages下的Cryptodome文件夹名修改成Crypto:(py3.7之后需要改)

关于反编译

exe反编译:python pyinstxtractor.py main.exe
(pyinstxtractor.py网上找的脚本)
pyc反编译:在线反编译pyc或者工具python-uncompyle6

exe反编译之后,找到了一些.pyc文件,但是无论使用在线反编译pyc或是工具都不能反编译出来,使用或不使用–key也都一样。同时也尝试对正常执行py文件情况下生成pyc进行反编译,在线或是工具都是可以反编译的。
浅尝辄止,有明白的还请指教

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python基础教程2022-11-22发表,共计1958字。
新手QQ群:570568346,欢迎进群讨论 Python51学习