用PyInstaller構建動態腳本執行器:嵌入式Python解釋器與模塊打包 - 簡明教程

技術場景:

需分發的Python工具要求終端用戶可動態修改執行邏輯將Python環境與指定庫(如NumPy/Pandas)嵌入可執行文件實現"一次打包,動態擴展"的輕量化解決方案。

▌ 架構設計原理

1. 雙模運行時識別

# 核心判斷邏輯(適配開發模式與編譯模式)  
def get_runtime_path():  if getattr(sys, 'frozen', False):  return os.path.dirname(sys.executable)   # 編譯模式取執行文件路徑  return os.path.dirname(__file__)             # 開發模式取腳本路徑  

設計優勢:

  • 開發階段與發布版本使用同一套代碼
  • 避免硬編碼路徑引發的跨平臺兼容問題

2. 動態腳本加載機制

def load_script(script_name):  target_path = os.path.join(get_runtime_path(),  script_name)  if os.path.exists(target_path):   with open(target_path, 'r', encoding='utf-8') as f:  exec(f.read(),  globals())  # 在全局命名空間執行腳本  

3. 架構圖

在這里插入圖片描述

▌ 基礎功能實現

1. 編寫main.py和Run.py文件(名稱隨意)

main.py

import os
import sys# === 預先導入之后可能會用到的模塊 ===
import numpy
import pandas# 核心判斷邏輯(適配開發模式與編譯模式)  
def get_runtime_path():  if getattr(sys, 'frozen', False):  return os.path.dirname(sys.executable)   # 編譯模式取執行文件路徑  return os.path.dirname(__file__)             # 開發模式取腳本路徑# 這里一定要定義一個main函數
def main():# 導入一個可以被修改的腳本代碼“Run.py”,后續可以通過它指定要被運行的腳本current_path = get_runtime_path()ScriptPath = os.path.join(current_path, "Run.py")if os.path.isfile(ScriptPath):with open(ScriptPath, 'r', encoding='utf-8') as file:exec(file.read(),globals())# 程序入口
if __name__ == "__main__":main()

Run.py

import os
import sys# 核心判斷邏輯(適配開發模式與編譯模式)  
def get_runtime_path():  if getattr(sys, 'frozen', False):  return os.path.dirname(sys.executable)   # 編譯模式取執行文件路徑  return os.path.dirname(__file__)             # 開發模式取腳本路徑def load_script(script_name):  target_path = os.path.join(get_runtime_path(),  script_name)  if os.path.exists(target_path):   with open(target_path, 'r', encoding='utf-8') as f:  exec(f.read(),  globals())  # 在全局命名空間執行腳本  # def main():script_name = "example_1.py"
load_script(script_name)script_name = "example_2.py"
load_script(script_name)# if __name__ == "__main__":
#     main()

由于實際運行時上方代碼Run.py由main.exe調用,將直接和main.exe共用全局命名空間中的os和sys庫,因此

2. 編譯 main.py

pyinstaller --onedir main.py

若沒有安裝pyinstaller,請先使用pip安裝:

pip install pyinstaller

編譯完的文件如下:

your_project_folder/
│
├──── build/ → 沒有用,可以刪除
├──── dist/ → 打包后的程序文件夾
│        └─── main/
│            ├─── _internal/ → 需要用到的庫文件會被放在這里
│            └─── main.exe → 打包后的可執行程序
│
└──── main.spec → 打包配置文件,可以修改它來定制打包過程
_internal/ 和 main.exe → 可以一起拿出來放在其它位置(需放在同一路徑下)

_internal/ 和 main.exe需在同一路徑下
_internal/中將包含被引用的numpy和pandas庫


3. 測試運行效果

運行 main.exe

test_main.bat

.\main.exe
pause

運行 test_main.bat 文件,查看效果:

D:\test>.\main.exe
This script is running as a compiled executable.
This script is running as a compiled executable.
一維數組:
[1 2 3 4 5]
一維數組加10:
[11 12 13 14 15]
一維數組乘2:
[ 2  4  6  8 10]
二維數組:
[[1 2][3 4]]
矩陣乘法結果:
[[ 7 10][15 22]]
原始DataFrame:Name  Age         City
0    Alice   24     New York
1      Bob   27  Los Angeles
2  Charlie   22      Chicago
3    David   32      Houston年齡大于25的行:Name  Age         City
1    Bob   27  Los Angeles
3  David   32      Houston按年齡升序排序后的DataFrame:Name  Age         City
2  Charlie   22      Chicago
0    Alice   24     New York
1      Bob   27  Los Angeles
3    David   32      Houston描述性統計量:Age
count   4.000000
mean   26.250000
std     4.349329
min    22.000000
25%    23.500000
50%    25.500000
75%    28.250000
max    32.000000D:\test>pause
請按任意鍵繼續. . .

▌ 例程(附)

example_1.py

import numpy as np# 創建一個一維數組
arr1 = np.array([1, 2, 3, 4, 5])# 創建一個二維數組(矩陣)
arr2 = np.array([[1, 2], [3, 4]])# 數組加法
arr_sum = arr1 + 10# 數組乘法(元素級)
arr_prod = arr1 * 2# 矩陣乘法
mat_prod = np.dot(arr2, arr2)# 打印結果
print("一維數組:")
print(arr1)
print("一維數組加10:")
print(arr_sum)
print("一維數組乘2:")
print(arr_prod)
print("二維數組:")
print(arr2)
print("矩陣乘法結果:")
print(mat_prod)

運行結果:(example_1.py)

一維數組:
[1 2 3 4 5]
一維數組加10:
[11 12 13 14 15]
一維數組乘2:
[ 2  4  6  8 10]
二維數組:
[[1 2][3 4]]
矩陣乘法結果:
[[ 7 10][15 22]]

example_2.py

import pandas as pd# 創建一個簡單的DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],'Age': [24, 27, 22, 32],'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)# 顯示DataFrame
print("原始DataFrame:")
print(df)# 數據篩選:選擇年齡大于25的行
filtered_df = df[df['Age'] > 25]
print("\n年齡大于25的行:")
print(filtered_df)# 數據排序:按年齡升序排序
sorted_df = df.sort_values(by='Age')
print("\n按年齡升序排序后的DataFrame:")
print(sorted_df)# 計算描述性統計量
stats = df.describe()
print("\n描述性統計量:")
print(stats)

運行結果:(example_2.py)

原始DataFrame:Name  Age         City
0    Alice   24     New York
1      Bob   27  Los Angeles
2  Charlie   22      Chicago
3    David   32      Houston年齡大于25的行:Name  Age         City
1    Bob   27  Los Angeles
3  David   32      Houston按年齡升序排序后的DataFrame:Name  Age         City
2  Charlie   22      Chicago
0    Alice   24     New York
1      Bob   27  Los Angeles
3    David   32      Houston描述性統計量:Age
count   4.000000
mean   26.250000
std     4.349329
min    22.000000
25%    23.500000
50%    25.500000
75%    28.250000
max    32.000000

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

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

相關文章

山石網科×阿里云通義靈碼,開啟研發“AI智造”新時代

近日,山石網科正式宣布全面接入阿里云通義靈碼企業專屬版,這標志著山石網科在研發智能化、自動化領域邁出重要一步,為研發工作注入強大的AI動力,實現多維度的效率飛躍。 此次合作,阿里云通義靈碼依托強大的AI能力&…

《被討厭的勇氣》(六)

1.自由就是被別人討厭。 2.毫不在意別人的評價、不害怕被別人討厭、不追求被他人認可,如果不付出以上這些代價,那就無法貫徹自己的生活方式,也就是不能獲得自由。 3.在意你的臉的只有你自己。 4.不去干涉別人的課題也不讓別人干涉自己的課題.…

使用 PyTorch 實現標準卷積神經網絡(CNN)

卷積神經網絡(CNN)是深度學習中的重要組成部分,廣泛應用于圖像處理、語音識別、視頻分析等任務。在這篇博客中,我們將使用 PyTorch 實現一個標準的卷積神經網絡(CNN),并介紹各個部分的作用。 什…

SpringBoot2.0整合Redis(Lettuce版本)

前言: 目前java操作redis的客戶端有jedis跟Lettuce。在springboot1.x系列中,其中使用的是jedis, 但是到了springboot2.x其中使用的是Lettuce。 因為我們的版本是springboot2.x系列,所以今天使用的是Lettuce。關于jedis跟lettuce的區別&#…

qt + opengl 給立方體增加陰影

在前幾篇文章里面學會了通過opengl實現一個立方體,那么這篇我們來學習光照。 風氏光照模型的主要結構由3個分量組成:環境(Ambient)、漫反射(Diffuse)和鏡面(Specular)光照。下面這張圖展示了這些光照分量看起來的樣子: 1 環境光照(Ambient …

大模型工具大比拼:SGLang、Ollama、VLLM、LLaMA.cpp 如何選擇?

簡介:在人工智能飛速發展的今天,大模型已經成為推動技術革新的核心力量。無論是智能客服、內容創作,還是科研輔助、代碼生成,大模型的身影無處不在。然而,面對市場上琳瑯滿目的工具,如何挑選最適合自己的那…

stream流常用方法

1.reduce 在Java中,可以使用Stream API的reduce方法來計算一個整數列表的乘積。reduce方法是一種累積操作,它可以將流中的元素組合起來,返回單個結果。對于計算乘積,你需要提供一個初始值(通常是1,因為乘法…

pgAdmin4在mac m1上面簡單使用(Docker)

問題 想要在本地簡單了解一下pgAdmin4一些簡單功能。故需要在本機先安裝看一看。 安裝步驟 拉取docker鏡像 docker pull dpage/pgadmin4直接簡單運行pgAdmin4 docker run --name pgAdmin4 -p 5050:80 \-e "PGADMIN_DEFAULT_EMAILuserdomain.com" \-e "PGAD…

ubuntu下安裝TFTP服務器

在 Ubuntu 系統下安裝和配置 TFTP(Trivial File Transfer Protocol)服務器可以按照以下步驟進行: 1. 安裝 TFTP 服務器軟件包 TFTP 服務器通常使用 tftpd-hpa 軟件包,你可以使用以下命令進行安裝: sudo apt update …

Softing線上研討會 | 自研還是購買——用于自動化產品的工業以太網

| 線上研討會時間:2025年1月27日 16:00~16:30 / 23:00~23:30 基于以太網的通信在工業自動化網絡中的重要性日益增加。設備制造商正面臨著一大挑戰——如何快速、有效且經濟地將工業以太網協議集成到其產品中。其中的關鍵問題包括:是否只需集成單一的工…

vscode創建java web項目

一.項目部署 1.shiftctrlp,選擇java項目 2.選擇maven create from arcetype 3.選擇webapp 4.目錄結構如下,其中index.jsp是首頁 5.找到左下角的servers,添加tomcat服務器 選擇 再選擇: 找到你下載的tomcat 的bin目錄的上一級目錄&#x…

C語言指針學習筆記

1. 指針的定義 指針(Pointer)是存儲變量地址的變量。在C語言中,指針是一種非常重要的數據類型,通過指針可以直接訪問和操作內存。 2. 指針的聲明與初始化 2.1 指針聲明 指針變量的聲明格式為:數據類型 *指針變量名…

DeepSeek R1生成圖片總結2(雖然本身是不能直接生成圖片,但是可以想辦法利用別的工具一起實現)

DeepSeek官網 目前階段,DeepSeek R1是不能直接生成圖片的,但可以通過優化文本后轉換為SVG或HTML代碼,再保存為圖片。另外,Janus-Pro是DeepSeek的多模態模型,支持文生圖,但需要本地部署或者使用第三方工具。…

什么是Dubbo?Dubbo框架知識點,面試題總結

本篇包含什么是Dubbo,Dubbo的實現原理,節點角色說明,調用關系說明,在實際開發的場景中應該如何選擇RPC框架,Dubbo的核心架構,Dubbo的整體架構設計及分層。 主頁還有其他的面試資料,有需要的可以…

kafka消費能力壓測:使用官方工具

背景 在之前的業務場景中,我們發現Kafka的實際消費能力遠低于預期。盡管我們使用了kafka-go組件并進行了相關測試,測試情況見《kafka-go:性能測試》這篇文章。但并未能準確找出消費能力低下的原因。 我們曾懷疑這可能是由我的電腦網絡帶寬問題或Kafka部…

【大學生職業規劃大賽備賽PPT資料PDF | 免費共享】

自取鏈接: 鏈接:https://pan.quark.cn/s/4fa45515325e 📢 同學,你是不是正在為職業規劃大賽發愁? 想展示獨特思路卻不知如何下手? 想用專業模板卻找不到資源? 別擔心!我整理了全網…

ubuntu20動態修改ip,springboot中yaml的內容的讀取,修改,寫入

文章目錄 前言引入包yaml原始內容操作目標具體代碼執行查看結果總結: 前言 之前有個需求,動態修改ubuntu20的ip,看了下: 本質上是修改01-netcfg.yaml文件,然后執行netplan apply就可以了。 所以,需求就變成了 如何對ya…

【算法】雙指針(下)

目錄 查找總價格為目標值的兩個商品 暴力解題 雙指針解題 三數之和 雙指針解題(左右指針) 四數之和 雙指針解題 雙指針關鍵點 注意事項 查找總價格為目標值的兩個商品 題目鏈接:LCR 179. 查找總價格為目標值的兩個商品 - 力扣(LeetCode&#x…

Windows 圖形顯示驅動開發-IoMmu 模型

輸入輸出內存管理單元 (IOMMU) 是一個硬件組件,它將支持具有 DMA 功能的 I/O 總線連接到系統內存。 它將設備可見的虛擬地址映射到物理地址,使其在虛擬化中很有用。 在 WDDM 2.0 IoMmu 模型中,每個進程都有一個虛擬地址空間,即&a…

軟件測評報告包括哪些內容?第三方軟件測評機構推薦

在當今信息技術飛速發展的時代,軟件的品質與性能直接影響到企業的運營效率和市場競爭力。為了確保軟件的可用性和可靠性,軟件測評成為一個不可或缺的環節,軟件測評報告也是對軟件產品進行全面評估后形成的一份文檔,旨在系統地紀錄…