Python實現(xiàn)一鍵生成自解壓源碼文件并打包項目
在日常開發(fā)中,我們有時會遇到這樣的需求:
- 想把一個項目源碼打包成單個
.py文件 - 對方只需要運行這個
.py,就能自動還原所有源碼 - 同時還能生成一個 zip 壓縮包,方便分發(fā)或存檔
本文將手把手教你實現(xiàn)一個 Python 自解壓源碼方案,非常適合:
- 內(nèi)部源碼交付
- Demo 示例分發(fā)
- 離線代碼傳輸
- 教學(xué)或工具型項目發(fā)布
最終效果
我們將得到兩個東西:
build_self_extract.py構(gòu)建腳本,負(fù)責(zé)掃描并打包源碼
self_extract.py自解壓腳本,運行后會:
- 還原所有源碼到目錄
- 自動生成
source_code.zip
運行體驗如下:
python self_extract.py
輸出:
? 源代碼已還原并壓縮為 source_code.zip
實現(xiàn)思路
整體思路非常清晰:
遍歷項目目錄
按規(guī)則篩選需要的文件(.py / .json)
排除虛擬環(huán)境、構(gòu)建目錄等
將源碼內(nèi)容序列化為 JSON
生成一個新的 self_extract.py
在 self_extract.py 中:
- 寫回所有文件
- 再打包成 zip
核心技巧:把“文件系統(tǒng)”變成 Python 變量。
構(gòu)建腳本:build_self_extract.py
這個腳本負(fù)責(zé)“打包一切”。
# build_self_extract.py
from pathlib import Path
import json
SOURCE_DIR = Path("./")
OUTPUT_DIR = Path("build")
OUTPUT_PY = OUTPUT_DIR / "self_extract.py"
INCLUDE_EXT = {".py", ".json"} # 需要打包的源碼類型
EXCLUDE_DIRS = {
".git", ".venv", "venv", "__pycache__", ".history", "build"
}
EXCLUDE_FILES = {
"self_extract.py", "build_self_extract.py", "111.py"
}
OUTPUT_DIR.mkdir(exist_ok=True)
files_data = {}
for file in SOURCE_DIR.rglob("*"):
if file.is_dir():
continue
if file.suffix not in INCLUDE_EXT:
continue
if any(part in EXCLUDE_DIRS for part in file.parts):
continue
if file.name in EXCLUDE_FILES:
continue
rel_path = file.relative_to(SOURCE_DIR)
files_data[str(rel_path)] = file.read_text(
encoding="utf-8", errors="ignore"
)
# 生成自解壓 py
with OUTPUT_PY.open("w", encoding="utf-8") as f:
f.write(
f'''"""
?? 自解壓源碼文件
運行后將還原所有源代碼并生成 source_code.zip
"""
from pathlib import Path
import zipfile
import json
FILES = json.loads({json.dumps(json.dumps(files_data, ensure_ascii=False))})
BASE_DIR = Path("extracted_source")
ZIP_NAME = "source_code.zip"
def main():
BASE_DIR.mkdir(exist_ok=True)
# 寫回所有文件
for path, content in FILES.items():
file_path = BASE_DIR / path
file_path.parent.mkdir(parents=True, exist_ok=True)
file_path.write_text(content, encoding="utf-8", errors="replace")
# 打包為 zip
with zipfile.ZipFile(ZIP_NAME, "w", zipfile.ZIP_DEFLATED) as zf:
for file in BASE_DIR.rglob("*"):
if file.is_file():
zf.write(file, arcname=file.relative_to(BASE_DIR))
print("? 源代碼已還原并壓縮為", ZIP_NAME)
if __name__ == "__main__":
main()
'''
)
print(f"? 已生成自解壓文件: {OUTPUT_PY}")
使用 Demo(完整流程)
1.假設(shè)你的項目結(jié)構(gòu)如下
project/
├── main.py
├── config.json
├── utils/
│ └── helper.py
├── build_self_extract.py
2.執(zhí)行構(gòu)建腳本
python build_self_extract.py
生成結(jié)果:
build/
└── self_extract.py
3.分發(fā)或運行self_extract.py
python self_extract.py
執(zhí)行后生成:
extracted_source/
├── main.py
├── config.json
├── utils/
│ └── helper.py
source_code.zip
源碼完整還原 + 自動壓縮完成!
可擴展方向(進階玩法)
你可以在此基礎(chǔ)上輕松擴展:
- 給源碼加密(base64 / AES)
- 增加版本號、作者信息
- 加 CLI 參數(shù)(如指定輸出目錄)
- 打包為
.exe(配合 PyInstaller) - 通過 HTTP / API 動態(tài)釋放
總結(jié)
優(yōu)點:
- 單文件分發(fā)
- 無需額外依賴
- 代碼可讀、可控
- 非常適合內(nèi)部工具和 Demo
適合人群:
- Python 工具作者
- 教學(xué) / 培訓(xùn)
- 內(nèi)部源碼交付
- 自動化工程師
到此這篇關(guān)于Python實現(xiàn)一鍵生成自解壓源碼文件并打包項目的文章就介紹到這了,更多相關(guān)Python生成自解壓源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談python在提示符下使用open打開文件失敗的原因及解決方法
今天小編就為大家分享一篇淺談python在提示符下使用open打開文件失敗的原因及解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
跟老齊學(xué)Python之玩轉(zhuǎn)字符串(3)
字符串是一個很長的話題,縱然現(xiàn)在開始第三部分,但是也不能完全說盡。因為字符串是自然語言中最復(fù)雜的東西,也是承載功能最多的,計算機高級語言編程,要解決自然語言中的問題,讓自然語言中完成的事情在計算機上完成,所以,也不得不有更多的話題。2014-09-09
python中的import絕對導(dǎo)入與相對導(dǎo)入詳解
這篇文章主要介紹了python中的import絕對導(dǎo)入與相對導(dǎo)入詳解,在使用python做一些簡單項目時,import一般不會出現(xiàn)問題,但項目結(jié)構(gòu)復(fù)雜時,import可能發(fā)生報錯,需要的朋友可以參考下2023-11-11
Python標(biāo)準(zhǔn)庫argparse解析命令行參數(shù)使用詳細(xì)介紹
本文詳細(xì)介紹了argparse模塊在Python中的應(yīng)用,包括action參數(shù)的使用方法、互斥參數(shù)的創(chuàng)建以及子命令的處理,通過示例代碼展示了如何為命令行工具添加子命令并綁定處理函數(shù),簡化復(fù)雜邏輯,感興趣的朋友跟隨小編一起看看吧2026-06-06

