一、前言
將做好的Python軟件運行在樹莓派上時,不想公開源碼,就需要對文件進行封裝(或稱打包),本文主要介紹使用pyinstaller封裝Python代碼為可執行程序。
Python是一個腳本語言,被解釋器解釋執行。它的發布方式:(來自文章david++)
-
.py文件:對於開源項目或者源碼沒那么重要的,直接提供源碼,需要使用者自行安裝Python並且安裝依賴的各種庫。(Python官方的各種安裝包就是這樣做的)
-
.pyc文件:有些公司或個人因為機密或者各種原因,不願意源碼被運行者看到,可以使用pyc文件發布,pyc文件是Python解釋器可以識別的二進制碼,故發布后也是跨平台的,需要使用者安裝相應版本的Python和依賴庫。在樹莓派上運行.py文件時,有時會自動生成.pyc的文件,並且該文件如果作為模塊,可被其他文件正常引用。
-
可執行文件:對於非碼農用戶或者一些小白用戶,你讓他裝個Python同時還要折騰一堆依賴庫,那簡直是個災難。對於此類用戶,最簡單的方式就是提供一個可執行文件,只需要把用法告訴Ta即可。比較麻煩的是需要針對不同平台需要打包不同的可執行文件(Windows,Linux,Mac,...)。
本文主要介紹第三種方式,之前在運行.py或.pyc文件時,需要在命令行中輸入:python filename.py,通過對.py文件封裝(不能封裝.pyc文件),直接用鼠標雙擊生成的文件,可直接運行代碼。
各種打包工具的對比如下:
Solution | Windows | 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 |
樹莓派的官方推薦系統為Raspbian(基於Debian系統),本文采用pyinstaller工具
二、安裝pyinstaller
方式一:直接使用pip安裝(強烈不推薦,可以安裝成功,但是不能直接運行):
$pip install pyinstaller
方式二:
1.官方下載源碼(點擊鏈接即可下載,支持Python版本 2.7, 3.4–3.7):https://github.com/pyinstaller/pyinstaller/tarball/develop
2.打開終端,cd到下載的壓縮包(例如我直接下到桌面上),解壓文件:
$cd Desktop
$tar -zxvf PyInstaller-3.4
瀏覽了無數博客,大多到了這一步,就直接開始打包.py文件,但是在樹莓派上會不斷報錯(報錯內容不記得了,但是生成的兩個文件夾中的dist內沒有文件),經過痛苦的找答案過程,終於在官方文檔中找到了答案(文檔鏈接):
$cd bootloader
$python ./waf distclean all
3.打包文件:
我是用來打包web項目的啟動文件(項目目錄:/home/pi/Desktop/myproject,啟動文件為:web_server.py):
$python /home/pi/Desktop/PyInstaller-3.4/pyinstaller.py -F /home/pi/Desktop/myproject/web_server.py
在項目目錄中生成兩個文件夾及一個web_server.spec文件,其中在dist文件夾中有一個可執行文件。
將此文件復制到上級目錄(也就是跟web_server,py的同級目錄下),雙擊執行即可。
(如運行web的啟動程序報import錯誤,建議采用間接方式啟動,如:新建web_server01.py,代碼為:
import os os.system('python /home/pi/Desktop/myproject/web_server.pyc')
將該文件封裝,運行封裝后的文件,可解決此問題)