Skip to main content

适用于 Python 的最小的现代嵌入式 V8。

项目描述

https://img.shields.io/pypi/v/py_mini_racer.svg https://dev.azure.com/sqreenci/PyMiniRacer/_apis/build/status/sqreen.PyMiniRacer?branchName=master https://img.shields.io/badge/License-ISC-blue.svg

适用于 Python 的最小的现代嵌入式 V8。

https://github.com/sqreen/PyMiniRacer/raw/master/data/py_mini_racer.png

特征

  • 最新的 ECMAScript 支持

  • 网络组装支持

  • Unicode 支持

  • 线程安全

  • 可重用的上下文

Django 或 Flask 项目可以轻松使用 MiniRacer 来缩小资产、运行 babel 或 WASM 模块。

例子

MiniRacer 使用简单:

>>> from py_mini_racer import MiniRacer
>>> ctx = MiniRacer()
>>> ctx.eval("1+1")
2
>>> ctx.eval("var x = {company: 'Sqreen'}; x.company")
'Sqreen'
>>> print(ctx.eval("'\N{HEAVY BLACK HEART}'"))

>>> ctx.eval("var fun = () => ({ foo: 1 });")

变量保存在上下文中:

>>> ctx.eval("x.company")
'Sqreen'

虽然eval只支持返回原始数据类型,如字符串,但call支持返回复合类型,如对象:

>>> ctx.call("fun")
{'foo': 1}

复合值使用 JSON 序列化。发送非 JSON 可编码参数时使用自定义 JSON 编码器:

import json

from datetime import datetime

class CustomEncoder(json.JSONEncoder):

        def default(self, obj):
            if isinstance(obj, datetime):
                return obj.isoformat()

            return json.JSONEncoder.default(self, obj)
>>> ctx.eval("var f = function(args) { return args; }")
>>> ctx.call("f", datetime.now(), encoder=CustomEncoder)
'2017-03-31T16:51:02.474118'

MiniRacer 支持 ES6:

>>> ctx.execute("[1,2,3].includes(5)")
False

可以检索 V8 堆信息:

>>> ctx.heap_stats()
{'total_physical_size': 1613896,
 'used_heap_size': 1512520,
 'total_heap_size': 3997696,
 'total_heap_size_executable': 3145728,
 'heap_size_limit': 1501560832}

测试中提供了一个 WASM 示例。

兼容性

PyMiniRacer 与 Python 2 和 3 兼容并基于 ctypes。

二进制构建已在 x86_64 上进行了测试,其中:

  • macOS >= 10.13

  • Ubuntu >= 16.04

  • Debian >= 9

  • 中央操作系统 >= 7

  • 高山 >= 3.11

  • 视窗 10

它应该可以在任何具有 libc >= 2.12 和 wheel 兼容 pip (>= 8.1) 的 Linux 上运行。

如果您正在运行 Alpine Linux,您可能需要使用以下命令手动安装所需的依赖项:

$ apk add libgcc libstdc++

如果您有一个最新的点子并且它不使用轮子,那么您可能有一个没有构建轮子的环境。请打开一个问题。

安装

我们为 macOS 64 位、Linux 64 位和 Windows 64 位构建了 Python 轮子(预构建的二进制文件)。

$ pip install py-mini-racer

建造

警告:从源代码构建这个包需要几个 GB 的磁盘空间,大约需要 60 分钟。

首先检查您当前的 Python 可执行文件是 2.7 版。这是 V8 构建系统所要求的。

$ python --version
Python 2.7.16

您可以使用以下命令构建扩展:

$ python helpers/v8_build.py

您可以使用以下命令为任何 Python 版本生成轮子:

$ python3 helpers/build_package.py wheel dist

然后它将构建 V8 扩展,并为您当前的 Python 版本生成一个轮子。V8 构建缓存在py_mini_racer/extension/v8/ 目录中。

在 macOS 上构建的注意事项

需要从以下位置下载旧版 Python 二进制构建 (OSX 10.6):

https://www.python.org/downloads/

他们将允许构建与以前的 OSX 版本兼容的轮子。

测试

如果要运行测试,需要先构建扩展,首先安装pytest:

$ python -m pip install pytest

然后启动:

$ python -m pytest tests

学分

由Sqreen用爱建造。

PyMiniRacer 的发布在这篇博文中进行了描述。

PyMiniRacer的灵感来自由Sam Saffron 为 Ruby 世界构建的 mini_racer。

Cookiecutter-pypackage被用作这个包的骨架。

历史

0.6.0 (2020-04-20)

  • 将 V8 更新到 8.9

  • 优化不带参数的函数调用

  • 将 V8 切换到单线程模式以避免 fork 后崩溃

  • 默认切换到严格模式

  • 修改文档

0.5.0 (2020-02-25)

  • 将 V8 更新到 8.8

0.4.0 (2020-09-22)

  • 适用于 Linux、Mac 和 Windows 的通用轮子

  • 回退到 Alpine Linux 的源代码包

0.3.0 (2020-06-29)

  • 引入严格模式

  • 修复大小动态变化时的数组转换 (CVE-2020-25489)

0.2.0 (2020-03-11)

  • 支持 Alpine Linux

  • 避免在 setup.py 中使用 pip 私有模块

0.2.0b1 (2020-01-09)

  • 支持 Windows 64 位

  • 支持 Python 3.8

  • 将 V8 升级到 7.8

  • 支持软内存限制

0.1.18 (2019-01-04)

  • 支持内存和时间限制

0.1.17 (2018-19-12)

  • 升级 libv8

  • 修复内存泄漏

0.1.16 (2018-07-11)

  • 在没有 PyMalloc 的情况下为 Python 添加轮子

0.1.15 (2018-06-18)

  • 为 Python 3.7 添加轮子

0.1.14 (2018-05-25)

  • 添加对 pip 10 的支持

  • 更新包元数据

0.1.13 (2018-03-15)

  • 添加 heap_stats 函数

  • 修复返回的字符串包含空字节的问题

0.1.12 (2018-17-04)

  • 删除对枚举的依赖

0.1.11 (2017-07-11)

  • 添加对centos6的兼容性

0.1.10 (2017-03-31)

  • 添加在调用中传递自定义 JSON 编码器的可能性。

0.1.9 (2017-03-24)

  • 修复 Ubuntu 12.04 和 glibc < 2.17 的编译。

0.1.8 (2017-03-02)

  • 更新目标构建以更好地兼容旧的 Mac OS X 和 linux 平台。

0.1.7 (2016-10-04)

  • 提高 JS 执行的一般性能。

  • 添加构建不同版本的 V8 的可能性(例如使用调试符号)。

  • 修复静态链接库和动态库之间可能发生的冲突。

0.1.6 (2016-08-12)

  • 当 py_mini_racer sdist 构建失败时添加错误消息,要求更新 pip 以下载预编译的轮子而不是源代码分发。

0.1.5 (2016-08-04)

  • 针对静态 Python 构建 py_mini_racer。当针对共享库 python 构建时,它不适用于静态 Python。

0.1.4 (2016-08-04)

  • 确保将 JSEvalException 消息转换为 unicode

0.1.3 (2016-08-04)

  • 修复 python3 的扩展加载

  • 添加用于构建发行版的 make 目标(sdist + Wheels)

  • 修复 python 3 的 eval 转换

0.1.2 (2016-08-03)

  • 修复日期支持

  • 修复 Dockerfile 以生成 python3 轮子

0.1.1 (2016-08-02)

  • 修复 sdist 分发。

0.1.0 (2016-08-01)

  • PyPI 上的第一个版本。

项目详情


下载文件

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

源分布

py_mini_racer-0.6.0.tar.gz (6.0 MB 查看哈希

已上传 source

内置发行版

py_mini_racer-0.6.0-py2.py3-none-win_amd64.whl (4.8 MB 查看哈希

已上传 py2 py3

py_mini_racer-0.6.0-py2.py3-none-manylinux1_x86_64.whl (5.4 MB 查看哈希

已上传 py2 py3

py_mini_racer-0.6.0-py2.py3-none-macosx_10_10_x86_64.whl (5.3 MB 查看哈希

已上传 py2 py3