應公司要求,領導要對python程序進行打包處理。所以一場煎熬戰無聲打響,這個過程是最煩人,最沒有人願意幹的(明知道是個坑,還得跳!!!!!!!!)。要求是ubantu系統下,但是我的電腦是windows,所以現在windows下小試牛刀。。。。。不說了,開始正題:
1.在windows系統下
準備工作:1.windows10系統
2.python3.5.x
前言:
將python腳本打包爲可執行的exe文件是通常的需求,python也提供了許多的第三方庫,比如:bbFreeze,py2ese,pyinstaller,cx_Freeze,py2app等等。它們都各自有優缺點,經過查詢大量的文獻,我最終選擇了pyinstaller,因爲它操作起來相對比較簡單,而且有較好的支持。
1.安裝pyinstaller
方法一:離線安裝
先安裝依賴庫pywin32,然後下載pyinstaller,安裝方法如下(不推薦)。
方法二:在線安裝
(1)簡單粗暴,什麼也不用管。(注:下圖的安裝顯示是我已經安裝完的顯示。。。。。。)
pip install pyinstaller
(2)檢查是否安裝成功
pyinstaller --version
到此安裝結束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2.將我們想要打包的程序打包成.exe
(1)進入你要打包的python目錄內
(2)將你要打包的程序完整以及程序的依賴文件放到一個新的文件夾內
(3)執行打包命令pyinstaller test.py 即可。
下面來進行一個簡單的演示!!!!!!!!!!!!!!!!!!!!!!
我簡單的寫了一個測試文件pk_test.py.一個簡單的hello,word!
步驟一:進入你要打包的python目錄內
步驟二:將你要打包的程序完整以及程序的依賴文件放到一個新的文件夾內
注:比如需要pandas包,就將pandas放到pk_test.py的目錄中。(注意!網上說如果不放的話可能出錯,,但是我沒有放也沒有出錯,,,,,,,,,,玄學!!!!!!!!!!!!!如果報錯請檢查是否是因爲沒有放依賴的原因)
步驟三:執行打包命令pyinstaller test.py 即可。
執行完的結果如上圖所示:會生成許多依賴的文件包,,,不關心它們,,,只需要dist文件夾即可!!!進入dist,會有一個pk_test文件夾(****我們所需要的,請一併拷走****,不然會報錯),進入pk_test文件夾找到pk_test.exe雙擊即可!!
關鍵來了!!!!我雙擊pk_test.exe屏幕一閃而過!!!!然後就沒有然後了!!!!!!!於是,我在命令窗口中運行,,,,,,
頓時我哭了,什麼鬼!!然後接着查,,,,,,,,,,,,,,最後發現!應該和C++程序閃是一個道理!!於是,我又做了一番修正,,,然後編譯打包,,,,(沒有閃退!!!!!!!!)
修改如下:
import os
print('hello word!')
os.system('pause')
到此,簡單的打包已經結束!!!!!!!!!!!!!!!!!!!!!!!
3.測試一下稍複雜的程序
#!/usr/bin/env python
# encoding: utf-8
'''
@author: 真夢行路
@file: pk_test.py
@time: 2018/8/10 10:16
'''
import os
import numpy as np
import matplotlib.pyplot as plt
x=np.random.rand(100)
y=np.sin(x)
plt.figure()
plt.plot(x)
plt.show()
os.system('pause')
完美!!!!!!!!!!!!等等。。。。。。。後面怎麼有煩人的黑窗口。。。(接下來!!!!!)
4.打包命令的小操作。
在cmd窗口鍵入:pyinstaller -h就會出現pyinstaller的所用幫助說明。
pyinstaller -w -F pk_test.py
5.帶第三放庫以及讀取文件的測試
第三方庫選擇pandas和tensorflow,以及pandans需要用到的.csv文件。
準備:按照上述方法,將主函數test.py,以及數據文件夾data放到一個文夾中,執行打包命令。(沒有放pandans和tensflow安裝包)
運行:發現報錯,提示沒有找到pandas._lilbs.tslibs.np_datetime。難道是因爲我沒有把pandans放進去?於是,接着測試。
也沒有什麼用,應該不是這個問題,於是又是一番百度。終於找到了一種解決辦法!
解決辦法:1.找到自己電腦中的D:\python3.5\Lib\site-packages\PyInstaller\hooks目錄
2.新建一個文件名爲hook-pandas.py,寫入以下內容並保存。
#!/usr/bin/env python
# encoding: utf-8
'''
@author: 真夢行路
@file: hook-pandas.py
@time: 2018/8/10 13:03
'''
hiddenimports = ['pandas._libs.tslibs.timedeltas',
'pandas._libs.tslibs.nattype',
'pandas._libs.tslibs.np_datetime',
'pandas._libs.skiplist']
測試!!!!!!!!!!!!!!!!!!!!又發現新的報錯。
打包完成!!!!(而且pandas和tensorflow也自動打進去了)。
(注:在打包過程中也可能出現其他的報錯!目前我沒有遇到,如果遇到,大家嘗試解決!)
2.在ubantu系統中
準備工作:1.ubantu16.04
2.python3.5.x
3.pip
在ubantu系統中,使用python對.py文件打包成可執行程序與在windows下基本上沒有什麼區別,最主要的區別就是Linux命令的使用。下面就簡單的演示一下:(注:我使用的是pip安裝,習慣了)
1.安裝
(1)首先獲取root權限使用sudo -i 命,令,輸入密碼,獲取權限(當然也可以在執行命令前加sudo)
(2)使用pip3 install pyinstaller 進行安裝pyinstaller。(我的是python3所以用pip3)(原版本已經安裝完成!!故此顯示)
(3)檢查是否安裝成功
2.測試
測試跟windows一樣,(ubantu系統沒有閃退問題)就不多寫了。現測試一個python寫的函數庫調用,看能否打包成功。
準備:主文件test.py,調用文件hello.py。
打包:(1)按照官方文檔對多個文件打包要執行多文件命令(結果和windows一樣)
(2)找到dist文件夾下的test文件夾,執行test
根據結果來看,不管是主文件test.py,還是調用文件hello.py都執行成功。
注:我又測試了一下將test.py ,hello.py放到一個文件夾中,只打包test.py發現也能運行;然後將hello.py刪掉,然後再打包,打包失敗。
(注:在打包過程中也可能出現其他的報錯!目前我沒有遇到,如果遇到,大家嘗試解決!)
還有就是,如何打包二進制文件,如何更換圖標,如何在打包過程中如何新建文件夾以及子目錄,等等
具體其他的命令可以通過官方文檔查閱!