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

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

  • .py文件:對于開源項目或者源碼沒那么重要的,直接提供源碼,需要使用者自行安裝Python并且安裝依賴的各種庫。(Python官方的各種安裝包就是這樣做的)

  • .pyc文件:有些公司或個人因為機密或者各種原因,不愿意源碼被運行者看到,可以使用pyc文件發布,pyc文件是Python解釋器可以識別的二進制碼,故發布后也是跨平臺的,需要使用者安裝相應版本的Python和依賴庫。

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

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

Freezing Your Code

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

SolutionWindowsLinuxOS XPython 3LicenseOne-file modeZipfile importEggspkg_resources support
bbFreezeyesyesyesnoMITnoyesyesyes
py2exeyesnonoyesMITyesyesnono
pyInstalleryesyesyesnoGPLyesnoyesno
cx_FreezeyesyesyesyesPSFnoyesyesno
py2appnonoyesyesMITnoyesyesyes

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工具包里面的lddobjdump命令。

PyInstaller輸入你指定的的腳本,首先分析腳本所依賴的其他腳本,然后去查找,復制,把所有相關的腳本收集起來,包括Python解析器,然后把這些文件放在一個目錄下,或者打包進一個可執行文件里面。

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

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

參考資料

  1. Freezing Your Code
  2. PyInstaller官方WIKI
  3. PyInstaller源碼
分類: Linux::Code

轉載于:https://www.cnblogs.com/qqhfeng/p/5283313.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396631.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

float foo=42e1為什么錯_為什么重寫了equals()也要重寫hashCode()

小Hub領讀:雖然是很基礎的一篇文章,但是對于equals、hashcode兩個方法,相信很多人都與其中的規則不熟悉,來跟著小Hub花個8分鐘回顧一下!作者:不學無數的程序員https://my.oschina.net/u/4030990/blog/31341…

ssh客戶端_一款基于TAS框架的SSH客戶端蠕蟲

TEA是一款基于TAS框架的SSH客戶端蠕蟲,從本質上說,它是一個仿冒的SSH客戶端,它能夠修改tty輸入/輸出來實現任意命令執行,或通過SSH連接來上傳自身以實現滲透感染。為了實現該工具的正常功能,遠程主機需要滿足以下條件&…

Selenium入門11 滾動條控制(通過js)

這一節要有js基礎。做web端的UI自動化必須要有html,css,javascript前端基礎。 滾動條控制: 1 移動垂直滾動條 document.documentElement.scrollTop 2 移動垂直滾動條 document.documentElement.scrollLeft 3 找到某個元素,移動到可…

Qt之QNetworkInterface

簡述 QNetworkInterface類負責提供主機的IP地址和網絡接口的列表。 QNetworkInterface表示了當前程序正在運行時與主機綁定的一個網絡接口。每個網絡接口可能包含0個或多個IP地址,每個IP地址都可選擇性地與一個子網掩碼和/或一個廣播地址相關聯。這樣的列表可以通過…

第二周計劃

上周計劃回顧 3.5 ~ 3.11 數據: 評師網爬取,完成:2k條記錄 finished后端 數據結構 技術選型 學校API封裝未完成:后端負責人出差 工作暫停產品 功能設計:主要功能提交:原型圖 幾個頁面 每個頁面大概功能完成…

python編程軟件排行榜_PYPL 9月編程語言排行榜發布 Python一枝獨秀

開發者可以將 PYPL 作為一個參考,決定學習何種語言或 IDE,或者在新的軟件項目中使用何種語言或數據庫。9 月份的榜單如下:前五名分別是 Python、Java、JavaScript、C# 與 PHP。相比去年 9 月份的數據,除了 Python 大幅上漲了 4.5%…

分享到系統面板_win7電腦沒有nvidia控制面板怎么辦【解決方法】

我們在使用電腦的時候,當電腦顯卡出現問題導致屏幕畫面不清晰時,可以使用win7系統自帶nvidia控制面板,它能夠對顯卡進行設置,提升顯卡功能,不過很多電腦用戶點擊nvidia控制面板時卻提示nvidia顯示設置不可用&#xff0…

Python之數據加密與解密(hashlib、hmac、random、base64、pycrypto)--轉載

本文內容 數據加密概述Python中實現數據加密的模塊簡介hashlib與hmac模塊介紹random與secrets模塊介紹base64模塊介紹pycrypto模塊介紹總結參考文檔提示: Python 2.7中的str是字節串,而Python 3.x中的str是字符串。本文中的代碼都是通過Python 2.7實現的…

day3-文件操作之基本操作

一、文件的基本操作 文件內容: Somehow, it seems the love I knew was always the most destructive kind 不知為何,我經歷的愛情總是最具毀滅性的的那種 Yesterday when I was young 昨日當我年少輕狂1、read() 當read()函數中傳入整數(int)參數&#…

QT連接多種數據庫f方法及測試

QT提供了對多種數據庫的訪問支持,對SQL Server也可以通過ODBC來進行訪問。要想順利訪問SQL Server。 首先要保證以下幾點:1. QT編譯時已經編譯了QtSql2. 編譯了ODBC插件。可以通過 configure -plugin-sql-odbc來保證,也可以單獨編譯~/src/plu…

服務器如何實現電腦無線橋接,無線路由器WDS橋接成功副路由器下電腦無法上網怎么辦【解決方法】...

摘 要無線WDS橋接設置完成后,在副路由器管理面,運行狀態 無線狀態 中,WDS狀態顯示成功,但電腦通過副路由無法上網。該問題可能與主、副路由器的設置有關,如下圖所示: 解決辦法: 排查一&#xff…

spad 探測器_從光到光子—“單光子”探測器

光電探測器光電探測器是指在光輻射作用下將其非傳導電荷變為傳導電荷的一類器件。在電子學中,二極管是一種具有不對稱傳輸特性的雙端電子元件,在一個方向上對電流具有低(理想為零)電阻,在另一個方向上具有高(理想為無限)電阻。最常見的類型如…

天地圖專題五:在天地圖上繪制電子區域并保存數據

版權聲明:本文為博主原創文章,轉載請注明出處。 上一文章講了如何在天地圖上顯示坐標軌跡。 本文介紹如何在天地圖上繪制電子區域(電子范圍或電子柵欄),并且,我們要將我們繪制的電子區域的坐標數據保存到數…

Mysql中natural join和inner join的區別

假設有如下兩個表TableA,TableB TableA TableB Column1 Column2 Column1 Column3 1 2 1 3TableA的Column1列名和TableB的Column1列名相同。 SELECT * FROM TableA INNER JOIN TableB USING (Column1) SEL…

微信和支付寶的服務器在哪里,手機恢復出廠設置,里面支付寶與微信怎么辦?原來數據在這里...

當手機使用一段時間之后,因為硬件落后會出現卡頓、內存不足等情況,這個時候提高手機速度最直接的一個辦法就是恢復出廠設置,雖然不能從根源上解決問題,但是還是可以湊合個半年時間的。那么這個時候就出現一個問題,手機…

python線上編輯問題_python django - static文件處理與線上部署測試

static文件相關操作涉及:a. 文件位置與訪問路徑映射b. setting.py與static相關配置STATIC_URLSTATIC_ROOTSTATICFILES_DIRSc. html中對于static文件引用方式d. python manage.py collectstatic1. 開發環境-目錄結構2. setting.py 設置STATIC_URL /static/# STATIC_…

android arcgis 繪制圓_arcgis for android 定位 圓

不多說直接代碼 ,群里人共享的方法一: /*** 繪制圓,配合 cleargraphicLayer()清除** param center 圓心* param radius 半徑* param alpha 填充的透明度 0-100* param fillColor 填充的顏色*/public void DrawCircle(Point center, double radius, int a…

CreateSolidBrush

[聲明] WINGDIAPI HBRUSH WINAPI CreateSolidBrush(COLORREF color); [功能] 初始化一個指定顏色的畫刷。畫筆可以隨后被選為任何設備上下文的當前刷子。 [參數表] color 畫刷的顏色[返回值] Long,如函數執行成功,就返回指向新畫筆的一個句柄&#xff1b…

mysql insert 不需要日志_MySQL數據庫性能優化(1)「轉」

1、MySQL概述從本文開始我們將討論建立在塊存儲方案之上的關系型數據庫的性能優化方案和集群方案。關系型數據庫的選型將以創業公司、互聯網行業使用最廣泛的MySQL數據為目標,但是MySQL的安裝過程和基本使用方法等知識并不在我們討論的范圍內。后續幾篇文章我們首先…

javascript面試題以及對所涉及到的知識點的總結

前言 這幾天將js方面的知識系統的回顧了一遍,但是當嘗試去做一些面試題時覺得解決問題的能力以及效率還是有所欠缺,在這里特意記錄一下所做的面試題并總結所涉及到的相關知識點。 一、面試題、答案以及總結 1、截取字符串abcdefg的efg var str"abcd…