pyinstaller打包问题
简单介绍一下pyinstaller常用的参数:
可选参数
示例
说明
-F
pyinstaller -F demo.py
只在dist文件夹中生成一个程序demo.exe文件,适用于一个模块没有多依赖.py文件
-D
pyinstaller -D demo.py
默认选项,除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用这个
-c
pyinstaller -c demo.py
默认选项,只对windows有效,使用控制台
-w
pyinstaller -w demo.py
只对windows有效,不使用控制台
-p
pyinstaller -p D:\project\demo.py
设置导入路径
-i
pyinstaller -i D:\icons\demo.ico demo.py
给生成的demo.exe文件设置一个自定义的图标
部分参数可组合使用,比如打包成一个.exe,不使用控制台:
pyinstaller -w -F demo.py
关于pyinstaller如何把图片,音乐,字体等素材文件也打包进exe文件中。这里就不整那些花里胡哨的东西了,直接讲讲我们该怎么做才能实现这个功能吧,先声明一下,其实这东西官网里就有教程,不明白且想明白为什么这么做的自己看官网的介绍吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/runtime-information.html
用表白小软件为例,有用的就这三个文件:
其中love.py
是主程序,cfg.py
是配置文件,resources
文件夹里是一些类似字体,音乐等的素材文件。
先直接试试运行如下命令打包:
pyinstaller -Fw love.py
打包结束后根目录变成了这样:
dist
文件夹里有打包好的exe文件。打开文件夹,直接双击运行一下,会发现报错:
原因很简单,因为你没把相关的素材文件打包进这个exe文件,而在该目录下根据程序本身的设定是无法读取到这些素材文件的。你需要先把该exe文件移动到love.py这个主程序所在的目录,然后双击运行:
想要把素材文件也打包进exe文件的话,得先修改下程序,把程序中关于素材资源加载路径的相关代码从(在cfg.py文件里):
# 背景音乐路径 BGM_PATH = os.path.join(os.getcwd(), 'resources/music/bgm.mp3') # 字体路径 FONT_PATH = os.path.join(os.getcwd(), 'resources/font/STXINGKA.TTF') # 背景图片路径 BG_IMAGE_PATH = os.path.join(os.getcwd(), 'resources/images/bg.png') # ICON路径 ICON_IMAGE_PATH = os.path.join(os.getcwd(), 'resources/images/icon.png')
改成:
if getattr(sys, 'frozen', False): cur_path = sys._MEIPASS else: cur_path = os.path.dirname(__file__) # 背景音乐路径 BGM_PATH = os.path.join(cur_path, 'resources/music/bgm.mp3') # 字体路径 FONT_PATH = os.path.join(cur_path, 'resources/font/STXINGKA.TTF') # 背景图片路径 BG_IMAGE_PATH = os.path.join(cur_path, 'resources/images/bg.png') # ICON路径 ICON_IMAGE_PATH = os.path.join(cur_path, 'resources/images/icon.png')
然后新建一个.spec文件,当然,为了方便,你可以直接打开刚刚生成的那个.spec文件(就是运行最前面那个打包命令时,也会根据你的命令来生成一个love.spec文件),类似这样:
打开该文件,可以发现该文件里的内容是这样的(为了方便某些懒癌患者复制粘贴,我就不截图而是直接把内容copy下来了):
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['love.py'], pathex=['C:\\Users\\xx\\Desktop\\NaughtyConfession'], binaries=[], datas=[], 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='love', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False )
通过修改该文件,可以将指定的素材资源全部打包进exe文件中,具体而言,修改后的文件如下:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None added_files = [('C:\\Users\\xx\\Desktop\\NaughtyConfession\\resources', 'resources')] a = Analysis(['love.py'], pathex=['C:\\Users\\xx\\Desktop\\NaughtyConfession'], binaries=[], datas=added_files, 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='love', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False )
其实就加了一行代码(第六行):
added_files = [('C:\\Users\\xx\\Desktop\\NaughtyConfession\\resources', 'resources')]
然后把(第十行)datas=[],
改成了datas=added_files,
就这么简单就完事了,最后在命令行运行:
pyinstaller -F love.spec
同样地,在dist文件夹里会生成打包好的exe文件,双击运行一下,可以发现这个exe文件竟然可以直接运行啦:
至此,我们轻松地实现了将python程序的素材文件一起打包进exe文件的目标。当然,上面只是介绍了一种个人比较习惯且相对简单方便的解决方案,想了解更多相关内容以及原理,各位小伙伴还是自己去查阅官方文档吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/index.html
pyinstaller安全性问题
以我们刚刚打包好的exe文件为例,就是它:
假设我们只把这个exe文件发给了心仪的小姐姐/小哥哥(然后人家拉黑了你)。那么对方能不能通过这个exe文件来获得你的源代码呢?可以。让我们一步步操作下去来实现这个目的。
先到这下载个解包工具:
https://sourceforge.net/projects/pyinstallerextractor/
下载后长这样:
再下载个十六进制编辑器,一会要用到:
https://wxmedit.github.io/downloads.html
然后运行如下命令:
python pyinstxtractor.py love.exe
运行后发现根目录变成了这样:
多了一个文件夹,打开后发现里面一堆ddl,pyd文件:
在这里面我们可以找到三个比较关键的文件:
其中love就是你之前打包的那个py文件对应的pyc文件。注意,如果exe文件名被改动过,比如一开始打包好的love.exe被改成了pig.exe,那么你找到的文件仍然是love.exe.manifest
,而不是pig.exe.manifest
struct也是一个pyc文件。于是我们现在只需要反编译这些pyc文件就行了,随便搜索下就可以发现一堆相关的网站:
随便选一个就OK了:
http://tools.bugscaner.com/decompyle/
打开love
和struct
文件(重命名一下加个后缀就变成pyc文件):
把struct.pyc
文件里的前12个字节复制到love.pyc
文件里,love.pyc
文件变成了这样:
保存,然后拿去在线反编译,即可拿到源码。
可以发现我们已经成功地通过exe文件获得了程序的源代码。
不过pyinstaller提供了–key这个选项,可以实现加密打包,但实际上它只对依赖库进行了加密,并没有对主程序做加密处理。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】