• 利用pyinstaller打包加密Python项目


      最近用Python给媳妇写了两个小项目,给解决了她的每天重复的一些人工操作。媳妇很开心,但是问题来了,她是个Python小白,对她来说,需要安装配置Python环境和一大堆第三方模块是个麻烦事儿。而且后续把这些工作交接给别人的话,一是又需要重新安装Python环境,二是我辛苦给她写的源码就这样暴露了。

      为了解决这个问题,于是就开始百度。果然Python还是有好多中加密源码的方法,并且可能打包成exe的可执行文件。这样不仅保护了源码的安全,还免去了安装Python环境的繁琐。

    最开始试了是py2exe这个模块,花了两个小时,还是没倒腾成功,百度查了说py2exe不是很好用,我也果断放弃了,尝试别的方法。然后就有了pyinstaller的经历。百度上有不少文档,但还是得自己去真正操作一遍才行。那我们就开始吧。

      首先是安装pyinstaller模块,这个很简单,直接pip install pyinstaller就行了。我们就重点讲讲怎么用吧。先从最简单的开始。。。。

      写个简单的脚本holle.py,为什么要在脚本的最后加上了time.splee(5)?因为生成的exe文件执行太特么快了,我都没看见打印了什么就自动关闭docs窗口了。

    # -*- coding: utf-8 -*-
    #2019/12/25 14:24
    
    import time
    print('#######################################################################################')
    print('#######################################################################################')
    with open('123.txt','r') as f:
        ret = f.read()
        print(ret)
    
    print('#######################################################################################')
    print('#######################################################################################')
    print('#######################################################################################')
    time.sleep(5)
    hello.py

    这里简单介绍一下pyinstaller的参数使用:

    -h,--help查看该模块的帮助信息
    -F,-onefile 产生单个的可执行文件
    -D,--onedir 产生一个目录(包含多个文件)作为可执行程序
    -a,--ascii 不包含 Unicode 字符集支持
    -d,--debug 产生 debug 版本的可执行文件
    -w,--windowed,--noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
    -c,--nowindowed,--console 指定使用命令行窗口运行程序(仅对 Windows 有效)
    -o DIR,--out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
    -p DIR,--path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
    -n NAME,--name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字

    在表 1 中列出的只是 PyInstaller 模块所支持的常用选项,如果需要了解 PyInstaller 选项的详细信息,则可通过 pyinstaller -h 来查看。

    打开终端,进入到hello.py的所在目录,执行 pyinstaller -F hello.py。执行完会自动生成build、dist目录和hello.spec文件。

    咱要的exe文件在dist目录下,其他的就没有用了。直接把dist目录下的 hello.exe文件拷贝到其他地方,比如桌面,哈哈。然后在桌面创建一个123.txt文件,随便写点什么。主要测试一下exe能否正常执行,有没有打印预期的内容。试了一下,不错。是预期的效果。那接下来就可以开始我们的正题了。打包多个目录下的多个py文件。

    代码目录结构如下:

    1、先生成spec文件

     打开Terminal,进入到bin目录下,执行pyinstaller -D run.py,还是一样执行完会自动生成build、dist目录和run.spec文件。让我们来看看spec文件长啥样。

     

     

     2、配置spec文件

    因为项目里写了好多自定义的模块,以及应用的图片和模板文件。所以需要配置一下spec文件,才能正确的生成exe文件。

    主要配置以下4个地方即可:

    # -*- mode: python ; coding: utf-8 -*-
    
    block_cipher = None
    
    SETUP_DIR = 'E:\python_test\python\lixiaoxin_barcode2'
    
    a = Analysis(['run.py',
                'E:\python_test\python\lixiaoxin_barcode2\core\main.py',
                'E:\python_test\python\lixiaoxin_barcode2\conf\settings.py',
                'E:\python_test\python\lixiaoxin_barcode2\core\barcode_handler.py',
                'E:\python_test\python\lixiaoxin_barcode2\core\log.py'],
                 pathex=[SETUP_DIR],
                 binaries=[],
                 datas=[(SETUP_DIR + '\db\input','db\input'),(SETUP_DIR + '\doc','doc')],
                 hiddenimports=['core','core.main','conf.settings','core.log','core.barcode_handler'],
                 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,
              [],
              exclude_binaries=True,
              name='run',
              debug=False,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              console=True )
    coll = COLLECT(exe,
                   a.binaries,
                   a.zipfiles,
                   a.datas,
                   strip=False,
                   upx=True,
                   upx_exclude=[],
                   name='run')
    run.spec

    (1) py文件打包配置

      针对多目录多文件的python项目,打包时候需要将所有相关的py文件输入到Analysis类里。Analysis类中的pathex定义了打包的主目录,对于在此目录下的py文件可以只写文件名不写路径。如上的spec脚本,将所有项目中的py文件路径以列表形式写入Analysis,这里为了说明混合使用了绝对路径和相对路径。

    (2) 资源文件打包配置

      资源文件包括打包的python项目使用的相关文件,如图标文件,文本文件等。对于此类资源文件的打包需要设置Analysis的datas

    比如:datas=[(SETUP_DIR + '\db\input','db\input'),(SETUP_DIR + '\doc','doc')],只需要添加依赖的输入目录以及放图片、模板的目录即可。
    注意:SETUP_DIR + '\db\input'为源码中的绝对路径,Windows路径需要用\来转义,后面的db\input为打包后生成的目录,写相对路径即可。这样我们就不需要再手动把依赖的文件拷贝到run目录了

    (3)Hidden import配置

      pyinstaller在进行打包时,会解析打包的python文件,自动寻找py源文件的依赖模块。但是pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx。这时我们就需要在Analysis下hiddenimports中加入遗漏的模块。
    如:

    from core.barcode_handler import *
    from conf import settings as ss
    from core.log import Log as log
    只需要写入自定义的模块即可
    hiddenimports=['core','core.main','conf.settings','core.log','core.barcode_handler']

    3、配置好spec文件后,重新生成exe文件。

    可以把之前生成的build和dist目录删除掉,只留刚配置好的run.spec文件就行。

    最后打开Terminal,进入到bin目录下,执行pyinstaller -D run.spec,一样会生成build和dist目录,我们只要dist目录就行了。

     可以把dist目录拷贝到桌面测试一下。为了方便操作,可以创建一个run.exe和输入、出入目录的快捷方式放到根目录下,dist目录可以任意命名。

     执行一下看看效果:

     

     不错,程序运行正常。

     最后总结起来就三步:

    1、先执行pyinstaller xxx.py生成xxx.spec文件

    2、配置xxx.spec文件

    3、执行pyinstaller -D xxx.spec

    最后:如果生成了exe文件,但是双击xx.exe执行没有效果,又看不到报错信息的话,可以在Terminal或者cmd里执行

     参考博客:https://blog.csdn.net/weixin_42052836/article/details/82315118

     

  • 相关阅读:
    使用Application Insights 做分析
    UWP中GridView右击选中的实现
    Bing Map
    UWP深入学习六:Build better apps: Windows 10 by 10 development series
    从上往下打印二叉树
    二叉树中和为某一值的路径
    二叉树的镜像
    树的子结构
    由前序遍历和中序遍历构建二叉树
    二叉树常见题目
  • 原文地址:https://www.cnblogs.com/hulk-1029/p/12106630.html
Copyright © 2020-2023  润新知