利用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM