You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用标准工具自动化安装含.pyc文件的Python压缩包及.pth文件

自动化打包含特定版本.pyc的Zip包并集成到Python环境的方案

核心实现思路

用Python标准库setuptools配合自定义脚本,完成「编译指定版本.pyc → 打包成Zip → 自动安装到site-packages并生成.pth文件」的全流程自动化,完全符合你的最小混淆需求。


步骤1:编写PyZip构建脚本

创建build_pyzip.py,负责编译源码为指定版本的.pyc并打包成Zip:

import os
import shutil
import zipfile
from compileall import compile_dir

# 配置参数,根据你的包修改
PACKAGE_NAME = "mypackage"
TARGET_PY_VERSION = "310"  # 对应Python 3.10,311对应3.11,以此类推
BUILD_DIR = "build_pyzip_temp"
DIST_DIR = "dist"

def compile_to_pyc():
    # 编译源码为指定版本的.pyc文件
    compile_dir(
        PACKAGE_NAME,
        optimize=0,  # 0=无优化,1=移除断言,2=移除文档字符串,按需选择
        target_version=TARGET_PY_VERSION,
        ddir=PACKAGE_NAME,  # 保持原包目录结构
    )

def collect_pyc_files():
    # 创建临时目录,整理.pyc文件(移除版本后缀)
    os.makedirs(os.path.join(BUILD_DIR, PACKAGE_NAME), exist_ok=True)
    for root, _, files in os.walk(PACKAGE_NAME):
        for file in files:
            if file.endswith(f".cpython-{TARGET_PY_VERSION}.pyc"):
                src_path = os.path.join(root, file)
                dest_path = os.path.join(
                    BUILD_DIR, root,
                    file.replace(f".cpython-{TARGET_PY_VERSION}.pyc", ".pyc")
                )
                os.makedirs(os.path.dirname(dest_path), exist_ok=True)
                shutil.copy(src_path, dest_path)

def create_pyzip():
    # 用PyZipFile打包整理后的.pyc文件
    os.makedirs(DIST_DIR, exist_ok=True)
    zip_path = os.path.join(DIST_DIR, f"{PACKAGE_NAME}.zip")
    with zipfile.PyZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
        zf.writepy(BUILD_DIR)

def clean_temp_files():
    # 清理临时文件和__pycache__目录
    shutil.rmtree(BUILD_DIR, ignore_errors=True)
    for root, dirs, _ in os.walk(PACKAGE_NAME):
        if "__pycache__" in dirs:
            shutil.rmtree(os.path.join(root, "__pycache__"), ignore_errors=True)

if __name__ == "__main__":
    clean_temp_files()
    compile_to_pyc()
    collect_pyc_files()
    create_pyzip()
    clean_temp_files()
    print(f"已生成Zip包:{os.path.join(DIST_DIR, f'{PACKAGE_NAME}.zip')}")

步骤2:编写安装配置脚本

创建setup.py,实现自动将Zip包安装到site-packages并生成.pth文件:

import os
from setuptools import setup, Command
from setuptools.command.install import install

PACKAGE_NAME = "mypackage"
ZIP_FILE = f"{PACKAGE_NAME}.zip"

class InstallPyZip(install):
    def run(self):
        # 执行默认安装流程
        install.run(self)
        # 获取site-packages目录路径
        site_packages_dir = self.install_lib
        # 复制Zip包到site-packages
        zip_src = os.path.join("dist", ZIP_FILE)
        zip_dest = os.path.join(site_packages_dir, ZIP_FILE)
        self.copy_file(zip_src, zip_dest)
        # 生成.pth文件,让Python识别Zip包
        pth_path = os.path.join(site_packages_dir, f"{PACKAGE_NAME}.pth")
        with open(pth_path, "w") as f:
            f.write(f"{ZIP_FILE}\n")

# 可选:添加自动构建Zip的命令
class BuildPyZip(Command):
    description = "Build PyZip package with .pyc files"
    user_options = []
    def initialize_options(self): pass
    def finalize_options(self): pass
    def run(self):
        import build_pyzip
        build_pyzip.main()  # 需要在build_pyzip.py末尾添加def main(): ... 调用所有流程

setup(
    name=PACKAGE_NAME,
    version="1.0.0",
    cmdclass={
        "install": InstallPyZip,
        "build_pyzip": BuildPyZip  # 可选,添加后可通过python setup.py build_pyzip构建
    }
)

步骤3:配置构建依赖

创建pyproject.toml,指定标准构建工具:

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

执行流程

  1. 生成Zip包:运行python build_pyzip.py,会在dist目录生成含指定版本.pyc的Zip包
  2. 自动安装:运行pip install .,工具会自动将Zip包复制到site-packages,并生成对应的.pth文件,完成后即可直接import使用你的包

内容的提问来源于stack exchange,提问作者Open AI - Opting Out

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:46:18