最近用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)
這里簡單介紹一下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')
(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