【问题标题】:How to correctly zip the whole python standard library?如何正确压缩整个 python 标准库?
【发布时间】:2020-10-04 00:20:44
【问题描述】:

我最近根据 Joao Ventura 非常有用的两部分系列中概述的方法,使用安装了 python3.7 的自制软件在 Mac OS X 中成功嵌入了一个带有应用程序的 python 发行版,此处提供以供参考 (http://joaoventura.net/blog/2016/embeddable-python-osx/) 和 (@ 987654322@).

对我来说唯一剩下的问题是通过 zip 压缩整个标准库减去 lib-dynloadconfig-3.7m-darwinsite-packages 来减少应用程序中 python 分布大小的大小。

我的目录结构如下:

- python3.7/
  - include/
  - lib/
    - python3.7/
  - libpython3.7.dylib
  - python3.7 <executable>

基本的初始步骤是将lib-dynloadconfig-3.7m-darwinlib/python3.7 移动,以便我可以将sodlib 源文件压缩到lib/python37.zip,然后将lib-dynloadconfig-3.7m-darwin 移回现在为空的@ 987654334@ 最终得到所需的结构:

- python3.7/
  - include/
  - lib/
    - python3.7/
      - lib-dynload/
      - config-3.7m-darwin
    - python37.zip
  - libpython3.7.dylib
  - python3.7 <executable>

为了测试它是否有效,我会从可执行文件中检查sys.path,并尝试导入一个模块并检查其__file__ 属性以查看它是否来自zip 存档。

在此基础上,我会将cd 转换为lib/python3.7 并尝试以下操作:

  1. 选择所有文件和文件夹并使用 OS X 的 Finder 的 compress 压缩以生成 python37.zip

  2. 使用pythonzipfile模块:

python -m zipfile -c python37.zip lib/python3.7/*

  1. 使用来自How can you bundle all your python code into a single zip file?zip 方法
cd lib/python3.7
zip -r9 ../python37.zip *

在所有情况下,我都是通过将 PYTHONPATH 设置为压缩库来使其工作的,如下所示:

PYTHONPATH=lib/python37.zip ./python3.7`

这样做,我能够成功地从 zip 存档导入并验证模块来自 zip 存档。但是没有设置PYTHONPATH,就不行了。

因此,我非常感谢一些帮助,以建立正确和最直接的压缩标准库的方法,以便从 sys.path 自动识别它(无需任何额外步骤,例如指定 PYTHONPATH 环境值,这可能在用户的机器上是不可能的)。

提前感谢您提供的任何帮助。

S

【问题讨论】:

    标签: python zip zipfile


    【解决方案1】:

    经过漫长的排除过程终于弄明白了。

    您必须保留在站点包中的唯一模块是os.py

    这是整个过程的 bash 脚本,它可能有效,也可能无效。它假设你已经从 python.org 下载了一个 python 源代码分发

    然后cd 进入生成的源文件夹并在根目录中运行此脚本

    #!/usr/bin/env bash
    
    # build_python.sh
    # NOTE: need os.py to remain in site-packages or it will fail
    
    
    
    NAME=xpython
    PWD=$(pwd)
    PREFIX=${PWD}/${NAME}
    VERSION=3.8
    VER="${VERSION//./}"
    LIB=${PREFIX}/lib/python${VERSION}
    MAC_DEP_TARGET=10.13
    
    
    remove() {
        echo "removing $1"
        rm -rf $1
    }
    
    rm_lib() {
        echo "removing $1"
        rm -rf ${LIB}/$1
    }
    
    
    clean() {
        echo "removing __pycache__ .pyc/o from $1"
        find $1 | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
    }
    
    clean_tests() {
        echo "removing 'test' dirs from $1"
        find $1 | grep -E "(tests|test)" | xargs rm -rf
    }
    
    clean_site_packages() {
        echo "removing everything in $LIB/site-packages"
        rm -rf $LIB/site-packages/*
    }
    
    rm_ext() {
        echo "removing $LIB/lib-dynload/$1.cpython-${VER}-darwin.so"
        rm -rf $LIB/lib-dynload/$1.cpython-38-darwin.so
    }
    
    rm_bin() {
        echo "removing $PREFIX/bin/$1"
        rm -rf $PREFIX/bin/$1
    }
    
    ./configure MACOSX_DEPLOYMENT_TARGET=${MAC_DEP_TARGET} \
      --prefix=$PREFIX \
      --enable-shared \
      --with-universal-archs=64-bit \
      --with-lto \
      --enable-optimizations
    
    make altinstall
    
    
    clean $PREFIX
    clean_tests $LIB
    clean_site_packages
    remove ${LIB}/site-packages
    
    # remove what you want here...
    rm_lib config-${VERSION}-darwin
    rm_lib idlelib
    rm_lib lib2to3
    rm_lib tkinter
    rm_lib turtledemo
    rm_lib turtle.py
    rm_lib ensurepip
    rm_lib venv
    
    remove $LIB/distutils/command/*.exe
    remove $PREFIX/lib/pkgconfig
    remove $PREFIX/share
    
    # remove what you want here...
    rm_ext _tkinter
    
    
    rm_bin 2to3-${VERSION}
    rm_bin idle${VERSION}
    rm_bin easy_install-${VERSION}
    rm_bin pip${VERSION}
    
    
    
    mv $LIB/lib-dynload $PREFIX
    cp $LIB/os.py $PREFIX
    clean $PREFIX
    python -m zipfile -c $PREFIX/lib/python${VER}.zip $LIB/*
    remove $LIB
    mkdir -p $LIB
    mv $PREFIX/lib-dynload $LIB
    mv $PREFIX/os.py $LIB
    mkdir $LIB/site-packages
    

    这是一个mac用户,可以很容易地适应其他平台。它没有经过很好的测试,所以如果您遇到任何问题,请发布反馈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2017-02-21
      • 2017-03-16
      相关资源
      最近更新 更多