欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python使用pyinstaller將代碼打包為exe程序

 更新時(shí)間:2024年11月04日 10:20:52   作者:仙草哥哥  
這篇文章主要為大家詳細(xì)介紹了python如何使用pyinstaller將代碼打包為exe程序,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下

打包exe

對(duì)于不懂程序的人來(lái)說(shuō),可能有這樣一個(gè)認(rèn)識(shí)上的誤區(qū):只有能夠直接打開(kāi)的exe才是平常經(jīng)常見(jiàn)到的程序,py文件不能算是程序。

在這種情況下,一些python的使用者可能非常苦惱:怎么才能夠讓我的程序,看起來(lái)像是真正的程序呢?

實(shí)際上,通過(guò)pyinstaller,我們就可以輕松將python代碼打包為常見(jiàn)的exe程序,再也不會(huì)被他人看不起了(誤)。

基礎(chǔ)單文件

pyinstaller安裝

使用pip安裝pyinstaller:pip install pyinstaller

準(zhǔn)備文件

我們需要準(zhǔn)備一個(gè)需要打包的單文件,例如hello_world.py

print("hello world!!")
 
# 為了防止我們的程序太快直接結(jié)束看不出效果
# 我們添加一個(gè)input()阻塞程序
input()

如果按照平常的使用,應(yīng)該使用:python hello_world.py運(yùn)行程序

使用pyinstaller打包

使用指令:pyinstaller --onefile hello_world.py

此時(shí),會(huì)看到當(dāng)前目錄下已經(jīng)生成了很多文件

 在dist目錄下,就包含了我們已經(jīng)生成好的hello_world.exe,通過(guò)雙擊運(yùn)行,就可以看到程序運(yùn)行的結(jié)果。

隱藏控制臺(tái)窗口

如果你不需要一個(gè)控制臺(tái)窗口,可以添加--noconsole選項(xiàng)。

pyinstaller --onefile --noconsole main.py

注意:如果你不需要控制臺(tái)窗口,那么就不應(yīng)該使用像input這樣的需要控制臺(tái)的函數(shù)。

通常,對(duì)于gui程序,隱藏控制臺(tái)窗口是很有必要的。下面是一個(gè)簡(jiǎn)單的查看本地ip的例子(需要安裝requests庫(kù))。

import tkinter as tk
from tkinter import scrolledtext
import requests
 
 
def fetch_data():
    try:
        response = requests.get("http://httpbin.org/get")
        response.raise_for_status()
        data = response.json()
        info = f'您的當(dāng)前的ip地址是:{data.get("origin")}'
        
        text_area.delete("1.0", tk.END)
        text_area.insert(tk.END, info) 
    except requests.RequestException as e:
        text_area.delete("1.0", tk.END)
        text_area.insert(tk.END, f"請(qǐng)求失敗: {e}")
 
window = tk.Tk()
window.title("查看本地ip")
 
text_area = scrolledtext.ScrolledText(window, width=60, height=20)
text_area.pack(padx=10, pady=10)
 
 
fetch_button = tk.Button(window, text="獲取數(shù)據(jù)", command=fetch_data)
fetch_button.pack(pady=5)
 
window.mainloop()

對(duì)于這樣一個(gè)程序,實(shí)際上是完全用不到控制臺(tái)窗口的,所以隱藏窗口是更好的。

添加圖標(biāo)

默認(rèn)的圖標(biāo)是很丑的(如圖所示),如果我們需要我們的軟件有一個(gè)更好看的圖標(biāo),需要自己提供一個(gè)圖標(biāo)文件。

通過(guò)添加--icon=your_icon.ico選項(xiàng),來(lái)為你的程序設(shè)置圖標(biāo)。

pyinstaller --onefile --icon=my_icon.ico main.py

圖標(biāo)不應(yīng)該直接用一個(gè)圖片作為圖標(biāo),我們先需要通過(guò)程序制作一個(gè)圖標(biāo),這里需要使用pillow庫(kù):

from PIL import Image
 
img = Image.open("我的圖片.png")
 
# 為適應(yīng)顯示需求,可能需要考慮生成多個(gè)不同尺寸的icon
img = img.resize((256, 256))
 
img.save("my_icon.ico", format="ICO")

現(xiàn)在,我們使用剛剛制作的圖標(biāo),進(jìn)行打包即可,下圖為某個(gè)經(jīng)典病毒的標(biāo)志,但其實(shí)是我們自己制作圖標(biāo)并打包的,因此只是一個(gè)圖片而已,并不是真的病毒程序。

注意:你可能遇到系統(tǒng)圖標(biāo)緩存未及時(shí)更新的問(wèn)題,也就是說(shuō),你已經(jīng)設(shè)置好了圖標(biāo),但是由于系統(tǒng)沒(méi)能及時(shí)更新并顯示,你看到的仍然還是默認(rèn)圖標(biāo),因此懷疑自己是不是操作錯(cuò)了。其實(shí)這是沒(méi)什么影響的,但如果你是一個(gè)急性子,一定要現(xiàn)在就看到效果,在windows系統(tǒng)中可以嘗試輸入命令ie4uinit.exe -show。

多文件程序

讀取資源文件(相對(duì)路徑)

假設(shè),我們的程序需要通過(guò)json讀取某個(gè)文件,這是一個(gè)json文件:

["跟仙草學(xué)py", "笑話大全", "綠野仙蹤", "怎么樣同莎碧交流"]

下面是我們的程序:

import json
 
with open("book.json", "r", encoding="utf-8") as f:
    books = json.load(f)
    
for i in books:
    print(i)

那么,打包以后,是否還能正常使用呢?首先,我們應(yīng)該明確一件事情,雖然我們自己知道我們需要一個(gè)json文件,但是目前對(duì)于pyinstaller來(lái)說(shuō),其并不知道這一點(diǎn),因此,打包后,仍然只有單一的程序。

此時(shí),我們可以選擇將book.json(也就是我們需要用的存檔文件),手動(dòng)移動(dòng)到程序路徑下,這樣就可以按照原本的相對(duì)路徑讀寫。

讀取資源文件(打包入exe)

對(duì)于資源文件,我們可以在打包指令上提出我們需要這些文件,使用--add-data選項(xiàng)添加,格式為:

對(duì)于windows系統(tǒng),使用資源文件;目標(biāo)路徑

對(duì)于linux系統(tǒng),使用資源文件:目標(biāo)路徑

pyinstaller --onefile --add-data "book.json;." main.py

如果需要添加多個(gè)文件,可以多次使用--add-data,如果要添加整個(gè)目錄,也可以使用通配符*。

如果我們這樣做,情況將有所不同,此時(shí)文件并不存放在普通文件目錄中,而是在臨時(shí)的目錄中,因此必須要修改原本的程序代碼。

import json
import sys
import os
 
# 獲取資源文件的路徑
if hasattr(sys, "_MEIPASS"):
    resource_path = os.path.join(sys._MEIPASS, "book.json")
else:
    resource_path = "book.json"
 
with open(resource_path, "r", encoding="utf-8") as f:
    books = json.load(f)
 
for i in books:
    print(i)

通常情況下,為了簡(jiǎn)化代碼,在多處使用路徑,應(yīng)該封裝這樣一個(gè)函數(shù):

import sys
import os
 
def resource_path(relative_path):
    if hasattr(sys, "_MEIPASS"):
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)
 
# 在代碼中這樣引入
resource_path = resource_path("book.json")

注意:sys._MEIPASS指向的目錄是只讀屬性的,并不適合寫入或者修改,因此,只應(yīng)該用于資源的讀取。如果有寫入需求,應(yīng)該將數(shù)據(jù)寫入到用戶系統(tǒng)的持久目錄中(或者使用相對(duì)路徑,并提示用戶應(yīng)該總是將文件整個(gè)目錄一起移動(dòng))。

import文件導(dǎo)入

假如,我們需要通過(guò)import導(dǎo)入配置文件,例如,settings.py:

key = "sagegrass"

然后在程序中通過(guò)import導(dǎo)入

from settings import key
 
print(key)

如果是這樣的情況,那么無(wú)需擔(dān)心導(dǎo)入文件會(huì)無(wú)法處理,通常交給pyinstaller自動(dòng)解決即可。

我們只需要像普通打包一樣,使用:pyinstaller --onefile main.py,而無(wú)需關(guān)心settings.py是否被包含。

注意:雖然pyinstaller可以處理直接導(dǎo)入,但是,無(wú)法處理動(dòng)態(tài)導(dǎo)入,如果遇到這種情況,可以使用--hidden-import=module_name,進(jìn)行手動(dòng)導(dǎo)入。

引用與致謝

pyinstaller

使用pyinstaller打包確實(shí)有一些優(yōu)點(diǎn),包括:

  • 簡(jiǎn)化部署:目標(biāo)機(jī)器上無(wú)需有python環(huán)境,可以直接通過(guò)打包好的程序運(yùn)行。
  • 支持隱藏代碼邏輯:python是一種明文的代碼,因此任何人都能夠查看源代碼,而打包后可以一定程度上隱藏源代碼,使得明文代碼不直接可見(jiàn)(注意:專業(yè)的黑客或安全人員是有能力將其逆向還原的,因此,這并不是非常可靠的保證源代碼不可見(jiàn)的方法)。

當(dāng)然,同樣也有一些缺點(diǎn):

  • 生成文件體積較大:由于python解釋器,依賴庫(kù)等都會(huì)被打包,即使是非常簡(jiǎn)單的一句代碼,打包后都會(huì)變大很多。
  • 加載速度慢:打包為exe的性能遠(yuǎn)不如原生的py代碼,尤其是對(duì)于onefile模式,運(yùn)行時(shí)需要先解壓,這個(gè)過(guò)程也會(huì)消耗很多時(shí)間

因此,要根據(jù)你的情況考慮是否使用pyinstaller,通常特別適合用于給不懂代碼,沒(méi)有python環(huán)境的人提供可執(zhí)行程序的時(shí)候使用。

以上就是python使用pyinstaller將代碼打包為exe程序的詳細(xì)內(nèi)容,更多關(guān)于python pyinstaller代碼打包為exe的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python操作MySQL模擬銀行轉(zhuǎn)賬

    Python操作MySQL模擬銀行轉(zhuǎn)賬

    這篇文章主要為大家詳細(xì)介紹了Python操作MySQL模擬銀行轉(zhuǎn)賬,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python中的遞歸函數(shù)使用詳解

    Python中的遞歸函數(shù)使用詳解

    這篇文章主要介紹了Python中的遞歸函數(shù)使用詳解,遞歸函數(shù)是指某個(gè)函數(shù)調(diào)用自己或者調(diào)用其他函數(shù)后再次調(diào)用自己,由于不能無(wú)限嵌套調(diào)用,所以某個(gè)遞歸函數(shù)一定存在至少兩個(gè)分支,一個(gè)是退出嵌套,不再直接或者間接調(diào)用自己;另外一個(gè)則是繼續(xù)嵌套,需要的朋友可以參考下
    2023-12-12
  • Django中ajax發(fā)送post請(qǐng)求 報(bào)403錯(cuò)誤CSRF驗(yàn)證失敗解決方案

    Django中ajax發(fā)送post請(qǐng)求 報(bào)403錯(cuò)誤CSRF驗(yàn)證失敗解決方案

    這篇文章主要介紹了Django中ajax發(fā)送post請(qǐng)求 報(bào)403錯(cuò)誤CSRF驗(yàn)證失敗解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python下載文件的兩種方式

    python下載文件的兩種方式

    這篇文章主要介紹了python下載文件的兩種方式:接口方式和Nginx這兩種方式,并通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家學(xué)習(xí)python下載文件有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • python特效之字符成像詳解

    python特效之字符成像詳解

    這篇文章主要為大家介紹了python特效之字符成像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Python中struct模塊對(duì)字節(jié)流/二進(jìn)制流的操作教程

    Python中struct模塊對(duì)字節(jié)流/二進(jìn)制流的操作教程

    最近在學(xué)習(xí)python網(wǎng)絡(luò)編程這一塊,在寫簡(jiǎn)單的socket通信代碼時(shí),遇到了struct這個(gè)模塊的使用,當(dāng)時(shí)不太清楚這到底有和作用,后來(lái)查閱了相關(guān)資料大概了解了,這篇文章就主要介紹了Python中struct模塊對(duì)字節(jié)流/二進(jìn)制流的操作,需要的朋友可以參考借鑒。
    2017-01-01
  • Python讀取ini配置文件傳參的簡(jiǎn)單示例

    Python讀取ini配置文件傳參的簡(jiǎn)單示例

    這篇文章主要給大家介紹了關(guān)于Python讀取ini配置文件傳參的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Django中ORM基本應(yīng)用與原理解析

    Django中ORM基本應(yīng)用與原理解析

    Django的ORM模塊是框架特色功能之一,它把數(shù)據(jù)表與Python類對(duì)應(yīng)、表字段與類屬性對(duì)應(yīng)、類實(shí)例與數(shù)據(jù)記錄對(duì)應(yīng),并將對(duì)類實(shí)例的操作映射到數(shù)據(jù)庫(kù)中,這篇文章主要介紹了Django?ORM基本應(yīng)用與原理剖析,需要的朋友可以參考下
    2022-10-10
  • Python的元組和字典知識(shí)點(diǎn)超詳細(xì)講解

    Python的元組和字典知識(shí)點(diǎn)超詳細(xì)講解

    這篇文章主要介紹了Python中元組和字典兩種數(shù)據(jù)結(jié)構(gòu)的基本用法,包括初始化、索引、拼接、剔除、重復(fù)、最大值和最小值、鍵值查詢、獲取對(duì)應(yīng)值、剔除、更新、添加和計(jì)算數(shù)量等操作,需要的朋友可以參考下
    2025-01-01
  • python模擬重載初始化函數(shù)的方法詳解

    python模擬重載初始化函數(shù)的方法詳解

    重載初始化函數(shù),是指同一個(gè)類中定義了多個(gè)構(gòu)造函數(shù),可以通過(guò)多種不同的方法進(jìn)行構(gòu)造,下面我們就來(lái)看看在python中如何實(shí)現(xiàn)類似的功能吧
    2024-11-11

最新評(píng)論