简单介绍一下pyinstaller打包以及安全性的实现

作者:༺北海以北的等待༻꧂ 时间:2021-07-23 15:34:56 

pyinstaller打包问题

简单介绍一下pyinstaller常用的参数:

可选参数示例说明
-Fpyinstaller -F demo.py只在dist文件夹中生成一个程序demo.exe文件,适用于一个模块没有多依赖.py文件
-Dpyinstaller -D demo.py默认选项,除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用这个
-cpyinstaller -c demo.py默认选项,只对windows有效,使用控制台
-wpyinstaller -w demo.py只对windows有效,不使用控制台
-ppyinstaller -p D:\project\demo.py设置导入路径
-ipyinstaller -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

用表白小软件为例,有用的就这三个文件:

简单介绍一下pyinstaller打包以及安全性的实现

其中love.py是主程序,cfg.py是配置文件,resources文件夹里是一些类似字体,音乐等的素材文件。
先直接试试运行如下命令打包:


pyinstaller -Fw love.py

打包结束后根目录变成了这样:

简单介绍一下pyinstaller打包以及安全性的实现

dist文件夹里有打包好的exe文件。打开文件夹,直接双击运行一下,会发现报错:

简单介绍一下pyinstaller打包以及安全性的实现

原因很简单,因为你没把相关的素材文件打包进这个exe文件,而在该目录下根据程序本身的设定是无法读取到这些素材文件的。你需要先把该exe文件移动到love.py这个主程序所在的目录,然后双击运行:

简单介绍一下pyinstaller打包以及安全性的实现

想要把素材文件也打包进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文件),类似这样:

简单介绍一下pyinstaller打包以及安全性的实现

打开该文件,可以发现该文件里的内容是这样的(为了方便某些懒癌患者复制粘贴,我就不截图而是直接把内容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文件竟然可以直接运行啦:

简单介绍一下pyinstaller打包以及安全性的实现

至此,我们轻松地实现了将python程序的素材文件一起打包进exe文件的目标。当然,上面只是介绍了一种个人比较习惯且相对简单方便的解决方案,想了解更多相关内容以及原理,各位小伙伴还是自己去查阅官方文档吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/index.html

pyinstaller安全性问题

以我们刚刚打包好的exe文件为例,就是它:

简单介绍一下pyinstaller打包以及安全性的实现

假设我们只把这个exe文件发给了心仪的小姐姐/小哥哥(然后人家拉黑了你)。那么对方能不能通过这个exe文件来获得你的源代码呢?可以。让我们一步步操作下去来实现这个目的。

先到这下载个解包工具:
https://sourceforge.net/projects/pyinstallerextractor/

下载后长这样:

简单介绍一下pyinstaller打包以及安全性的实现

再下载个十六进制编辑器,一会要用到:
https://wxmedit.github.io/downloads.html

然后运行如下命令:


python pyinstxtractor.py love.exe

运行后发现根目录变成了这样:

简单介绍一下pyinstaller打包以及安全性的实现

多了一个文件夹,打开后发现里面一堆ddl,pyd文件:

简单介绍一下pyinstaller打包以及安全性的实现

在这里面我们可以找到三个比较关键的文件:

简单介绍一下pyinstaller打包以及安全性的实现

其中love就是你之前打包的那个py文件对应的pyc文件。注意,如果exe文件名被改动过,比如一开始打包好的love.exe被改成了pig.exe,那么你找到的文件仍然是love.exe.manifest,而不是pig.exe.manifest

struct也是一个pyc文件。于是我们现在只需要反编译这些pyc文件就行了,随便搜索下就可以发现一堆相关的网站:

简单介绍一下pyinstaller打包以及安全性的实现

随便选一个就OK了:
http://tools.bugscaner.com/decompyle/

打开lovestruct文件(重命名一下加个后缀就变成pyc文件):

简单介绍一下pyinstaller打包以及安全性的实现

struct.pyc文件里的前12个字节复制到love.pyc文件里,love.pyc文件变成了这样:

简单介绍一下pyinstaller打包以及安全性的实现

保存,然后拿去在线反编译,即可拿到源码。
可以发现我们已经成功地通过exe文件获得了程序的源代码。

不过pyinstaller提供了–key这个选项,可以实现加密打包,但实际上它只对依赖库进行了加密,并没有对主程序做加密处理。

来源:https://blog.csdn.net/qq_45414559/article/details/105889784

标签:pyinstaller,打包
0
投稿

猜你喜欢

  • 用一条SQL实现:一行多个字段数据的最大值

    2008-12-31 13:37:00
  • Oracle数据库3种关闭方式

    2008-06-13 16:46:00
  • Python+appium框架原生代码实现App自动化测试详解

    2023-02-26 11:59:32
  • 解决Vue警告Write operation failed:computed value is readonly

    2024-04-09 10:49:25
  • 教你隐藏ACCESS数据库的表名

    2008-05-09 19:45:00
  • python 创建一维的0向量实例

    2021-09-06 22:29:50
  • python实现将json多行数据传入到mysql中使用

    2022-12-28 06:41:51
  • pandas如何处理缺失值

    2021-04-10 12:42:35
  • python xmind 包使用详解(其中解决导出的xmind文件 xmind8可以打开 xmind2020及之后版本打开报错问题)

    2022-10-01 17:23:57
  • Numpy对于NaN值的判断方法

    2022-12-15 15:08:21
  • 分享几个字体设计

    2007-10-10 13:53:00
  • 每个分类取最新的几条的SQL实现代码

    2012-08-21 10:57:18
  • Python splitlines使用技巧

    2023-01-11 01:13:56
  • 超详细Python解释器新手安装教程

    2021-08-14 07:10:01
  • sp_delete_backuphistory

    2008-06-07 13:59:00
  • python 根据字典的键值进行排序的方法

    2023-10-07 00:07:56
  • 手写一个python迭代器过程详解

    2021-06-29 07:45:23
  • 一个asp正则替换的方法

    2008-11-25 14:05:00
  • go开源项目用户名密码验证的逻辑鬼才写法

    2024-05-08 10:44:20
  • Django中URL的参数传递的实现

    2022-12-24 13:53:25
  • asp之家 网络编程 m.aspxhome.com