將Python腳本打包稱一個exe或者一個可運行的綠色程序,或者在linux中就是個可執行文件,不需要依賴Python環境了,很方便
寫了一個腳本要在他的電腦中運行,但是基本很多人沒有安裝python的環境和一些必要的庫,要是一個個安裝的話就很不方便了
所以可以使用pyinstaller來給程序打包,似乎還有其他的一些庫也可以實現,不過還是喜歡用這個,簡單粗暴,不過打包出來的exe確實挺大的,打包一時爽,打開五秒鐘。。。
1.使用的下載安裝的方式就這樣子
將需要打包的文件放在解壓得到的Pyinstaller文件夾中,打開cmd窗口,把路徑切換到當前路徑打開命令提示行,輸入以下內容(最後的是文件名):
2.使用的pip安裝方式就這麼來運行
打開cmd窗口,把路徑切換到文件所在路徑(文件隨便放在哪裡都行)打開命令提示行,輸入以下內容(最後的是文件名):
pip install pyinstaller 這個來安裝
注意的幾點:
1.打包的時候,py文件建議不要放在包含中文路徑下面的文件夾,不然容易出現錯誤,似乎一般都會出錯吧
2.打包好的程序顯示為亂碼的情況,這是編碼的問題,把第一行的#coding:utf-8 改成win dos的編碼方式,一般使用的是gbk,反正我每次gbk還是沒有亂碼
3.當出現打包成功,但是運行直接閃退的情況,這個時候可以在命令窗口中來看程序報的什麼錯誤,再調試
4.在打包使用到第三方庫的時候,若打包成功後運行失敗,找不到模塊的話,可以將這個庫複製一份到需要打包的文件目錄下
5.多進程打包的問題
正常情況下使用到多進程時在p』y』charm中運行時一切都Ok,很早之前寫的多進程的爬蟲,當我使用Pyinstaller打包成exe後,
每次程序都會發生錯誤,能運行,但是總是出錯,也就一直沒有去追究這個問題了,偶然間網上發現了解決的辦法,於是重新實驗下,
發現可以正常運行,這也就意味著我下次寫小工具的時候可以只用多進程來完成了,再打包成exe
github上的解決辦法:https:
1.Pyinstller版本應該在這個之間:3.0 < 3.3
2.創建一個mu.py文件,寫入以下代碼
import osimport systry: if sys.platform.startswith('win'): import multiprocessing.popen_spawn_win32 as forking else: import multiprocessing.popen_fork as forkingexcept ImportError: import multiprocessing.forking as forkingif sys.platform.startswith('win'): class _Popen(forking.Popen): def __init__(self, *args, **kw): if hasattr(sys, 'frozen'): os.putenv('_MEIPASS2', sys._MEIPASS) try: super(_Popen, self).__init__(*args, **kw) finally: if hasattr(sys, 'frozen'): if hasattr(os, 'unsetenv'): os.unsetenv('_MEIPASS2') else: os.putenv('_MEIPASS2', '') forking.Popen = _Popen3.在主程序中導入此模塊
import mu4.在主程序中導入,在if __name__ == 『__main__』: 後面加入 multiprocessing.freeze_support()
if __name__ == '__main__': multiprocessing.freeze_support()6.Pyinstaller打包exe後出現ImportError: No module named Queue的問題
在打包程序之後一切正常,但是在運行時報錯為:ImportError: No module named Queue
程序並沒有使用到此模塊
似乎是缺少queue模塊,但是打包應該是沒問題的
File 「site-packages\urllib3\packages\six.py」, line 92, in __get__File 「site-packages\urllib3\packages\six.py」, line 115, in _resolveFile 「site-packages\urllib3\packages\six.py」, line 82, in _import_moduleImportError: No module named 『queue』
之後使用
Pyinstaller -F –hidden-import=queue –icon=fun.ico pcap.pypause
不再提示此錯誤
–hidden-import MODULENAME,在打包過程中會屏蔽指定模塊7.tk打包程序時需要修改圖標可以這麼做
讀取ico圖標作為原始數據存在腳本中,然後再寫出來,再讀取
首先讀取這個ico
import base64
open_icon = open("icon.ico", "rb")b64str = base64.b64encode(open_icon.read())open_icon.close()write_data = "img = '%s'" % b64strf = open("icon.py", "w+")f.write(write_data)f.close()然後複製數據存放在腳本的變量中
img = 'AAEAgIAAAAEAIAAoCAEA'tmp = open("tmp.ico", "wb+")tmp.write(base64.b64decode(img))tmp.close()root = Tk()root.iconbitmap('./tmp.ico')root.resizable(False, False)root.title('log日誌匯總工具'.decode('gbk'))root.geometry('752x670')os.remove('tmp.ico')最後移除此文件
這樣pyinstall打包稱exe就可以正常使用,修改exe gui的圖標1.-F參數 直接生成單個exe文件首先cd 到這個文件的目錄下 pyinstaller -F test.py 生成的exe文件會在dist中 2.-D 參數 默認參數 生成一個和py文件名字相同的文件夾 裡面存放exe文件和各種依賴 這個exe需要和各個依賴在一起才能正常運行pyinstaller -D test.py 3.-w參數 生成的exe文件運行時沒有ui的,去掉了控制臺,簡單說就是沒有黑框框 4.–icon=path 指定打包時exe的圖標pyinstaller -F --icon=fun.ico database_test_py3_3.3.4.py
5.-c 使用控制臺,這是默認選項