小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

全網(wǎng)首份Python打包工具Pyinstaller實(shí)戰(zhàn)指南,如絲滑般體驗(yàn)

 鷹兔牛熊眼 2019-01-24


寫了個(gè)吊炸天的Python項(xiàng)目,把我和左手相處的時(shí)間都賠上了。但出于版權(quán)考慮,我不太想讓使用方直接用我的代碼,畢竟Python代碼給出去,就真的收不回來(lái)了。

想給客戶演示的時(shí)候,不想那么墨跡的打開dos cmd 或者 terminal ,然后運(yùn)行 python app.py 這樣的命令行。最好是客戶雙擊,完事兒。就像有人在那自己動(dòng)一樣……

PyInstaller 來(lái)了,他就是這么一款幫助我們把整個(gè)項(xiàng)目完整打包的工具。目前已經(jīng)兼容Py3.7,以及 Mac App 和 Windows Exe。


文檔:

https://pyinstaller./en/stable/index.html

先說下,這篇文章有別于網(wǎng)上那坨安裝、打包的草包,這次是真核!


1. 安裝
這個(gè)很簡(jiǎn)單,直接 
pip install pyinstaller 就好。
??注意了:你要編譯成exe,建議你省心點(diǎn)的在windows上用pyinstaller,如果你要mac app的,那就用mac編譯。

我今天就以windows為例


2. 簡(jiǎn)單使用

這個(gè)也很簡(jiǎn)單,網(wǎng)上一抓一大把,我這里就不贅述了,無(wú)非就是那么幾個(gè)命令:

pyinstaller -F 項(xiàng)目主文件(或者是單一腳本)


3. 參數(shù)說明

-F,打包所有的依賴包在一個(gè)exe中,包括你自己的模塊、內(nèi)置模塊以及第三方模塊。

-c,如果你是命令行窗口,就要加上這個(gè)參數(shù)。

-w,窗口程序,比如你用了PyQt。


4. 高級(jí)用法:配置文件

.spec,這個(gè)文件非常重要,我們可以通過編輯這個(gè)文件來(lái)打包我們的項(xiàng)目,類似DockerFile。

我給大家貼一個(gè)我的:

# -*- mode: python -*-

block_cipher = None

a = Analysis(['C:\\app\\main.py'],
            pathex=['C:\\'],
            binaries=[],
            datas=[
                ('C:\\data\\input\\builtin\\*.xlsx''.\\data\\input\\builtin\\'),
                ('C:\\data\\input\\*.xlsx''.\\data\\input\\'),
                ('C:\\data\\output\\''.\\data\\output\\'),
                ('C:\\log\\''.\\log\\'),
                ('C:\\app\\db\\''.\\app\\db\\')
            ],
            hiddenimports=['numpy''pandas'],
            ...
            )
           
pyz = PYZ(a.pure, a.zipped_data,
            cipher=block_cipher)
           
exe = EXE(pyz,
         ...
         )

這其實(shí)就是一個(gè)python文件,只不過后綴是spec罷了。

.spec一共會(huì)有4個(gè)對(duì)象,分別是:Analysis、PYZ、EXE、COLLECT。

Analysis用處最多,一個(gè)個(gè)解釋:

第一個(gè)參數(shù),是指定我們整個(gè)項(xiàng)目的主程序,也就是我們的入口文件。

pathex,就是我們的工作目錄

datas,存放我們的數(shù)據(jù)。


好了,說到這里就要好好說一說這個(gè)Pyinstaller的工作流程了。當(dāng)我們雙擊編譯好的exe后,他是會(huì)創(chuàng)建一個(gè)臨時(shí)目錄,把所有需要用的包都解壓到那里,然后執(zhí)行。執(zhí)行完畢后,臨時(shí)文件夾就消失了。

這和我們有什么關(guān)系呢?想一下,如果你的項(xiàng)目中需要去讀取某些文件,甚至是用戶的輸入?yún)?shù),怎么辦?打包出來(lái)的exe 是沒有辦法通過直接指定參數(shù),類似:python main.py --input=*.xlsx 來(lái)讀取文件的,因?yàn)槲抑罢f了,在執(zhí)行的時(shí)候會(huì)把項(xiàng)目解壓到一個(gè)臨時(shí)目錄,所以原來(lái)項(xiàng)目中寫好的相對(duì)路徑也不管用。

為此,我們需要把host上的實(shí)際文件給copy到那個(gè)臨時(shí)目錄下,所以這個(gè)datas的作用就是這個(gè),我的文件中,我把host下的 C:\\data\\input\\builtin\\*.xlsx文件都copy到臨時(shí)目錄的 data\\input\\builtin 下面。


hiddenimports ,繼續(xù)說下去,PyInstaller有時(shí)候無(wú)法偵察到全部的依賴包,怎么辦?我們可以在這個(gè)后面加,把PyInstaller編譯出來(lái)的exe在運(yùn)行的時(shí)候報(bào)的缺少模塊給寫里面。

??注意了: pandas 和 numpy 有個(gè)很奇怪的地方,就是引用了 pandas 的地方,如果沒有引用 numpy ,就會(huì)報(bào)錯(cuò)。所以你可以在主入口上面加一個(gè) import numpy 。

??注意了:直接 import numpy 還是會(huì)報(bào)錯(cuò)。怎么辦?在 import numpy 下面加 import numpy.core._dtype_ctypes


5. 臨時(shí)目錄

那剛剛說的臨時(shí)目錄在代碼里怎么處理呢,如果代碼中還是老樣子處理相對(duì)路徑,一定是找不到的。

官方文檔中給出了這么一段:

Your app should run in a bundle exactly as it does when run from source. However, you may need to learn at run-time whether the app is running from source, or is “frozen” (bundled).

import sys
if getattr( sys, 'frozen', False ) :
      # running in a bundle
      basedir = sys._MEIPASS
else :
      # running live

所以在你的項(xiàng)目中,如果有配置文件的話,就在那里加上這一段,然后在bundle中添加你的新路徑,else還是你的老代碼。

這個(gè) sys._MEIPASS 是個(gè)特殊的值,是在Pyinstaller打包的時(shí)候才會(huì)添加的臨時(shí)變量,通過這個(gè)變量我們可以獲取到在執(zhí)行exe時(shí)候的臨時(shí)目錄。

這對(duì)代碼的改動(dòng)是最小的。


6. 編譯打包

最后,我們執(zhí)行 python xxx.spec 就好了。打包的可執(zhí)行文件會(huì)在dist里,build中是一些打包時(shí)候需要的文件。

輸出中最后有 successfully 字樣,就算成功了。他也會(huì)告訴你,exe出現(xiàn)在哪個(gè)位置。


當(dāng)然不是說這樣就萬(wàn)無(wú)一失了,別人也可以反編譯你的exe,所以我們可以在打包的時(shí)候用Cython去編譯一次,把混淆過的代碼打包。這樣的話難度就增加了,同時(shí)再加上mac地址綁定,這里就有多種思路了。下一次我給大家說說。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多