簡單介紹一下pyinstaller打包以及安全性的實現(xiàn)
pyinstaller打包問題
簡單介紹一下pyinstaller常用的參數(shù):
| 可選參數(shù) | 示例 | 說明 |
|---|---|---|
| -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 | 設(shè)置導(dǎo)入路徑 |
| -i | pyinstaller -i D:\icons\demo.ico demo.py | 給生成的demo.exe文件設(shè)置一個自定義的圖標 |
部分參數(shù)可組合使用,比如打包成一個.exe,不使用控制臺:
pyinstaller -w -F demo.py
關(guān)于pyinstaller如何把圖片,音樂,字體等素材文件也打包進exe文件中。這里就不整那些花里胡哨的東西了,直接講講我們該怎么做才能實現(xiàn)這個功能吧,先聲明一下,其實這東西官網(wǎng)里就有教程,不明白且想明白為什么這么做的自己看官網(wǎng)的介紹吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/runtime-information.html
用表白小軟件為例,有用的就這三個文件:

其中love.py是主程序,cfg.py是配置文件,resources文件夾里是一些類似字體,音樂等的素材文件。
先直接試試運行如下命令打包:
pyinstaller -Fw love.py
打包結(jié)束后根目錄變成了這樣:

dist文件夾里有打包好的exe文件。打開文件夾,直接雙擊運行一下,會發(fā)現(xiàn)報錯:

原因很簡單,因為你沒把相關(guān)的素材文件打包進這個exe文件,而在該目錄下根據(jù)程序本身的設(shè)定是無法讀取到這些素材文件的。你需要先把該exe文件移動到love.py這個主程序所在的目錄,然后雙擊運行:

想要把素材文件也打包進exe文件的話,得先修改下程序,把程序中關(guān)于素材資源加載路徑的相關(guān)代碼從(在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文件,當(dāng)然,為了方便,你可以直接打開剛剛生成的那個.spec文件(就是運行最前面那個打包命令時,也會根據(jù)你的命令來生成一個love.spec文件),類似這樣:

打開該文件,可以發(fā)現(xiàn)該文件里的內(nèi)容是這樣的(為了方便某些懶癌患者復(fù)制粘貼,我就不截圖而是直接把內(nèi)容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文件,雙擊運行一下,可以發(fā)現(xiàn)這個exe文件竟然可以直接運行啦:

至此,我們輕松地實現(xiàn)了將python程序的素材文件一起打包進exe文件的目標。當(dāng)然,上面只是介紹了一種個人比較習(xí)慣且相對簡單方便的解決方案,想了解更多相關(guān)內(nèi)容以及原理,各位小伙伴還是自己去查閱官方文檔吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/index.html
pyinstaller安全性問題
以我們剛剛打包好的exe文件為例,就是它:

假設(shè)我們只把這個exe文件發(fā)給了心儀的小姐姐/小哥哥(然后人家拉黑了你)。那么對方能不能通過這個exe文件來獲得你的源代碼呢?可以。讓我們一步步操作下去來實現(xiàn)這個目的。
先到這下載個解包工具:
https://sourceforge.net/projects/pyinstallerextractor/
下載后長這樣:

再下載個十六進制編輯器,一會要用到:
https://wxmedit.github.io/downloads.html
然后運行如下命令:
python pyinstxtractor.py love.exe
運行后發(fā)現(xiàn)根目錄變成了這樣:

多了一個文件夾,打開后發(fā)現(xiàn)里面一堆ddl,pyd文件:

在這里面我們可以找到三個比較關(guān)鍵的文件:

其中l(wèi)ove就是你之前打包的那個py文件對應(yīng)的pyc文件。注意,如果exe文件名被改動過,比如一開始打包好的love.exe被改成了pig.exe,那么你找到的文件仍然是love.exe.manifest,而不是pig.exe.manifest
struct也是一個pyc文件。于是我們現(xiàn)在只需要反編譯這些pyc文件就行了,隨便搜索下就可以發(fā)現(xiàn)一堆相關(guān)的網(wǎng)站:

隨便選一個就OK了:
http://tools.bugscaner.com/decompyle/
打開love和struct文件(重命名一下加個后綴就變成pyc文件):

把struct.pyc文件里的前12個字節(jié)復(fù)制到love.pyc文件里,love.pyc文件變成了這樣:

保存,然后拿去在線反編譯,即可拿到源碼。
可以發(fā)現(xiàn)我們已經(jīng)成功地通過exe文件獲得了程序的源代碼。
不過pyinstaller提供了–key這個選項,可以實現(xiàn)加密打包,但實際上它只對依賴庫進行了加密,并沒有對主程序做加密處理。
到此這篇關(guān)于簡單介紹一下pyinstaller打包以及安全性的實現(xiàn)的文章就介紹到這了,更多相關(guān)pyinstaller打包及安全性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
5分鐘教會你用Docker部署一個Python應(yīng)用
Docker是一個開源項目,為開發(fā)人員和系統(tǒng)管理員提供了一個開放平臺,可以將應(yīng)用程序構(gòu)建、打包為一個輕量級容器,并在任何地方運行,下面這篇文章主要給大家介紹了關(guān)于如何通過5分鐘教會你用Docker部署一個Python應(yīng)用,需要的朋友可以參考下2022-06-06
Python時間序列數(shù)據(jù)的預(yù)處理方法總結(jié)
這篇文章主要介紹了Python時間序列數(shù)據(jù)的預(yù)處理方法總結(jié),時間序列數(shù)據(jù)隨處可見,要進行時間序列分析,我們必須先對數(shù)據(jù)進行預(yù)處理。時間序列預(yù)處理技術(shù)對數(shù)據(jù)建模的準確性有重大影響2022-07-07
在Django admin中編輯ManyToManyField的實現(xiàn)方法
今天小編就為大家分享一篇在Django admin中編輯ManyToManyField的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python網(wǎng)絡(luò)編程之ftplib模塊
這篇文章介紹了Python網(wǎng)絡(luò)編程之ftplib模塊,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05

