【01】Python打包輸出為.exe可執行文件


博客遷移。歡迎訪問 stevehawk.tk

Python打包輸出為.exe可執行文件

  在完成了之前的爬蟲以后,為了給電腦上沒有Python環境的朋友玩我的爬蟲,開始嘗試把爬蟲的.py文件輸出成.exe可執行文件。

  首先,Python的教程上提到了py2exe的模塊。但是一波搜索以后發現這個玩意只支持到Python3.4,而我用的是Python3.5.2,這讓我很尷尬......於是繼續一波搜索,發現了一個叫PyInstaller的模塊。這個模塊可以完美支持Python3.5,於是怒入。

  首先是安裝。下載地址為:https://github.com/pyinstaller/pyinstaller/releases/download/v3.2/PyInstaller-3.2.zip

  如果有更新的版本可以在官方網站上下載:http://www.pyinstaller.org/

  下載完以后,解壓這個zip文件。然后用管理員權限運行命令提示符(在小娜里輸入cmd,上面搜索結果里的命令提示符右擊以管理員權限運行),進入你解壓出來的文件夾路徑。(操作方法:進入別的盤符輸x:,例如d:  ;然后cd x:\.....你的目錄,例如cd D:\MyPrograms\python\,不懂可以自行百度)。然后輸入以下指令:

python setup.py install

  然后等待一會,應該就可以完成安裝。檢驗是否安裝成功可以使用以下語句:

pyinstaller --version

  如果有一個版本號的回應,說明安裝成功了。如果沒有反應,說明沒有安裝成功,看一下報錯信息,很有可能是一個東西沒有安裝:pywin32模塊。

  先嘗試在管理員權限的命令提示符里輸入:

pip install pywin32

  如果報錯就再試幾次。如果還是不行,那就用手動下載離線包的安裝方法:

  打開以下網頁:https://sourceforge.net/projects/pywin32/files/pywin32/

  然后在列表里選擇最新的(數字最大的)build。點開目錄,在目錄下尋找適合自己的安裝包。以build 220為例,文件夾下有一個zip和一片exe。在exe文件中,都是以pywin32-220開頭,這是版本號。后面有兩種,win-amd64和win32,分別對應64位和32位的版本,可以根據系統的不同位數選擇,如果不清楚,選擇win32的即可。然后后面會跟着py*.*,這是Python的版本號,我們現在用的一般都是Python3.5.2,所以選擇py3.5的那個,即pywin32-220.win-amd64-py3.5.exe或者pywin32-220.win32-py3.5.exe(這兩個鏈接是下載傳送門)。如果有使用不同python版本的請自行進入網站對號入座下載安裝包。

  下載完以后,直接雙擊運行。一般就是無腦next即可。

  安裝完pywin32以后,再次重復之前的安裝操作,應該就可以解決問題了。

  然而根據后來幫舍友安裝的經歷來看,如果還是有報錯,那有可能還有一個模塊沒有安裝:future

  用線下安裝包的方法太煩,於是直接打開管理員權限的命令提示符,鍵入以下指令:

pip install future

  如果下到一半出錯,多半是下載時候連接超時,因為是國外網站,所以可以多試幾次,有條件的搭個梯子。

  安裝完成以后再重復pyinstaller的安裝操作,應該就可以了。

  以上操作是來自官方文檔和網上別人的各種博客和后來的部分實踐,理論上應該可以,可是我當時沒有看官方文檔於是語句有問題,沒有成功實現以上操作。大家可以先試試,如果不行麻煩告知我。於是(懶惰的)機智的我走了另一條捷徑。

  到這里我才發現Windows下也可以像Linux一樣很方便的用命令行安裝程序。如果你的電腦已經安裝好Python,有pip的話,就可以打開cmd(管理員權限),然后鍵入以下指令:

pip install PyInstaller

  然而,如果是國內網,可以無視這一條方法了。必報錯。請在啟動木制爬高工具以后執行這條指令。如果有權限的報錯,請務必用管理員權限運行cmd。

  然后就可以非常非常爽快的安裝完這個模塊了,而且會自動幫你裝pywin32模塊以及future模塊(如果沒有的話),安裝完甚至會提示你的pip可以更新了(如果版本太老的話).....簡直太良心了好嘛.....唯一的缺點就是不搭梯子沒法用。

  至於木制爬高工具是什么,請自行谷歌(手動斜眼)。

  安裝完以后,就可以用這個模塊愉快的把你的py編譯成exe給小伙伴裝逼啦!!hhhhh

  然而還沒這么簡單。編譯有兩種方法:命令行方式和直接Python文件調用方法。

首先是命令行方式:

  在命令行下進入你的py文件所在目錄(操作方法和之前一樣)

  然后輸入以下指令:(***.py為你要編譯的文件名)

pyinstaller ***.py

  然后等待編譯完,在該目錄下會新生成四個東西,一個***.spec文件(***和你的py文件同名),一個__pycache__文件夾,一個dist文件夾和一個build文件夾。你要的exe就在dist文件夾里。但是,拷給小伙伴的時候記得把整個文件夾都拷給他們,這一整個文件夾都是exe的一部分。(其他的都是編譯過程中的中間文件,輸出完就可以刪掉了)

  你一定想,這么多東西真是麻煩啊,怎么只輸出一個exe呢?那就要加一個單文件的參數-F,如下:

  (其實可用的參數還有不少,在法二中介紹)

pyinstaller -F ***.py

  然后你就會愉快的發現這時候dist下只有一個exe啦哈哈哈可以愉快的裝逼啦wwwww

  でも!!還有更方便的方法!

直接Python文件調用方法:

  在Python中直接調用這個模塊,會比cmd更方便,至少我是這么認為的。至少,以后再要輸出只要把這個文件復制一波,改一兩個參數就可以了,簡直爽啊。

方法如下:

  首先,在要編譯的***.py同目錄下創建一個py文件:TargetPy2exe.py(當然其他隨便xjb一個名字都可以)

  然后,在其中寫入以下代碼:

1 #code by STeveHawk
2 #Email stevehawk@qq.com
3 
4 from PyInstaller.__main__ import run
5 if __name__ == '__main__':
6     opts = ['***.py','-F',r'--distpath=**',r'--workpath=**',r'--specpath=**',r'--icon=**']
7     run(opts)

  調整完參數運行就可以輸出exe了。

  代碼中,opts= 后面的列表里的就是一系列參數,詳解如下:

  第一個***.py就是你要編譯的文件名,必填 [之后的參數全部為選填]

  第二個-F就是生成單文件的參數

  第三個--distpath=**意思是dist文件夾(最后輸出文件所在地)的路徑,**為路徑,比如D:\My Programs\Python\輸出\dist,默認為當前目錄下的dist文件夾內

  第四個--workpath=**意思是build文件夾(臨時文件)的路徑,**為路徑,比如D:\My Programs\Python\輸出\build默認為當前目錄下的build文件夾內

  第五個--specpath=**意思是***.spec文件(臨時文件)的路徑,**為路徑,比如D:\My Programs\Python\輸出\,默認為當前目錄

  第六個--icon=**意思是輸出的exe文件的圖標路徑,**為路徑,比如D:\My Programs\Python\icon.ico 

  對於圖標,最好到一個叫png2ico的網站上在線生成你所需的ico圖標文件,注意,直接把一個jpg圖片文件改后綴成.ico會報錯 [我一開始就是刷小聰明在這上面耗了好久才發現問題的....(捂臉)]。在png2ico上轉換圖片的時候,大小記得點auto,這樣生成的ico文件會內置四種大小的圖標以供系統縮放的需求。

  后面四個參數里的路徑也可以不用像我一樣用絕對路徑,可以使用簡單的相對路徑。例如你想生成dist,build,spec的目標路徑是TargetPy2exe.py所在文件夾里的一個文件夾output,你的三個路徑就可以輸成相對路徑.\output\dist 和 .output\build 和 .output\ ,當然三個未必在同一個文件夾里,僅供示例。

  注意,我在后四個參數的引號前面都加上了r,這是因為不加r會出現各種問題,例如反斜杠導致的轉義字符搗亂,以及有些中文目錄名里的中文會變成16進制的utf-8碼來顯示導致路徑錯誤。在這些字符串前加上r(raw)以表示原始字符串就能解決這些問題了。

  其實,pyinstaller能用的參數還不止這幾個,還有能添加搜索路徑的參數(我也不太懂這個是啥),以及一個--clean參數說是可以清除臨時文件,然而我測試的時候發現貌似並沒有什么luan用.......附上官方文檔地址,英語大神可以嘗試閱讀。

https://pyinstaller.readthedocs.io/en/stable/

32 & 64位的問題

  另外,關於輸出exe文件的32位和64位的問題。這個問題的起因是我的電腦上安裝了64位的Python環境,然后用pyinstaller輸出的exe文件就是64位的了。然而小伙伴的電腦是32位的,於是妥妥的沒法運行了。這就讓我很尷尬了.....沒法好好裝逼了不是...於是怎么輸出32位的exe呢?其實很簡單,你的Python環境是32位的,輸出的exe就會是32位的,64位的就會輸出64位的。如果你想既輸出32位的,又輸出64位的,以下是方法:

  首先分別安裝32位和64位的Python環境,並分別安裝pyinstaller。切記,安裝完一個環境就要立馬用pip install pyinstaller安裝pyinstaller。如果已經裝完了兩個環境再安裝pyinstaller,會有一個環境安裝成功,但是再次運行會提示已經安裝,另一個環境會無法成功安裝。成功給兩個環境裝好pyinstaller了以后,如果用cmd命令行的方式調用會出現問題,至少我的電腦上會有這個問題。目前我還不清楚怎么在cmd下分別調用兩個環境。這時候Python文件調用的方法就會方便很多。以我使用的pycharm為例,顯然要編譯的***.py和TargetPy2exe.py是在同一個工程下的。這時,在File選項卡下,打開Setting選項,在Setting窗口左側欄中找到Project:***(***為工程名)選項,點擊左側灰色三角打開下拉菜單,里面點擊Project Interpreter選項,然后在右側窗口里上面的下拉菜單里選擇所需的32位或者64位解釋器。選好以后點擊下面的OK即可。第一次可能需要等待一會才能運行。然后運行TargetPy2exe.py就可以生成你要的32/64位的exe啦!!

  不過這只是對於我這種強迫症類型的人適用的方法。如果嫌煩,只需要裝一個32位的Python環境就可以了,因為64位系統下可以兼容32位的程序.....這是最簡單的解決辦法。

以上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM