用python寫的工具寫好了,想打包然後發給測試同事使用,最後選擇了PyInstaller,支持Windows、Linux、OS X,支持打包成一個文件夾或單個EXE文件。
我是直接在線安裝的,在CMD輸入:pip install pyinstaller
自動下載了PyInstaller-3.1.1.tar.gz和pypiwin32-219-cp27-none-win_amd64.whl並安裝。
如果不行也可以去官網自己下載安裝(http://www.pyinstaller.org/),不過應該要先安裝pypiwin32。
安裝後,把要打包的文件main.py(界面),b.py(邏輯,在main中調用),config.ini(配置文件)複製到F:\pkg
在CMD中進入F:\pkg,輸入:pyinstaller main.py
然後就在F:\pkg生成build和dist文件夾和一個main.spec配置文件,dist下就是打包好的文件了,運行main.exe,一閃就沒了,在CMD再次運行,報錯是找不到ini文件,把ini複製到dist下,再次運行,可以了。
但是運行main.exe後,會多出一個CMD窗口。後面搜索後查找有一個參數-w, --windowed, --noconsole
可以關閉控制窗口。
刪除打包的文件,重新打包:pyinstaller -w --windowed --noconsole main.py
將config.ini複製過去後再次運行,OK了,這次沒有控制窗口了,不過程序在調用subprocess時,仍會閃現一下控制窗口,不過沒關係了,這也算間接提示我命令運行了吧。但我的程序後來還遇到個問題,有個函數以此方法打包,會無法調用。
然後再想,打包不可能需要手動複製ini文件的,應該可以一起打包進去。
再次查詢pyinstaller的官方wiki,發現可以編輯main.spec實現。類似這樣
a = Analysis(…
datas=[ ('src/README.txt', '.') ],
…
)
只要修改datas元組就可以了。第一參數是文件目錄,第二個參數是放在打包好的文件的目錄,'.'就是首級目錄了
修改後,再運行命令pyinstaller -w --windowed --noconsole main.spec
OK了,這次打包的時候直接就把config.ini打進去了
以上打包都是打成一個文件夾,後來試了下打成單個EXE
命令:pyinstaller -F -w --windowed --noconsole main.py
然後同樣把config.ini複製過去就OK了
然後我們可以加個圖標。首先找個圖片,然後百度一個icon網站,轉換一下格式,我選的大小是128*128
將保存的圖片ico.ico放到F:\pkg
輸入命令:pyinstaller -F -w --windowed --noconsole -i ico.ico main.py
這樣,打出來的文件圖標就是自己的了