2023-11-11 17:02:22 +08:00
|
|
|
# -*- coding: utf-8 -*-#
|
|
|
|
# -------------------------------------------------------------------------------
|
|
|
|
# Name: gen_exe.py
|
|
|
|
# Description:
|
|
|
|
# Author: xaoyaoo
|
|
|
|
# Date: 2023/11/10
|
|
|
|
# -------------------------------------------------------------------------------
|
|
|
|
import site
|
|
|
|
import os
|
2023-12-01 18:11:10 +08:00
|
|
|
import base64
|
|
|
|
|
|
|
|
|
|
|
|
def image_to_base64(image_path):
|
|
|
|
with open(image_path, "rb") as image_file:
|
|
|
|
encoded_string = base64.b64encode(image_file.read())
|
|
|
|
return encoded_string.decode('utf-8')
|
|
|
|
|
|
|
|
|
|
|
|
def base64_to_image(base64_string, image_path):
|
|
|
|
with open(image_path, "wb") as image_file:
|
|
|
|
decoded_string = base64.b64decode(base64_string)
|
|
|
|
image_file.write(decoded_string)
|
|
|
|
|
|
|
|
|
|
|
|
ico_base64 = r'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
|
2023-11-11 17:02:22 +08:00
|
|
|
|
2023-11-28 19:01:49 +08:00
|
|
|
code = """
|
|
|
|
from pywxdump.command import console_run
|
|
|
|
console_run()
|
|
|
|
"""
|
2023-11-28 18:15:59 +08:00
|
|
|
spec_content = '''
|
|
|
|
# -*- mode: python ; coding: utf-8 -*-
|
2023-11-11 17:02:22 +08:00
|
|
|
|
2023-11-28 18:15:59 +08:00
|
|
|
block_cipher = None
|
|
|
|
|
|
|
|
a = Analysis(['tmp.py'],
|
|
|
|
pathex=[],
|
|
|
|
binaries=[],
|
|
|
|
datas=[(r'{root_path}\\version_list.json', 'pywxdump'),
|
|
|
|
(r'{root_path}/show_chat/templates/chat.html', 'pywxdump/show_chat/templates'),
|
|
|
|
(r'{root_path}/show_chat/templates/index.html', 'pywxdump/show_chat/templates')],
|
|
|
|
hiddenimports={hidden_imports},
|
|
|
|
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,
|
|
|
|
[],
|
2023-12-06 11:56:41 +08:00
|
|
|
name='wxdump',
|
2023-11-28 18:15:59 +08:00
|
|
|
debug=False,
|
|
|
|
bootloader_ignore_signals=False,
|
|
|
|
strip=False,
|
|
|
|
upx=True, # 启用压缩
|
|
|
|
console=True, # 使用控制台
|
|
|
|
disable_windowed_traceback=True, # 不禁用堆栈跟踪
|
|
|
|
argv_emulation=False, # 不模拟命令行参数
|
|
|
|
target_arch=None, # 自动检测目标 CPU 架构
|
|
|
|
codesign_identity=None, # 不签名应用程序
|
|
|
|
entitlements_file=None, # 不使用 entitlements 文件
|
|
|
|
onefile=True, # 生成单个可执行文件
|
2023-12-01 18:11:10 +08:00
|
|
|
icon="icon.png"
|
2023-11-28 18:15:59 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
coll = COLLECT(exe,
|
|
|
|
a.binaries,
|
|
|
|
a.zipfiles,
|
|
|
|
a.datas,
|
|
|
|
strip=False,
|
|
|
|
upx=True,
|
|
|
|
upx_exclude=[],
|
2023-12-06 11:56:41 +08:00
|
|
|
name='wxdump')
|
2023-11-28 18:15:59 +08:00
|
|
|
|
2023-11-28 19:01:49 +08:00
|
|
|
'''
|
2023-11-11 17:02:22 +08:00
|
|
|
# 创建文件夹
|
|
|
|
os.makedirs("dist", exist_ok=True)
|
|
|
|
# 将代码写入文件
|
|
|
|
with open("dist/tmp.py", "w", encoding="utf-8") as f:
|
2023-11-28 19:12:39 +08:00
|
|
|
f.write(code.strip())
|
2023-11-11 17:02:22 +08:00
|
|
|
|
2023-12-01 18:11:10 +08:00
|
|
|
base64_to_image(ico_base64, "dist/icon.png") # 将 base64 转换为图片
|
|
|
|
|
2023-11-11 17:02:22 +08:00
|
|
|
# 获取安装包的路径
|
|
|
|
package_path = site.getsitepackages()
|
|
|
|
if package_path:
|
|
|
|
package_path = package_path[1] # 假设取第一个安装包的路径
|
2023-11-28 18:30:07 +08:00
|
|
|
|
|
|
|
current_path = os.path.dirname(os.path.abspath(__file__)) # 当前文件所在路径
|
|
|
|
require_path = os.path.join(os.path.dirname(current_path), "requirements.txt") # requirements.txt 路径
|
2023-11-28 18:15:59 +08:00
|
|
|
with open(require_path, "r", encoding="utf-8") as f:
|
|
|
|
hidden_imports = f.read().splitlines()
|
2023-11-28 18:30:07 +08:00
|
|
|
hidden_imports = [i for i in hidden_imports if i not in ["setuptools", "wheel"]] # 去掉setuptools、wheel
|
|
|
|
|
|
|
|
root_path = os.path.join(package_path, 'pywxdump')
|
2023-11-28 18:15:59 +08:00
|
|
|
|
|
|
|
# 生成 spec 文件
|
|
|
|
spec_content = spec_content.format(root_path=root_path, hidden_imports=hidden_imports)
|
|
|
|
spec_file = os.path.join("dist", "pywxdump.spec")
|
2023-11-28 18:21:06 +08:00
|
|
|
with open(spec_file, 'w', encoding="utf-8") as f:
|
2023-11-28 18:15:59 +08:00
|
|
|
f.write(spec_content.strip())
|
2023-11-11 17:02:22 +08:00
|
|
|
|
|
|
|
# 执行打包命令
|
2023-11-28 18:15:59 +08:00
|
|
|
cmd = f'pyinstaller --clean --distpath=dist {spec_file}'
|
2023-11-11 17:02:22 +08:00
|
|
|
print(cmd)
|
2023-11-29 22:11:21 +08:00
|
|
|
# os.system(cmd)
|
2023-11-11 17:02:22 +08:00
|
|
|
|
|
|
|
else:
|
|
|
|
print("未找到安装包路径")
|