簡(jiǎn)單介紹一下pyinstaller打包以及安全性的實(shí)現(xiàn)
pyinstaller打包問(wèn)題
簡(jiǎn)單介紹一下pyinstaller常用的參數(shù):
| 可選參數(shù) | 示例 | 說(shuō)明 |
|---|---|---|
| -F | pyinstaller -F demo.py | 只在dist文件夾中生成一個(gè)程序demo.exe文件,適用于一個(gè)模塊沒(méi)有多依賴.py文件 |
| -D | pyinstaller -D demo.py | 默認(rèn)選項(xiàng),除了主程序demo.exe外,還會(huì)在在dist文件夾中生成很多依賴文件,推薦使用這個(gè) |
| -c | pyinstaller -c demo.py | 默認(rèn)選項(xiàng),只對(duì)windows有效,使用控制臺(tái) |
| -w | pyinstaller -w demo.py | 只對(duì)windows有效,不使用控制臺(tái) |
| -p | pyinstaller -p D:\project\demo.py | 設(shè)置導(dǎo)入路徑 |
| -i | pyinstaller -i D:\icons\demo.ico demo.py | 給生成的demo.exe文件設(shè)置一個(gè)自定義的圖標(biāo) |
部分參數(shù)可組合使用,比如打包成一個(gè).exe,不使用控制臺(tái):
pyinstaller -w -F demo.py
關(guān)于pyinstaller如何把圖片,音樂(lè),字體等素材文件也打包進(jìn)exe文件中。這里就不整那些花里胡哨的東西了,直接講講我們?cè)撛趺醋霾拍軐?shí)現(xiàn)這個(gè)功能吧,先聲明一下,其實(shí)這東西官網(wǎng)里就有教程,不明白且想明白為什么這么做的自己看官網(wǎng)的介紹吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/runtime-information.html
用表白小軟件為例,有用的就這三個(gè)文件:

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

dist文件夾里有打包好的exe文件。打開(kāi)文件夾,直接雙擊運(yùn)行一下,會(huì)發(fā)現(xiàn)報(bào)錯(cuò):

原因很簡(jiǎn)單,因?yàn)槟銢](méi)把相關(guān)的素材文件打包進(jìn)這個(gè)exe文件,而在該目錄下根據(jù)程序本身的設(shè)定是無(wú)法讀取到這些素材文件的。你需要先把該exe文件移動(dòng)到love.py這個(gè)主程序所在的目錄,然后雙擊運(yùn)行:

想要把素材文件也打包進(jìn)exe文件的話,得先修改下程序,把程序中關(guān)于素材資源加載路徑的相關(guān)代碼從(在cfg.py文件里):
# 背景音樂(lè)路徑 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__) # 背景音樂(lè)路徑 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')
然后新建一個(gè).spec文件,當(dāng)然,為了方便,你可以直接打開(kāi)剛剛生成的那個(gè).spec文件(就是運(yùn)行最前面那個(gè)打包命令時(shí),也會(huì)根據(jù)你的命令來(lái)生成一個(gè)love.spec文件),類似這樣:

打開(kāi)該文件,可以發(fā)現(xiàn)該文件里的內(nèi)容是這樣的(為了方便某些懶癌患者復(fù)制粘貼,我就不截圖而是直接把內(nèi)容copy下來(lái)了):
# -*- 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 )
通過(guò)修改該文件,可以將指定的素材資源全部打包進(jìn)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 )
其實(shí)就加了一行代碼(第六行):
added_files = [('C:\\Users\\xx\\Desktop\\NaughtyConfession\\resources', 'resources')]
然后把(第十行)datas=[],改成了datas=added_files,
就這么簡(jiǎn)單就完事了,最后在命令行運(yùn)行:
pyinstaller -F love.spec
同樣地,在dist文件夾里會(huì)生成打包好的exe文件,雙擊運(yùn)行一下,可以發(fā)現(xiàn)這個(gè)exe文件竟然可以直接運(yùn)行啦:

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

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

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

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

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

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

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

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

保存,然后拿去在線反編譯,即可拿到源碼。
可以發(fā)現(xiàn)我們已經(jīng)成功地通過(guò)exe文件獲得了程序的源代碼。
不過(guò)pyinstaller提供了–key這個(gè)選項(xiàng),可以實(shí)現(xiàn)加密打包,但實(shí)際上它只對(duì)依賴庫(kù)進(jìn)行了加密,并沒(méi)有對(duì)主程序做加密處理。
到此這篇關(guān)于簡(jiǎn)單介紹一下pyinstaller打包以及安全性的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)pyinstaller打包及安全性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django實(shí)現(xiàn)隨機(jī)圖形驗(yàn)證碼的示例
這篇文章主要介紹了Django實(shí)現(xiàn)隨機(jī)圖形驗(yàn)證碼的示例,幫助大家更好的學(xué)習(xí)和使用django框架,感興趣的朋友可以了解下2020-10-10
Scrapy基于Python構(gòu)建強(qiáng)大網(wǎng)絡(luò)爬蟲(chóng)框架實(shí)例探究
這篇文章主要為大家介紹了Scrapy基于Python構(gòu)建強(qiáng)大網(wǎng)絡(luò)爬蟲(chóng)框架實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python實(shí)現(xiàn)打磚塊小游戲代碼實(shí)例
這篇文章主要介紹了Python打磚塊小游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Python實(shí)現(xiàn)雙因素驗(yàn)證2FA的示例代碼
雙因素認(rèn)證(2FA)作為額外安全層為賬號(hào)登錄添加了第二層身份驗(yàn)證。確保賬號(hào)持有人是可以訪問(wèn)數(shù)字身份的唯-用戶。如果不使用雙因表認(rèn)證,企業(yè)將承擔(dān)巨大的安全風(fēng)險(xiǎn)。本文將用Python實(shí)現(xiàn)雙因素驗(yàn)證2FA,需要的可以參考一下2022-07-07
python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹
這篇文章主要介紹了python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10

