Python 教程:一键生成自解压源码文件,自动还原并打包项目

在日常开发中,我们有时会遇到这样的需求:

  • 想把一个项目源码打包成单个 .py 文件
  • 对方只需要运行这个 .py,就能自动还原所有源码
  • 同时还能生成一个 zip 压缩包,方便分发或存档

本文将手把手教你实现一个 Python 自解压源码方案,非常适合:

  • 内部源码交付
  • Demo 示例分发
  • 离线代码传输
  • 教学或工具型项目发布

✨ 最终效果

我们将得到两个东西:

  1. build_self_extract.py

    👉 构建脚本,负责扫描并打包源码

  2. self_extract.py

    👉 自解压脚本,运行后会:

    • 还原所有源码到目录
    • 自动生成 source_code.zip

运行体验如下:

bash 复制代码
python self_extract.py

输出:

text 复制代码
✅ 源代码已还原并压缩为 source_code.zip

🧠 实现思路

整体思路非常清晰:

  1. 遍历项目目录

  2. 按规则筛选需要的文件(.py / .json

  3. 排除虚拟环境、构建目录等

  4. 将源码内容序列化为 JSON

  5. 生成一个新的 self_extract.py

  6. self_extract.py 中:

    • 写回所有文件
    • 再打包成 zip

核心技巧:把"文件系统"变成 Python 变量。


📦 构建脚本:build_self_extract.py

这个脚本负责"打包一切"。

python 复制代码
# 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️⃣ 假设你的项目结构如下:

text 复制代码
project/
├── main.py
├── config.json
├── utils/
│   └── helper.py
├── build_self_extract.py

2️⃣ 执行构建脚本

bash 复制代码
python build_self_extract.py

生成结果:

text 复制代码
build/
└── self_extract.py

3️⃣ 分发或运行 self_extract.py

bash 复制代码
python self_extract.py

执行后生成:

text 复制代码
extracted_source/
├── main.py
├── config.json
├── utils/
│   └── helper.py

source_code.zip

🎉 源码完整还原 + 自动压缩完成!


⚙️ 可扩展方向(进阶玩法)

你可以在此基础上轻松扩展:

  • 🔐 给源码加密(base64 / AES)
  • 🧩 增加版本号、作者信息
  • 🖥 加 CLI 参数(如指定输出目录)
  • 📦 打包为 .exe(配合 PyInstaller)
  • 🌐 通过 HTTP / API 动态释放

📝 总结

✅ 优点:

  • 单文件分发
  • 无需额外依赖
  • 代码可读、可控
  • 非常适合内部工具和 Demo

📌 适合人群:

  • Python 工具作者
  • 教学 / 培训
  • 内部源码交付
  • 自动化工程师

如果你觉得这个方案有用,欢迎 点赞 + 收藏 + 关注 👍

相关推荐
冷雨夜中漫步5 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
喵手7 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934737 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy8 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威9 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ9 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha9 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
abluckyboy10 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法