亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用PyInstaller打包Python腳本為可執(zhí)行文件的詳細(xì)指南

 更新時間:2025年09月30日 09:02:11   作者:_碼力全開_  
這篇文章主要為大家詳細(xì)介紹了使用PyInstaller打包Python腳本為可執(zhí)行文件的詳細(xì)步驟,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前面我們開發(fā)了很多實(shí)用腳本:Excel批量處理、PDF內(nèi)容提取、新聞API調(diào)用……但這些腳本都有一個局限——必須在安裝了Python和相關(guān)庫的環(huán)境中運(yùn)行,沒法直接分享給不懂代碼的同事或朋友。這篇我們就學(xué)習(xí)“工具落地”的關(guān)鍵步驟:用PyInstaller把Python腳本打包成Windows的.exe(或macOS的可執(zhí)行文件),實(shí)現(xiàn)“雙擊就能運(yùn)行”,讓你的代碼真正成為人人可用的工具!

一、先搞懂:什么是打包?為什么需要打包?

1. 打包的本質(zhì)

簡單說,打包就是把“Python腳本+Python解釋器+依賴庫”打包成一個獨(dú)立文件(如.exe)。其他人不需要裝Python,也不用 pip 安裝庫,雙擊文件就能運(yùn)行你的程序——相當(dāng)于把“廚房(Python環(huán)境)”和“食材(腳本、庫)”一起打包成“即食餐”,打開就能用。

2. 為什么要打包

  • 降低使用門檻:非技術(shù)人員不用配置環(huán)境,雙擊運(yùn)行;
  • 保護(hù)代碼邏輯:避免腳本被隨意修改(打包后無法直接看到源碼);
  • 適配不同設(shè)備:在沒有Python的電腦上也能運(yùn)行(如公司辦公電腦、客戶電腦)。

3. 核心工具:PyInstaller

PyInstaller是Python最常用的打包工具,支持Windows、macOS、Linux,兼容性強(qiáng),配置簡單,能打包大多數(shù)Python腳本(包括帶第三方庫的腳本,如pandas、requests)。

二、準(zhǔn)備工作:安裝PyInstaller

首先安裝PyInstaller(打開終端/命令提示符,確保已激活你的Python環(huán)境):

# 安裝PyInstaller(支持Python 3.7+,版本兼容性好)
pip install pyinstaller

安裝完成后,在終端輸入 pyinstaller -v,若顯示版本號(如5.13.2),說明安裝成功。

三、基礎(chǔ)實(shí)戰(zhàn):打包一個簡單腳本(無依賴庫)

我們先從最簡單的“Hello World+用戶輸入”腳本入手,掌握打包的核心流程,再逐步升級到帶依賴庫的復(fù)雜腳本。

步驟1:編寫簡單腳本(test_script.py)

創(chuàng)建一個腳本,功能是接收用戶輸入的姓名,打印歡迎信息:

# test_script.py
def main():
    # 接收用戶輸入
    name = input("請輸入你的姓名:")
    # 打印歡迎信息
    print(f"\n?? 歡迎你,{name}!")
    print("這是一個打包后的Python程序~")
    # 防止程序運(yùn)行完立即關(guān)閉(Windows下.exe運(yùn)行完會自動關(guān)窗口)
    input("\n\n按回車鍵退出...")

if __name__ == "__main__":
    main()

最后一行 input("\n\n按回車鍵退出...") 很重要:Windows下雙擊.exe運(yùn)行時,程序執(zhí)行完會立刻關(guān)閉窗口,加上這行能讓用戶看到結(jié)果。

步驟2:用PyInstaller打包

打開終端,切換到腳本所在的文件夾(用cd 文件夾路徑命令,如cd D:\PythonProjects);

執(zhí)行打包命令:

# 基礎(chǔ)打包命令:-F 表示打包成單個.exe文件(方便傳輸)
pyinstaller -F test_script.py

步驟3:理解打包過程與結(jié)果

執(zhí)行命令后,PyInstaller會做3件事:

1.在腳本所在文件夾生成3個文件/文件夾:

  • build/:打包過程中的臨時文件(可刪除);
  • dist/:最終生成的可執(zhí)行文件(.exe)在這里面;
  • test_script.spec:打包配置文件(后續(xù)復(fù)雜打包會用到);

2.找到dist/文件夾,里面會有test_script.exe(Windows)或test_script(macOS);

3.雙擊test_script.exe,會彈出命令行窗口,輸入姓名后能正常顯示歡迎信息,說明打包成功!

四、進(jìn)階實(shí)戰(zhàn)1:打包帶第三方庫的腳本(如Excel處理腳本)

前面的簡單腳本沒有依賴庫,而我們實(shí)戰(zhàn)中開發(fā)的腳本(如第十三篇的Excel批量處理腳本)大多依賴pandas、openpyxl等庫。PyInstaller能自動識別并打包依賴庫,只需注意路徑問題。

步驟1:準(zhǔn)備帶依賴庫的腳本(excel_processor.py)

以第十三篇的“Excel銷售數(shù)據(jù)處理”腳本為例,簡化后代碼如下(確保腳本能正常運(yùn)行):

# excel_processor.py
import pandas as pd
import os
from openpyxl.styles import Font, Alignment

def process_excel(input_path, output_path):
    """批量處理Excel銷售數(shù)據(jù),計(jì)算完成率并標(biāo)記達(dá)標(biāo)"""
    try:
        # 讀取Excel
        df = pd.read_excel(input_path, sheet_name="Sheet1")
        
        # 計(jì)算完成率
        df["完成率(%)"] = round(df["銷售額"] / df["目標(biāo)額"] * 100, 2)
        # 標(biāo)記達(dá)標(biāo)
        df["達(dá)標(biāo)情況"] = df["完成率(%)"].apply(lambda x: "達(dá)標(biāo)" if x >= 100 else "未達(dá)標(biāo)")
        # 排序
        df = df.sort_values("完成率(%)", ascending=False).reset_index(drop=True)
        
        # 保存并美化
        with pd.ExcelWriter(output_path, engine="openpyxl") as writer:
            df.to_excel(writer, sheet_name="業(yè)績分析", index=False)
            ws = writer.sheets["業(yè)績分析"]
            
            # 表頭樣式
            for cell in ws[1]:
                cell.font = Font(bold=True)
                cell.alignment = Alignment(horizontal="center")
            
            # 調(diào)整列寬
            for col in ws.columns:
                max_len = max(len(str(cell.value)) for cell in col)
                ws.column_dimensions[col[0].column_letter].width = max_len + 2
        
        return True, f"處理成功!輸出文件:{output_path}"
    
    except Exception as e:
        return False, f"處理失?。簕str(e)}"

def main():
    print("="*50)
    print("?? Excel銷售數(shù)據(jù)批量處理工具")
    print("="*50)
    
    # 讓用戶輸入文件路徑(這里簡化為固定路徑,實(shí)際可改為輸入)
    input_excel = "銷售數(shù)據(jù).xlsx"  # 需和.exe放在同一文件夾
    output_excel = "銷售業(yè)績分析.xlsx"
    
    # 檢查輸入文件是否存在
    if not os.path.exists(input_excel):
        print(f"? 錯誤:輸入文件'{input_excel}'不存在,請放在工具同一文件夾!")
        input("\n按回車鍵退出...")
        return
    
    # 執(zhí)行處理
    success, msg = process_excel(input_excel, output_excel)
    print(f"\n{msg}")
    input("\n按回車鍵退出...")

if __name__ == "__main__":
    main()

步驟2:關(guān)鍵注意點(diǎn)(避免打包后報錯)

文件路徑問題:打包后的.exe運(yùn)行時,默認(rèn)“當(dāng)前路徑”是.exe所在的文件夾。因此腳本中如果用到外部文件(如“銷售數(shù)據(jù).xlsx”),需讓用戶把文件和.exe放在同一文件夾,或在腳本中讓用戶手動選擇文件(后續(xù)會講)。

依賴庫兼容性:確保所有依賴庫已安裝(如pip install pandas openpyxl),PyInstaller會自動打包這些庫,但部分冷門庫可能需要手動指定(后續(xù)進(jìn)階會講)。

步驟3:打包命令(帶圖標(biāo),更像“正式工具”)

我們可以給.exe加個圖標(biāo),讓工具更美觀。先準(zhǔn)備一個.ico格式的圖標(biāo)文件(如excel_tool.ico,可在網(wǎng)上找免費(fèi)圖標(biāo)轉(zhuǎn)換工具將圖片轉(zhuǎn)為.ico),然后執(zhí)行打包命令:

# -F:打包成單個文件;-i:指定圖標(biāo)文件;-n:指定生成的.exe文件名
pyinstaller -F -i excel_tool.ico -n Excel數(shù)據(jù)處理工具 excel_processor.py

步驟4:測試打包結(jié)果

找到dist/文件夾中的Excel數(shù)據(jù)處理工具.exe;

把“銷售數(shù)據(jù).xlsx”和.exe放在同一文件夾;

雙擊.exe,若能正常生成“銷售業(yè)績分析.xlsx”,說明打包成功!

五、進(jìn)階實(shí)戰(zhàn)2:打包帶GUI界面的腳本(更友好)

命令行工具對非技術(shù)人員不夠友好,我們可以用tkinter(Python自帶,無需額外安裝)給腳本加一個簡單的圖形界面(GUI),再打包成.exe,操作更直觀。

步驟1:編寫帶GUI的腳本(pdf_extractor_gui.py)

以第十三篇的“PDF內(nèi)容提取”為例,用tkinter做一個界面,支持“選擇文件夾”和“開始提取”,代碼如下:

# pdf_extractor_gui.py
import pdfplumber
import pandas as pd
import os
import re
import tkinter as tk
from tkinter import filedialog, messagebox

def extract_pdf_info(pdf_path):
    """提取單份PDF的姓名、電話、工作經(jīng)歷"""
    info = {
        "文件名": os.path.basename(pdf_path),
        "姓名": "未找到",
        "電話": "未找到",
        "工作經(jīng)歷": "未找到"
    }
    try:
        with pdfplumber.open(pdf_path) as pdf:
            full_text = "\n".join([page.extract_text() for page in pdf.pages if page.extract_text()])
        
        # 提取姓名(2-4個漢字)
        name_match = re.search(r"[簡歷|個人簡歷]\s*([\u4e00-\u9fa5]{2,4})", full_text)
        if name_match:
            info["姓名"] = name_match.group(1)
        
        # 提取電話(11位手機(jī)號)
        phone_match = re.search(r"1[3-9]\d{9}", full_text)
        if phone_match:
            info["電話"] = phone_match.group()
        
        # 提取工作經(jīng)歷
        exp_match = re.search(r"(工作經(jīng)歷|工作經(jīng)驗(yàn))\s*(.*?)(教育背景|項(xiàng)目經(jīng)驗(yàn))", full_text, re.DOTALL)
        if exp_match:
            info["工作經(jīng)歷"] = exp_match.group(2).strip()[:500]
    
    except Exception as e:
        info["工作經(jīng)歷"] = f"提取錯誤:{str(e)}"
    return info

def batch_extract_pdfs(folder_path, output_path):
    """批量提取文件夾中的PDF,匯總到Excel"""
    pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith(".pdf")]
    if not pdf_files:
        messagebox.showwarning("提示", "未找到任何PDF文件!")
        return
    
    all_info = []
    for pdf_file in pdf_files:
        pdf_path = os.path.join(folder_path, pdf_file)
        all_info.append(extract_pdf_info(pdf_path))
    
    # 保存Excel
    df = pd.DataFrame(all_info)
    df.to_excel(output_path, index=False, engine="openpyxl")
    messagebox.showinfo("成功", f"提取完成!共處理{len(pdf_files)}個PDF,結(jié)果保存在:\n{output_path}")

def select_folder(entry):
    """選擇文件夾,將路徑顯示在輸入框中"""
    folder_path = filedialog.askdirectory()
    if folder_path:
        entry.delete(0, tk.END)  # 清空輸入框
        entry.insert(0, folder_path)  # 插入選擇的路徑

def main():
    # 創(chuàng)建主窗口
    root = tk.Tk()
    root.title("PDF簡歷信息提取工具")
    root.geometry("600x300")  # 窗口大?。▽抶高)
    
    # 1. 選擇PDF文件夾的標(biāo)簽和輸入框
    tk.Label(root, text="PDF文件夾路徑:").place(x=30, y=50)
    folder_entry = tk.Entry(root, width=50)
    folder_entry.place(x=150, y=50)
    # 選擇文件夾按鈕
    tk.Button(root, text="選擇文件夾", command=lambda: select_folder(folder_entry)).place(x=520, y=48)
    
    # 2. 輸出Excel路徑的標(biāo)簽和輸入框
    tk.Label(root, text="Excel輸出路徑:").place(x=30, y=100)
    output_entry = tk.Entry(root, width=50)
    output_entry.place(x=150, y=100)
    output_entry.insert(0, os.path.join(os.getcwd(), "PDF簡歷匯總.xlsx"))  # 默認(rèn)路徑
    
    # 3. 開始提取按鈕
    def start_extract():
        folder_path = folder_entry.get().strip()
        output_path = output_entry.get().strip()
        if not folder_path:
            messagebox.showwarning("提示", "請先選擇PDF文件夾!")
            return
        batch_extract_pdfs(folder_path, output_path)
    
    tk.Button(root, text="開始提取", command=start_extract, bg="#4ECDC4", fg="white").place(x=250, y=180)
    
    # 運(yùn)行窗口
    root.mainloop()

if __name__ == "__main__":
    main()

步驟2:打包帶GUI的腳本

帶GUI的腳本打包時,需要加-w參數(shù)(表示“窗口模式”,不顯示命令行窗口),否則運(yùn)行.exe時會同時彈出命令行窗口,影響體驗(yàn):

# -F:單個文件;-i:圖標(biāo);-n:文件名;-w:窗口模式(隱藏命令行)
pyinstaller -F -i pdf_tool.ico -n PDF簡歷提取工具 -w pdf_extractor_gui.py

步驟3:測試GUI工具

雙擊dist/中的PDF簡歷提取工具.exe,會彈出圖形界面;

點(diǎn)擊“選擇文件夾”,選擇存放PDF簡歷的文件夾;

點(diǎn)擊“開始提取”,提取完成后會彈出提示,打開生成的Excel即可看到匯總結(jié)果——整個過程無需輸入命令,非技術(shù)人員也能輕松使用!

六、打包常見問題與解決方案

在打包過程中,很容易遇到各種報錯,這里整理5個高頻問題及解決方法:

1. 問題1:打包后運(yùn)行報錯“ModuleNotFoundError: No module named ‘xxx’”(缺少模塊)

原因:PyInstaller未自動識別到某些依賴庫(尤其是冷門庫或自定義模塊);

解決:用--hidden-import參數(shù)手動指定缺少的模塊,例如:

# 若報錯缺少pandas.core.arrays.integer,手動指定
pyinstaller -F -w --hidden-import pandas.core.arrays.integer 腳本.py

若不確定缺少哪些模塊,可先不加-w參數(shù),運(yùn)行.exe時查看命令行窗口的報錯信息,根據(jù)報錯補(bǔ)充--hidden-import。

2. 問題2:打包后無法找到外部文件(如Excel、模板)

原因:腳本中用了相對路徑,但打包后的“當(dāng)前路徑”是.exe所在路徑,不是腳本原路徑;

解決

讓用戶把外部文件(如“銷售數(shù)據(jù).xlsx”)和.exe放在同一文件夾;

在腳本中用os.getcwd()獲取.exe所在路徑,拼接文件路徑,例如:

# 正確的路徑處理方式
base_path = os.getcwd()  # 獲取.exe所在路徑
input_excel = os.path.join(base_path, "銷售數(shù)據(jù).xlsx")  # 拼接路徑

3. 問題3:打包后的.exe體積太大(幾百M(fèi)B)

原因:PyInstaller會打包Python解釋器和所有依賴庫(如pandas、numpy體積較大);

解決

  • 用虛擬環(huán)境:創(chuàng)建干凈的虛擬環(huán)境,只安裝腳本必需的庫(避免打包多余庫);
  • 不使用-F參數(shù):不加-F會生成一個文件夾(包含.exe和依賴文件),體積會小一些,傳輸時壓縮文件夾即可;
  • upx壓縮:安裝upx(https://upx.github.io/),打包時加--upx-dir參數(shù)指定upx路徑,可壓縮依賴庫體積。

4. 問題4:macOS打包后運(yùn)行報錯“Permission denied”(權(quán)限不足)

原因:生成的可執(zhí)行文件沒有運(yùn)行權(quán)限;

解決:打開終端,進(jìn)入dist/文件夾,執(zhí)行chmod +x 文件名賦予權(quán)限,例如:

chmod +x PDF簡歷提取工具

5. 問題5:打包后腳本運(yùn)行速度變慢

  • 原因:單個文件(-F)運(yùn)行時,會先把文件解壓到臨時文件夾,再執(zhí)行,比文件夾模式慢;
  • 解決:放棄-F參數(shù),打包成文件夾模式(不加-F),運(yùn)行文件夾中的.exe,速度會快很多。

總結(jié)

這篇我們掌握了 Python 工具落地的核心技能 —— 用 PyInstaller 打包腳本,從 “代碼腳本” 升級為 “可獨(dú)立運(yùn)行的工具”,串聯(lián)了前序多個關(guān)鍵知識點(diǎn):

基礎(chǔ)打包流程:從簡單腳本到帶依賴庫的復(fù)雜腳本,掌握-F(單文件)、-i(圖標(biāo))、-w(窗口模式)等核心參數(shù),實(shí)現(xiàn)工具的基礎(chǔ)封裝;

GUI 界面開發(fā):用 Python 自帶的tkinter快速搭建圖形界面,降低工具使用門檻,讓非技術(shù)人員也能輕松操作;

問題排查能力:針對 “缺少模塊”“路徑錯誤”“體積過大” 等打包常見問題,掌握對應(yīng)的解決方案,確保工具穩(wěn)定運(yùn)行。

以上就是使用PyInstaller打包Python腳本為可執(zhí)行文件的詳細(xì)指南的詳細(xì)內(nèi)容,更多關(guān)于PyInstaller打包Python的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于Python的Houdini插件開發(fā)過程詳情

    基于Python的Houdini插件開發(fā)過程詳情

    這篇文章主要介紹了基于Python的Houdini插件開發(fā)過程詳情,Houdini是基于QT進(jìn)行的開發(fā),支持?Python、HScript二種腳本進(jìn)行插件開發(fā),下面文章介紹內(nèi)容,需要的朋友可以參考一下
    2022-02-02
  • python散點(diǎn)圖的繪制

    python散點(diǎn)圖的繪制

    這篇文章主要介紹了python散點(diǎn)圖的繪制,這是的繪制圖有二維散點(diǎn)圖的繪制,采用pandas.plotting.scatter_matrix函數(shù)繪制和采用seaborn進(jìn)行繪制等繪制方式,需要的小伙伴可以參考一下
    2022-02-02
  • 解決pytorch-yolov3 train 報錯的問題

    解決pytorch-yolov3 train 報錯的問題

    今天小編就為大家分享一篇解決pytorch-yolov3 train 報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python實(shí)現(xiàn)的求解最大公約數(shù)算法示例

    Python實(shí)現(xiàn)的求解最大公約數(shù)算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的求解最大公約數(shù)算法,涉及Python數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Python并發(fā)爬蟲常用實(shí)現(xiàn)方法解析

    Python并發(fā)爬蟲常用實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Python并發(fā)爬蟲常用實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Python進(jìn)階-函數(shù)默認(rèn)參數(shù)(詳解)

    Python進(jìn)階-函數(shù)默認(rèn)參數(shù)(詳解)

    下面小編就為大家?guī)硪黄狿ython進(jìn)階-函數(shù)默認(rèn)參數(shù)(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹

    基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹

    這篇文章主要介紹了基于pycharm 項(xiàng)目和項(xiàng)目文件命名規(guī)則的介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Python異常信息的不同展現(xiàn)方法總結(jié)

    Python異常信息的不同展現(xiàn)方法總結(jié)

    在日常開發(fā)的過程中,當(dāng)代碼報錯時,我們通常要不斷打印、閱讀traceback提示信息,來調(diào)試代碼,這篇文章介紹了如何實(shí)現(xiàn)一個Exception?Hooks,使得traceback模塊的提示信息更加精確;同時還介紹了一些第三方庫,這些庫也提供了Exception?Hooks的功能
    2022-11-11
  • Python常見報錯解決方案總結(jié)(新手拯救指南)

    Python常見報錯解決方案總結(jié)(新手拯救指南)

    我們再使用python難免會出現(xiàn)各種各樣的報錯,下面這篇文章主要給大家介紹了關(guān)于Python常見報錯解決方案的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Python實(shí)現(xiàn)的tab文件操作類分享

    Python實(shí)現(xiàn)的tab文件操作類分享

    這篇文章主要介紹了Python實(shí)現(xiàn)的tab文件操作類分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-11-11

最新評論