国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

全網首份Python打包工具Pyinstaller實戰指南,如絲滑般體驗

caikeal / 2121人閱讀

摘要:最好是客戶雙擊,完事兒。目前已經兼容,以及和。一共會有個對象,分別是。,就是我們的工作目錄,存放我們的數據。編譯打包最后,我們執行就好了。打包的可執行文件會在里,中是一些打包時候需要的文件。輸出中最后有字樣,就算成功了。


寫了個吊炸天的Python項目,把我和左手相處的時間都賠上了。但出于版權考慮,我不太想讓使用方直接用我的代碼,畢竟Python代碼給出去,就真的收不回來了。

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

PyInstaller 來了,他就是這么一款幫助我們把整個項目完整打包的工具。目前已經兼容Py3.7,以及 Mac App 和 Windows Exe。

文檔:https://pyinstaller.readthedo...

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

1. 安裝

這個很簡單,直接 pip install pyinstaller 就好。

??注意了:你要編譯成exe,建議你省心點的在windows上用pyinstaller,如果你要mac app的,那就用mac編譯。

我今天就以windows為例

2. 簡單使用

這個也很簡單,網上一抓一大把,我這里就不贅述了,無非就是那么幾個命令:

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

3. 參數說明

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

-c,如果你是命令行窗口,就要加上這個參數。

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

4. 高級用法:配置文件

.spec,這個文件非常重要,我們可以通過編輯這個文件來打包我們的項目,類似DockerFile。

我給大家貼一個我的:

# -*- mode: python -*-

block_cipher = None

a = Analysis(["C:appmain.py"],
            pathex=["C:"],
            binaries=[],
            datas=[
                ("C:datainputuiltin*.xlsx", ".datainputuiltin"),
                ("C:datainput*.xlsx", ".datainput"),
                ("C:dataoutput", ".dataoutput"),
                ("C:log", ".log"),
                ("C:appdb", ".appdb")
            ],
            hiddenimports=["numpy", "pandas"],
            ...
            )
            
pyz = PYZ(a.pure, a.zipped_data,
            cipher=block_cipher)
            
exe = EXE(pyz,
         ...
         )

這其實就是一個python文件,只不過后綴是spec罷了。

.spec一共會有4個對象,分別是:Analysis、PYZ、EXE、COLLECT。

Analysis用處最多,一個個解釋:

第一個參數,是指定我們整個項目的主程序,也就是我們的入口文件。

pathex,就是我們的工作目錄

datas,存放我們的數據。

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

這和我們有什么關系呢?想一下,如果你的項目中需要去讀取某些文件,甚至是用戶的輸入參數,怎么辦?打包出來的exe 是沒有辦法通過直接指定參數,類似:python main.py --input=*.xlsx 來讀取文件的,因為我之前說了,在執行的時候會把項目解壓到一個臨時目錄,所以原來項目中寫好的相對路徑也不管用。

為此,我們需要把host上的實際文件給copy到那個臨時目錄下,所以這個datas的作用就是這個,我的文件中,我把host下的 C:datainputuiltin*.xlsx文件都copy到臨時目錄的 datainputuiltin 下面。

hiddenimports ,繼續說下去,PyInstaller有時候無法偵察到全部的依賴包,怎么辦?我們可以在這個后面加,把PyInstaller編譯出來的exe在運行的時候報的缺少模塊給寫里面。

??注意了: pandas 和 numpy 有個很奇怪的地方,就是引用了 pandas 的地方,如果沒有引用 numpy ,就會報錯。所以你可以在主入口上面加一個 import numpy 。

??注意了:直接 import numpy 還是會報錯。怎么辦?在 import numpy 下面加 import numpy.core._dtype_ctypes

5. 臨時目錄

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

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

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

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

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

這對代碼的改動是最小的。

6. 編譯打包

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

輸出中最后有 successfully 字樣,就算成功了。他也會告訴你,exe出現在哪個位置。

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

關注公眾號「Python專欄」,回復關鍵字:「spec」獲取完整項目spec文件。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43299.html

相關文章

  • Python把小姐姐的windows密碼改一改?

    摘要:我們來用實現一個修改開機密碼的小程序。的邏輯不復雜,核心代碼就一句話,通過模塊調用的,來達到修改密碼。控制,并修改密碼那么就是你想要修改的用戶名,一般有兩種操作,一種是直接修改他的,一種就是修改他現有的用戶。等待用戶雙擊即可。 showImg(https://img-blog.csdnimg.cn/20190302193115788.png?x-oss-process=image/wa...

    voyagelab 評論0 收藏0
  • 安利一下自己為 GitHub 開發的首個 Chrome 瀏覽器集成插件——GayHub?

    摘要:為了進一步提高閱覽體驗這個小目標,讓大家更方便的暢游,因此誕生了。溫馨提示不要打開這種巨無霸的開源,因為從接口拉取所有目錄文件名數據都需要幾分鐘。。。大屏全貌在大屏幕下,會展示所有的內容,在等小屏幕下默認只顯示側邊欄目錄樹,而默認是隱藏的。 github源碼地址:https://github.com/jawil/GayHub showImg(https://segmentfault....

    Astrian 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<