Skip to main content

Python bindings for QuickJS

Project description

Tests

python-quickjs-runtime

A lightweight Python binding for the QuickJS Javascript Engine.

This library allows you to execute JavaScript code within your Python applications, providing seamless interoperability between Python and JavaScript.

Features

  • Evaluate JavaScript: Run JS code strings directly from Python.
  • ES2023 Support: Support for modern JS features including async/await.
  • Data Exchange: Pass int, float, str, bool, list, dict, and BigInt between Python and JS.
  • Python Callbacks: Call Python functions directly from JavaScript.
  • REPL: Includes a simple interactive shell for testing JS snippets.
  • Easy Build: Uses zigcc-build for reliable cross-platform compilation.

Installation

You can install the package from the source:

pip install .

Usage

Basic Evaluation

from quickjs_runtime import Runtime

rt = Runtime()
ctx = rt.new_context()

# Evaluate simple expressions
result = ctx.eval("1 + 2")
print(result)  # 3

# Evaluate strings
greeting = ctx.eval("'Hello ' + 'World'")
print(greeting)  # "Hello World"

Interoperability

You can set global variables in the JavaScript context and retrieve results.

from quickjs_runtime import Runtime

rt = Runtime()
ctx = rt.new_context()

# Set variables
ctx.set("x", 10)
ctx.set("y", 20)

# Use them in JS
result = ctx.eval("x * y")
print(result)  # 200

Calling Python from JavaScript

You can pass Python functions to the JavaScript context.

from quickjs_runtime import Runtime

def add(a, b):
    return a + b

rt = Runtime()
ctx = rt.new_context()
ctx.set("py_add", add)

# Call the Python function from JS
result = ctx.eval("py_add(5, 7)")
print(result)  # 12

Custom Filenames and Stack Traces

You can provide a filename to eval for better error messages.

from quickjs_runtime import Runtime

rt = Runtime()
ctx = rt.new_context()

try:
    ctx.eval("throw new Error('oops')", filename="my_script.js")
except RuntimeError as e:
    print(e)  # error message containing 'my_script.js'

Async/Await Support

Wait for Promises to settle using eval_sync.

from quickjs_runtime import Runtime

rt = Runtime()
ctx = rt.new_context()

script = """
async function fetchData() {
    return "done";
}
fetchData();
"""

# eval_sync will run the job queue until all promises are settled
ctx.eval_sync(script) 

REPL

The package includes a simple REPL (Read-Eval-Print Loop).

python -m quickjs_runtime

Development

This project uses zigcc-build to compile the C extensions. This ensures a consistent build environment without needing to install system-wide C compilers.

To build and install locally:

python -m build
pip install dist/*.whl

To run tests:

pytest

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

quickjs_runtime-0.2.3-cp312-cp312-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.12Windows x86-64

quickjs_runtime-0.2.3-cp312-cp312-macosx_15_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

File details

Details for the file quickjs_runtime-0.2.3-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for quickjs_runtime-0.2.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2f059b97fc5937845e9e8fb693d3cc848d7404b090575ef18525bb79ad201bf7
MD5 db2415700e6616535271df5550c7dd0e
BLAKE2b-256 cab34e69ffedacc335a4fd176c82ce995479bd989c968e4c1933d25d6dee0680

See more details on using hashes here.

File details

Details for the file quickjs_runtime-0.2.3-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for quickjs_runtime-0.2.3-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 0dfa31ae053db0a18b3e5f4b1a4269562ec4fc799e55fa4ae370a87c6c68d6dd
MD5 f966266df285021607c198d6fc4291cc
BLAKE2b-256 5e36e030ad9ca690d5350cdb3e179f3b699eeeb39c7846059e0343c967aef5a6

See more details on using hashes here.

Supported by

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