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库

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('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进行反编译,在线或是工具都是可以反编译的。
浅尝辄止,有明白的还请指教

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页