將Python腳本打包成可執行文件

Python是一個腳本語言,被解釋器解釋執行。它的發佈方式: python

·      .py文件:對於開源項目或者源碼沒那麼重要的,直接提供源碼,須要使用者自行安裝Python而且安裝依賴的各類庫。(Python官方的各類安裝包就是這樣作的) git

·      .pyc文件:有些公司或我的由於機密或者各類緣由,不肯意源碼被運行者看到,可使用pyc文件發佈,pyc文件是Python解釋器能夠識別的二進制碼,故發佈後也是跨平臺的,須要使用者安裝相應版本的Python和依賴庫。 github

·      可執行文件:對於非碼農用戶或者一些小白用戶,你讓他裝個Python同時還要折騰一堆依賴庫,那簡直是個災難。對於此類用戶,最簡單的方式就是提供一個可執行文件,只須要把用法告訴Ta便可。比較麻煩的是須要針對不一樣平臺須要打包不一樣的可執行文件(Windows,Linux,Mac,...)。 網絡

本文主要就是介紹最後一種方式,.py和.pyc都比較簡單,Python自己就能夠搞定。將Python腳本打包成可執行文件有多種方式,本文重點介紹PyInstaller,其它僅做比較和參考。 app

Freezing Your Code ide

各類打包工具的對好比下(來自文章Freezing Your Code): 工具

Solution ui

Windows spa

Linux 操作系統

OS X

Python 3

License

One-file mode

Zipfile import

Eggs

pkg_resources support

bbFreeze

yes

yes

yes

no

MIT

no

yes

yes

yes

py2exe

yes

no

no

yes

MIT

yes

yes

no

no

pyInstaller

yes

yes

yes

no

GPL

yes

no

yes

no

cx_Freeze

yes

yes

yes

yes

PSF

no

yes

yes

no

py2app

no

no

yes

yes

MIT

no

yes

yes

yes

PS.其中pyInstaller和cx_Freeze都是不錯的,stackoverflow上也有人建議用cx_Freeze,說是更便捷些。pkg_resources新版的pyInstaller貌似是支持的。

安裝PyInstaller

對於那些網絡比較穩定,可以流暢使用pip源地址的用戶,直接下面的命令就能夠搞定:

pip install pyinstaller

一般咱們會下載源碼包,而後進入包目錄,執行下面的命令(須要安裝setuptools):

python setup.py install

安裝完後,檢查安裝成功與否:

pyinstaller --version

安裝成功後,就可使用下面的命令了:

·         pyinstaller : 打包可執行文件的主要命令,詳細用法下面會介紹。

·         pyi-archive_viewer : 查看可執行包裏面的文件列表。

·         pyi-bindepend : 查看可執行文件依賴的動態庫(.so或.dll文件)

·         pyi-... : 等等。

使用PyInstaller

pyinstaller的語法:

pyinstaller [options] script [script ...] | specfile

最簡單的用法,在和myscript.py同目錄下執行命令:

pyinstaller mycript.py

而後會看到新增長了兩個目錄build和dist,dist下面的文件就是能夠發佈的可執行文件,對於上面的命令你會發現dist目錄下面有一堆文件,各類都動態庫文件和myscrip可執行文件。有時這樣感受比較麻煩,須要打包dist下面的全部東西才能發佈,萬一丟掉一個動態庫就沒法運行了,好在pyInstaller支持單文件模式,只須要執行:

pyinstaller -F mycript.py

你會發現dist下面只有一個可執行文件,這個單文件就能夠發佈了,能夠運行在你正在使用的操做系統相似的系統的下面。

固然,pyinstaller還有各類選項,有通用選項,如-d選項用於debug,瞭解pyInstaller執行的過程;還有一些針對不一樣平臺的選項,具體用法能夠訪問PyInstaller官方WIKI

在執行pyInstaller命令的時候,會在和腳本相同目錄下,生成一個.spec文件,該文件會告訴pyinstaller如何處理你的全部腳本,同時包含了命令選項。通常咱們不用去理會這個文件,若須要打包數據文件,或者給打包的二進制增長一些Python的運行時選項時...一些高級打包選項時,須要手動編輯.spec文件。可使用:

pyi-makespec options script [script ...]

建立一個.spec文件,對於手動編輯的.spec文件,咱們可使用下面任意一條命令:

pyinstaller specfile

pyi-build specfile

PyInstaller的原理簡介

PyInstaller其實就是把python解析器和你本身的腳本打包成一個可執行的文件,和編譯成真正的機器碼徹底是兩回事,因此千萬不要期望成打包成一個可執行文件會提升運行效率,相反可能會下降運行效率,好處就是在運行者的機器上不用安裝python和你的腳本依賴的庫。在Linux操做系統下,它主要用的binutil工具包裏面的ldd和objdump命令。

PyInstaller輸入你指定的的腳本,首先分析腳本所依賴的其餘腳本,而後去查找,複製,把全部相關的腳本收集起來,包括Python解析器,而後把這些文件放在一個目錄下,或者打包進一個可執行文件裏面。

能夠直接發佈輸出的整個文件夾裏面的文件,或者生成的可執行文件。你只須要告訴用戶,你的應用App是自我包含的,不須要安裝其餘包,或某個版本的Python,就能夠直接運行了。

須要注意的是,PyInstaller打包的執行文件,只能在和打包機器系統一樣的環境下。也就是說,不具有可移植性,若須要在不一樣系統上運行,就必須針對該平臺進行打包。

參考資料

1.    Freezing Your Code

2.    PyInstaller官方WIKI

3.    PyInstaller源碼

相關文章
相關標籤/搜索