如何用标准工具自动化安装含.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"
执行流程
- 生成Zip包:运行
python build_pyzip.py,会在dist目录生成含指定版本.pyc的Zip包 - 自动安装:运行
pip install .,工具会自动将Zip包复制到site-packages,并生成对应的.pth文件,完成后即可直接import使用你的包
内容的提问来源于stack exchange,提问作者Open AI - Opting Out
相关产品推荐
相关产品推荐

