Skip to main content

Minimal, modern embedded V8 for Python.

Project description

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

Minimal, modern embedded V8 for Python.

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

Features

  • Latest ECMAScript support

  • Web Assembly support

  • Unicode support

  • Thread safe

  • Re-usable contexts

MiniRacer can be easily used by Django or Flask projects to minify assets, run babel or WASM modules.

Examples

MiniRacer is straightforward to use:

>>> 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 });")

Variables are kept inside of a context:

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

While eval only supports returning primitive data types such as strings, call supports returning composite types such as objects:

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

Composite values are serialized using JSON. Use a custom JSON encoder when sending non-JSON encodable parameters:

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 is ES6 capable:

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

V8 heap information can be retrieved:

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

A WASM example is available in the tests.

Compatibility

PyMiniRacer is compatible with Python 2 & 3 and based on ctypes.

The binary builds have been tested on x86_64 with:

  • macOS >= 10.13

  • Ubuntu >= 16.04

  • Debian >= 9

  • CentOS >= 7

  • Alpine >= 3.11

  • Windows 10

It should work on any Linux with a libc >= 2.12 and a wheel compatible pip (>= 8.1).

If you’re running Alpine Linux, you may need to install required dependencies manually using the following command:

$ apk add libgcc libstdc++

If you have a up-to-date pip and it doesn’t use a wheel, you might have an environment for which no wheel is built. Please open an issue.

Installation

We built Python wheels (prebuilt binaries) for macOS 64 bits, Linux 64 bits and Windows 64 bits.

$ pip install py-mini-racer

Build

Warning: building this package from source takes several GB of disk space and takes ~60 minutes.

First check that your current Python executable is version 2.7. This is required by the V8 build system.

$ python --version
Python 2.7.16

You can build the extension with the following command:

$ python helpers/v8_build.py

You can generate a wheel for whatever Python version with the command:

$ python3 helpers/build_package.py wheel dist

It will then build V8, the extension, and generates a wheel for your current Python version. The V8 builds are cached in the py_mini_racer/extension/v8/ directory.

Notes for building on macOS

The legacy Python binary builds (OSX 10.6) need to be downloaded from:

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

They will allow to build a wheel compatible with former OSX versions.

Tests

If you want to run the tests, you need to build the extension first, first install pytest:

$ python -m pip install pytest

Then launch:

$ python -m pytest tests

Credits

Built with love by Sqreen.

PyMiniRacer launch was described in this blog post.

PyMiniRacer is inspired by mini_racer, built for the Ruby world by Sam Saffron.

Cookiecutter-pypackage was used as this package skeleton.

History

0.6.0 (2020-04-20)

  • Update V8 to 8.9

  • Optimize function calls without arguments

  • Switch V8 to single threaded mode to avoid crashes after fork

  • Switch to strict mode by default

  • Revamp documentation

0.5.0 (2020-02-25)

  • Update V8 to 8.8

0.4.0 (2020-09-22)

  • Universal wheels for Linux, Mac and Windows

  • Fallback to source package for Alpine Linux

0.3.0 (2020-06-29)

  • Introduce a strict mode

  • Fix array conversion when size changes dynamically (CVE-2020-25489)

0.2.0 (2020-03-11)

  • Support for Alpine Linux

  • Avoid pip private modules in setup.py

0.2.0b1 (2020-01-09)

  • Support for Windows 64 bits

  • Support for Python 3.8

  • Upgrade V8 to 7.8

  • Support soft memory limits

0.1.18 (2019-01-04)

  • Support memory and time limits

0.1.17 (2018-19-12)

  • Upgrade libv8

  • Fix a memory leak

0.1.16 (2018-07-11)

  • Add wheel for Python without PyMalloc

0.1.15 (2018-06-18)

  • Add wheel for Python 3.7

0.1.14 (2018-05-25)

  • Add support for pip 10

  • Update package metadata

0.1.13 (2018-03-15)

  • Add heap_stats function

  • Fix issue with returned strings containing null bytes

0.1.12 (2018-17-04)

  • Remove dependency to enum

0.1.11 (2017-07-11)

  • Add compatibility for centos6

0.1.10 (2017-03-31)

  • Add the possibility to pass a custom JSON encoder in call.

0.1.9 (2017-03-24)

  • Fix the compilation for Ubuntu 12.04 and glibc < 2.17.

0.1.8 (2017-03-02)

  • Update targets build for better compatibility with old Mac OS X and linux platforms.

0.1.7 (2016-10-04)

  • Improve general performances of the JS execution.

  • Add the possibility to build a different version of V8 (for example with debug symbols).

  • Fix a conflict that could happens between statically linked libraries and dynamic ones.

0.1.6 (2016-08-12)

  • Add error message when py_mini_racer sdist fails to build asking to update pip in order to download the pre-compiled wheel instead of the source distribution.

0.1.5 (2016-08-04)

  • Build py_mini_racer against a static Python. When built against a shared library python, it doesn’t work with a static Python.

0.1.4 (2016-08-04)

  • Ensure JSEvalException message is converted to unicode

0.1.3 (2016-08-04)

  • Fix extension loading for python3

  • Add a make target for building distributions (sdist + wheels)

  • Fix eval conversion for python 3

0.1.2 (2016-08-03)

  • Fix date support

  • Fix Dockerfile for generating python3 wheels

0.1.1 (2016-08-02)

  • Fix sdist distribution.

0.1.0 (2016-08-01)

  • First release on PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_mini_racer-0.6.0.tar.gz (6.0 MB view details)

Uploaded Source

Built Distributions

py_mini_racer-0.6.0-py2.py3-none-win_amd64.whl (4.8 MB view details)

Uploaded Python 2 Python 3 Windows x86-64

py_mini_racer-0.6.0-py2.py3-none-manylinux1_x86_64.whl (5.4 MB view details)

Uploaded Python 2 Python 3

py_mini_racer-0.6.0-py2.py3-none-macosx_10_10_x86_64.whl (5.3 MB view details)

Uploaded Python 2 Python 3 macOS 10.10+ x86-64

File details

Details for the file py_mini_racer-0.6.0.tar.gz.

File metadata

  • Download URL: py_mini_racer-0.6.0.tar.gz
  • Upload date:
  • Size: 6.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.0 requests/2.25.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/2.7.16

File hashes

Hashes for py_mini_racer-0.6.0.tar.gz
Algorithm Hash digest
SHA256 f71e36b643d947ba698c57cd9bd2232c83ca997b0802fc2f7f79582377040c11
MD5 ce07b3bd8ecceea6cbc3f6ff51f1f79f
BLAKE2b-256 5097a578b918b2e5923dd754cb60bb8b8aeffc85255ffb92566e3c65b148ff72

See more details on using hashes here.

File details

Details for the file py_mini_racer-0.6.0-py2.py3-none-win_amd64.whl.

File metadata

  • Download URL: py_mini_racer-0.6.0-py2.py3-none-win_amd64.whl
  • Upload date:
  • Size: 4.8 MB
  • Tags: Python 2, Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.0 requests/2.25.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/2.7.16

File hashes

Hashes for py_mini_racer-0.6.0-py2.py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 97cab31bbf63ce462ba4cd6e978c572c916d8b15586156c7c5e0b2e42c10baab
MD5 6d374ecdbac8cb5e44a59ec8aaf40bb0
BLAKE2b-256 5d7176ac5d593e14b148a4847b608c5ad9a2c7c4827c796c33b396d0437fa113

See more details on using hashes here.

File details

Details for the file py_mini_racer-0.6.0-py2.py3-none-manylinux1_x86_64.whl.

File metadata

  • Download URL: py_mini_racer-0.6.0-py2.py3-none-manylinux1_x86_64.whl
  • Upload date:
  • Size: 5.4 MB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.0 requests/2.25.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/2.7.16

File hashes

Hashes for py_mini_racer-0.6.0-py2.py3-none-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 42896c24968481dd953eeeb11de331f6870917811961c9b26ba09071e07180e2
MD5 a6338e8383e784bb39741a63e5d01eb5
BLAKE2b-256 29a98ce0ca222ef04d602924a1e099be93f5435ca6f3294182a30574d4159ca2

See more details on using hashes here.

File details

Details for the file py_mini_racer-0.6.0-py2.py3-none-macosx_10_10_x86_64.whl.

File metadata

  • Download URL: py_mini_racer-0.6.0-py2.py3-none-macosx_10_10_x86_64.whl
  • Upload date:
  • Size: 5.3 MB
  • Tags: Python 2, Python 3, macOS 10.10+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.0 requests/2.25.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/2.7.16

File hashes

Hashes for py_mini_racer-0.6.0-py2.py3-none-macosx_10_10_x86_64.whl
Algorithm Hash digest
SHA256 346e73bb89a2024888244d487834be24a121089ceb0641dd0200cb96c4e24b57
MD5 dc5823c40af70b4538d5d406adf422c8
BLAKE2b-256 1313058240c7fd1fbf29a24bda048d93346c2a56275736b76b56afe64050a161

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page