跳转到主要内容

Web上Python包的打包器

项目描述

pyodide-pack

PyPI Latest Release GHA CI

Web上Python包的打包器

此包仍然非常实验性

pyodide-pack检测在Web上使用Pyodide运行的Python应用程序中的使用模块,并创建包含它们的最低限度捆绑包。这允许显著减少Python应用程序的下载大小,前提是执行代码事先已知。

安装

pyodide-pack需要Python 3.10+以及NodeJS

pip install pyodide-pack
npm install pyodide@0.20.1-alpha.2
# A hack due to the npm package having issues
wget https://cdn.jsdelivr.net.cn/pyodide/v0.20.0/full/packages.json -O node_modules/pyodide/packages.json

快速入门

  1. 创建包含您在Web上运行的Python应用程序代码的文件。例如,我们将使用examples/scikit-learn/app.py

    app.py

    import pandas as pd  # noqa
    
    pd.DataFrame(range(10))
    

    此应用程序可以用Pyodide运行,需要下载大约10.5MB的包,包括numpy和pandas,以及约7MB的CPython和stdlib。

  2. 创建包捆绑包

    pyodide pack examples/pandas/app.py
    

    这将产生以下输出

    Running pyodide-pack on examples/pandas/app.py
    
    Note: unless otherwise specified all sizes are given for gzip compressed files to
    be representative of CDN compression.
    
    Loaded requirements from: examples/pandas/requirements.txt
    Running the input code in Node.js to detect used modules..
    
    [..]
    
    Done input code execution in 11.1 s
    
    Detected 8 dependencies with a total size of 10.54 MB  (uncompressed: 40.99 MB)
    In total 425 files and 54 dynamic libraries were accessed.
    
                                           Packing..
    ┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━┓
    ┃ No ┃ Package                        ┃ All files ┃ .so libs ┃   Size (MB) ┃ Reduction ┃
    ┡━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━┩
    │  1 │ distutils.tar                  │   101 → 0 │    0 → 0 │ 0.26 → 0.00 │   100.0 % │
    │  2 │ numpy-1.22.3-cp310-cp310-emsc… │  418 → 94 │  19 → 13 │ 3.63 → 2.49 │    31.4 % │
    │  3 │ pandas-1.4.2-cp310-cp310-emsc… │ 469 → 283 │  42 → 41 │ 5.11 → 4.50 │    12.0 % │
    │  4 │ pyparsing-3.0.7-py3-none-any.… │    17 → 0 │    0 → 0 │ 0.10 → 0.00 │   100.0 % │
    │  5 │ python_dateutil-2.8.2-py2.py3… │   25 → 15 │    0 → 0 │ 0.24 → 0.22 │     9.4 % │
    │  6 │ pytz-2022.1-py2.py3-none-any.… │   612 → 5 │    0 → 0 │ 0.43 → 0.02 │    96.1 % │
    │  7 │ setuptools-62.0.0-py3-none-an… │   213 → 0 │    0 → 0 │ 0.76 → 0.00 │   100.0 % │
    │  8 │ six-1.16.0-py2.py3-none-any.w… │     6 → 1 │    0 → 0 │ 0.01 → 0.01 │    18.5 % │
    └────┴────────────────────────────────┴───────────┴──────────┴─────────────┴───────────┘
    Wrote pyodide-package-bundle.zip with 7.36 MB (30.2% reduction)
    
    Running the input code in Node.js to validate bundle..
    
            Validating and benchmarking the output bundle..
    ┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┓
    ┃ Step                 ┃ Load time (s) ┃ Fraction of load time ┃
    ┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━┩
    │ loadPyodide          │          2.59 │                24.4 % │
    │ fetch_unpack_archive │          0.27 │                 2.5 % │
    │ load_dynamic_libs    │          6.21 │                58.5 % │
    │ import_run_app       │          1.56 │                14.7 % │
    │ TOTAL                │         10.63 │                 100 % │
    └──────────────────────┴───────────────┴───────────────────────┘
    
    Bundle validation successful.
    
  3. 使用以下方式加载您的Python Web应用程序

    let pyodide = await loadPyodide({fullStdLib: false});
    
    await pyodide.runPythonAsync(`
      from pyodide.http import pyfetch
    
      response = await pyfetch("<your-server>/pyodide-package-bundle.zip")
      await response.unpack_archive(extract_dir='/')
    `)
    
    await pyodide.pyimport('pyodide_pack_loader').setup();
    

实现

此打包器在Node.js中运行您的应用程序并拦截

  • FS.open读取模式调用,包括从Python、C或JavaScript打开的Emscripten的MEMFS文件系统中的访问文件。
  • 加载动态库的调用

然后将包轮重新打包成包含访问文件和动态库的单个捆绑包。

许可证

pyodide-pack使用Mozilla公共许可证版本2.0

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

pyodide-pack-0.2.0.tar.gz (21.1 kB 查看哈希值)

上传于

构建分发

pyodide_pack-0.2.0-py3-none-any.whl (17.4 kB 查看哈希值)

上传于 Python 3

支持者