將python打包爲exe可執行文件—Pyinstaller工具

python是腳本語言,若是你在開發機器上執行固然會很方便,但是若是你幫他人寫了個腳本,想在他人機器上運行,可能會遇到點困難。html

爲了讓腳本在他人機器上順利執行,你首先要幫他安裝python解釋器,若是你import了一些庫好比pandas,那這個也須要安裝,甚至相關的依賴也須要安裝。這個時間成本顯然是很大的,這部分工做也很枯燥,甚至會影響工做積極性,所以花一點時間,學會如何將python腳本打包爲.exe文件,無需再安裝各類開發環境和依賴庫,是一件一勞永逸的事情。python

如今,主流的工具備Pyinstaller、cz_Freeze、py2exe,本文只介紹Pyinstaller的使用。windows


準備工做

1.開發環境和工具:工具

  • python 3.7
  • Pyinstaller 3.4
  • windows 10
Pyinstaller能夠支持Python 2.7 和3.4—3.7。*

2.要打包的文件myscript.py源碼:ui

import pandas as pd

df = pd.read_excel('D:/account.xls')
result = dr.dropna()
result.to_excel('D:/result.xls')
該源碼包含pandas, xlrd, xlwt等庫

3.在windows上安裝Pyinstaller.net

  • 根據Pyinstaller官方表述,在windows上安裝Pyinstaller須要先安裝pywin32 或 pypiwin32, 不然待會兒轉換時,會提示沒法找到win32com模塊的錯誤,雖然報錯缺win32com,但你要清楚缺的實際上是pywin32 或 pypiwin32。
  • 先用下面pip命令查看本身是否已安裝該模塊:
pip list
  • 若是沒有找到,在pywin32下載地址下載對應版本的pywin32,或者直接用下面命令安裝pypiwin32:
pip install pypiwin32
  • 最後安裝Pyinstaller:
pip install pyinstaller

開始打包

  • 可使用下面命令打包
pyinstaller myscript.py

該命令執行後, pyinstaller會分析myscript.py文件,而且在腳本script.py所在文件夾中:命令行

  • 生成myscripy.spec
  • 建立文件夾build
  • 在build文件夾中生成日誌文件和運行所需文件
  • 建立dist文件夾
  • 在dist文件夾中建立可執行文件夾myscript,在myscript文件夾中,就能夠找到myscript.exe可執行文件
  • 上面命令生成了不少依賴文件,若是想打包爲獨立單一的.exe文件,使用-F參數
pyinstaller -F myscript.py
  • 默認生成的執行文件執行時,會彈出一個命令行的窗口,若是不須要彈出,能夠再加個-w參數
pyinstaller -F -w myscript.py

遇到的問題

打包過程當中不免會遇到問題,通常都會遇到缺乏模塊的問題,好比,在對myscript.py打包時會報錯ModuleNotFoundError,缺乏xlrd, xlwt等模塊,通常來講能夠按照下面三個步驟進行解決:
1.Pyinstalled會從本地的環境路徑下找須要的模塊,例如python的包都放在site-packages目錄下,所以,Pyinstalled能夠直接從該目錄下獲取須要的模塊。若是本地也缺乏該模塊,先經過pip命令安裝。例如:日誌

pip install xlrd
pip install xlwt

2.若是你須要的模塊不在site-packages,而在你指定的目錄下,那打包時你能夠經過-P DIR參數指定,其中DIR爲你須要的模塊路徑:excel

pyinstaller -F -w -p DIR myscript.py
-p命令容許指定多個模塊路徑,能夠用 :分隔,或者屢次使用這個參數,像這樣: pyinstaller -p DIR1:DIR2:DIR3 myscript.pypyinstaller -p DIR1 -p DIR2 -p DIR3 myscripy.py

3.有時候並非找不到模塊,而是代碼中有些模塊是隱含導入的,這樣的話就須要指出這些模塊,才能正確的打包,能夠在命令行打包時使用參數--hidden-import MODULENAME指定模塊名,或者能夠在打包後生成的myscript.spec文件中修改,該文件中有個參數hiddenimports=[]
配置爲:code

hiddenimports=['cython','sklearn','sklearn.ensemble','sklearn.tree._utils','scipy._lib.messagestream']

而後再運行如下命令

pyinstaller myscript.spec

到此本片文章結束。

若是遇到什麼問題,歡迎你們和我交流。若有不對之處,還望指正。

參考:

  1. https://pyinstaller.readthedo...
  2. https://blog.csdn.net/windows...
  3. https://zhuanlan.zhihu.com/p/...
  4. https://zhuanlan.zhihu.com/p/...
  5. https://www.jianshu.com/p/95c...
相關文章
相關標籤/搜索