前幾篇寫了一些將python代碼打包成exe工具的文章,很多朋友私下問我,是通過什麼工具操作的,如何是使用,今天就詳細給大家介紹一下這個工具的使用。
Pyinstaller這個庫是我用pip下載的第一個模塊。為什麼?因為第一次接觸python的時候,就是看到網上有人用Python編寫的工具,可以直接運行在windows機器下。
這種脫離編譯環境/虛擬機而單獨運行的能力是我一直期待的,有人會問為什麼不學c++?
因為,這老哥頭髮讓我有些慌....
然後我上網搜了一下python,當看到python之父那茂密的頭髮時,更堅定了我學習python的信念。(可惜的是大兄弟最近已宣布退休了)
由於我這人沉不住氣,一分鐘學習了python安裝+print輸出,就急著去網上搜索如何打包寫好的代碼,轉化為exe文件....順著這條主線安裝了pip,公司內外網隔離,又千般周折找到了公司自身的鏡像源。修改鏡像默認配置後完成了pyinstaller的下載後,終於趕在日落西山前將我這一行print代碼打包成了exe文件,發給同事炫耀。
現在想想好幼稚...
也許就是因為pyinstaller這傢伙,導致我的python路線直接跳過基礎,從easygui和tkinter開始了...
有exe如果再能配上GUI,那豈不是裝13必備。但在沒有基礎的前提下去學這些東西,可想而只當時有多苦B。
最終慢慢玩膩了,才重新一步步從基礎開始學起。
最近項目在做一個集成打包工具,需要在Linux環境下將很多基礎環境通過腳本進行自動化的打包、安裝、運行。本來是打算通過shell完成了,但由於模塊很多,又牽扯大批量的配置文件,所以最終選擇了python。但最終客戶方要求,執行的腳本可以在一臺全新的網絡隔離的機器上進行運行。這就苦惱了,因為python雖然配置了requirement,但還是依賴鏡像源去下載模塊。雖然當時想到了pyinstaller,但可惜使用它在windows環境下使用的,這次是Linux環境。然後上網搜了一圈,最終又回到了pyinstaller....
PyInstaller is a program that converts (packages) Python programs into stand-alone executables, under Windows, Linux, Mac OS X, AIX and Solaris.Its main advantages over similar tools are that PyInstaller works with any version of Python since 2.3, it builds smaller executables thanks to transparent compression, it is fully multi-platform, and uses the OS support to load the dynamic libraries, thus ensuring full compatibility.
突然想起一首蕭亞軒的歌「最熟悉的陌生人」(是否暴露了年齡...),很多時候我們對身邊自認為熟識的東西,反而遺漏了太多。
安裝
pip install pyinstaller
注意
windows下使用它時,需要依賴pywin32模塊,好在這個模塊從3.3那時的exe安裝,已經遷移到了pip,默認安裝時,可以安裝此依賴。
Linux下使用它時,需要依賴python-devel 。往往python在首次編譯時就要添加此依賴。否則後期需要重新編譯安裝...
配置
windows下pyinstaller安裝完成後,會在{PythonPath}/Scripts下,python2很多版本沒有默認將次目錄添加至環境變量,需要手動進行添加。
linux下此目錄在${PythonPath}/bin下,需要創建連結後進行使用。
ln -s {PythonPath}/bin/pyinstlaler /usr/bin
-o DIR,
-out=DIR
指定spec文件的生成目錄,如果沒有指定,而且當前目錄是PyInstaller的根目錄,會自動創建一個用於輸出(spec和生成的可執行文件)的目錄.如果沒有指定,而當前目錄不是PyInstaller的根目錄,則會輸出到當前的目錄下.-p DIR,
-path=DIR
設置導入路徑(和使用PYTHONPATH效果相似).可以用路徑分割符(Windows使用分號,Linux使用冒號)分割,指定多個目錄.也可以使用多個-p參數來設置多個導入路徑,讓pyinstaller自己去找程序需要的資源–icon=<FILE.ICO>將file.ico添加為可執行文件的資源(只對Windows系統有效),改變程序的圖標 pyinstaller -i ico路徑 xxxxx.py–icon=<FILE.EXE,N>將file.exe的第n個圖標添加為可執行文件的資源(只對Windows系統有效)-v FILE,
-version=FILE
將verfile作為可執行文件的版本資源(只對Windows系統有效)-n NAME,
-name=NAME
可選的項目(產生的spec的)名字.如果省略,第一個腳本的主文件名將作為spec的名字看這參數這麼多,其實很簡單....
通用參數-p
這個參數如說明所示,雖然pyinstaller可以將代碼import導入的依賴包進行打包,但有時,我們自己開發的代碼,可能會忽視,那就需要我們通過-p 參數手動引入了
-F
默認pyinstaller打包後,會將依賴文件和執行文件打包成一個文件夾的,如果使用-F參數,則可以將所有依賴打包成一個單獨的文件,windows為exe文件,linux 直接 chmod +x filename即可執行....
好了,通用的就這倆
說那麼多不如看個圖來的方便,我們用pyinstaller打包一個簡單的Flask程序,看看能否成功吧:
我們看到使用pyinstaller 打包程序時,會顯示生成build將工具依賴的文件放入,然後進行打包操作生成代碼文件同名並以spec的配置文件,最終將打包成功的exe保存在dist文件夾內。
大家注意為什麼第一次執行的時候提示server error。因為雖然我們將python文件打包了,但是Flask依賴的html模板文件它時不支持打包的,需要我麼單獨拷貝到對應的文件中,才能執行....