Skip to main content

Seamless interop between Python and JavaScript.

Project description

PythonMonkey

Test and Publish Suite

About

PythonMonkey is a Mozilla SpiderMonkey JavaScript engine embedded into the Python Runtime, using the Python engine to provide the Javascript host environment.

We feature JavaScript Array and Object methods implemented on Python List and Dictionaries using the cPython C API, and the inverse using the Mozilla Firefox Spidermonkey JavaScript C++ API.

This project has reached MVP as of September 2024. It is under maintenance by Distributive.

External contributions and feedback are welcome and encouraged.

tl;dr

$ pip install pythonmonkey
from pythonmonkey import eval as js_eval

js_eval("console.log")('hello, world')

Goals

  • Fast and memory-efficient
  • Make writing code in either JS or Python a developer preference
  • Use JavaScript libraries from Python
  • Use Python libraries from JavaScript
  • The same process runs both JavaScript and Python VirtualMachines - no serialization, pipes, etc
  • Python Lists and Dicts behave as Javacript Arrays and Objects, and vice-versa, fully adapting to the given context.

Data Interchange

  • Strings share immutable backing stores whenever possible (when allocating engine choses UCS-2 or Latin-1 internal string representation) to keep memory consumption under control, and to make it possible to move very large strings between JavaScript and Python library code without memory-copy overhead.
  • TypedArrays share mutable backing stores.
  • JS objects are represented by Python dicts through a Dict subclass for optimal compatibility. Similarly for JS arrays and Python lists.
  • JS Date objects are represented by Python datetime.datetime objects
  • Intrinsics (boolean, number, null, undefined) are passed by value
  • JS Functions are automatically wrapped so that they behave like Python functions, and vice-versa
  • Python Lists are represented by JS true arrays and support all Array methods through a JS API Proxy. Similarly for Python Dicts and JS objects.

Roadmap

  • [done] JS instrinsics coerce to Python intrinsics
  • [done] JS strings coerce to Python strings
  • [done] JS objects coerce to Python dicts [own-properties only]
  • [done] JS functions coerce to Python function wrappers
  • [done] JS exceptions propagate to Python
  • [done] Implement eval() function in Python which accepts JS code and returns JS->Python coerced values
  • [done] NodeJS+NPM-compatible CommonJS module system
  • [done] Python strings coerce to JS strings
  • [done] Python intrinsics coerce to JS intrinsics
  • [done] Python dicts coerce to JS objects
  • [done] Python require function, returns a coerced dict of module exports
  • [done] Python functions coerce to JS function wrappers
  • [done] CommonJS module system .py loader, loads Python modules for use by JS
  • [done] Python host environment supplies event loop, including EventEmitter, setTimeout, etc.
  • [done] Python host environment supplies XMLHttpRequest
  • [done] Python TypedArrays coerce to JS TypeArrays
  • [done] JS TypedArrays coerce to Python TypeArrays
  • [done] Python lists coerce to JS Arrays
  • [done] JS arrays coerce to Python lists
  • [90%] PythonMonkey can run the dcp-client npm package from Distributive.

Build Instructions

Read this if you want to build a local version.

  1. You will need the following installed (which can be done automatically by running ./setup.sh):

    • bash
    • cmake
    • Doxygen 1.9 series (if you want to build the docs)
    • graphviz (if you want to build the docs)
    • llvm
    • rust
    • python3.8 or later with header files (python3-dev)
    • spidermonkey latest from mozilla-central
    • npm (nodejs)
    • Poetry
    • poetry-dynamic-versioning
  2. Run poetry install. This command automatically compiles the project and installs the project as well as dependencies into the poetry virtualenv. If you would like to build the docs, set the BUILD_DOCS environment variable, like so: BUILD_DOCS=1 poetry install. PythonMonkey supports multiple build types, which you can build by setting the BUILD_TYPE environment variable, like so: BUILD_TYPE=Debug poetry install. The build types are (case-insensitive):

  • Release: stripped symbols, maximum optimizations (default)
  • DRelease: same as Release, except symbols are not stripped
  • Debug: minimal optimizations
  • Sanitize: same as Debug, except with AddressSanitizer enabled
  • Profile: same as Debug, except profiling is enabled
  • None: don't compile (useful if you only want to build the docs)

If you are using VSCode, you can just press Ctrl + Shift + B to run build task - We have the tasks.json file configured for you.

Running tests

  1. Compile the project
  2. Install development dependencies: poetry install --no-root --only=dev
  3. From the root directory, run poetry run pytest ./tests/python
  4. From the root directory, run poetry run bash ./peter-jr ./tests/js/

For VSCode users, similar to the Build Task, we have a Test Task ready to use.

Using the library

npm (Node.js) is required during installation only to populate the JS dependencies.

Install from PyPI

$ pip install pythonmonkey

Install the nightly build

$ pip install --extra-index-url https://nightly.pythonmonkey.io/ --pre pythonmonkey

Use local version

pythonmonkey is available in the poetry virtualenv once you compiled the project using poetry.

$ poetry run python
Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pythonmonkey as pm
>>> hello = pm.eval("() => {return 'Hello from Spidermonkey!'}")
>>> hello()
'Hello from Spidermonkey!'

Alternatively, you can build installable packages by running

$ cd python/pminit && poetry build --format=sdist && cd - && mv -v python/pminit/dist/* ./dist/
$ poetry build --format=wheel

and install them by pip install ./dist/*.

Uninstallation

Installing pythonmonkey will also install the pminit package as a dependency. However, pip uninstalling a package won't automatically remove its dependencies.
If you want to cleanly remove pythonmonkey from your system, do the following:

$ pip uninstall pythonmonkey pminit

Debugging Steps

  1. build the project locally
  2. To use gdb, run poetry run gdb python. See Python Wiki: DebuggingWithGdb

If you are using VSCode, it's more convenient to debug in VSCode's built-in debugger. Simply press F5 on an open Python file in the editor to start debugging - We have the launch.json file configured for you.

Examples

Official API

These methods are exported from the pythonmonkey module. See definitions in python/pythonmonkey/pythonmonkey.pyi.

eval(code, options)

Evaluate JavaScript code. The semantics of this eval are very similar to the eval used in JavaScript; the last expression evaluated in the code string is used as the return value of this function. To evaluate code in strict mode, the first expression should be the string "use strict".

options

The eval function supports an options object that can affect how JS code is evaluated in powerful ways. They are largely based on SpiderMonkey's CompileOptions. The supported option keys are:

  • filename: set the filename of this code for the purposes of generating stack traces etc.
  • lineno: set the line number offset of this code for the purposes of generating stack traces etc.
  • column: set the column number offset of this code for the purposes of generating stack traces etc.
  • mutedErrors: if set to True, eval errors or unhandled rejections are ignored ("muted"). Default False.
  • noScriptRval: if False, return the last expression value of the script as the result value to the caller. Default False.
  • selfHosting: experimental
  • strict: forcibly evaluate in strict mode ("use strict"). Default False.
  • module: indicate the file is an ECMAScript module (always strict mode code and disallow HTML comments). Default False.
  • fromPythonFrame: generate the equivalent of filename, lineno, and column based on the location of the Python call to eval. This makes it possible to evaluate Python multiline string literals and generate stack traces in JS pointing to the error in the Python source file.

tricks

  • function literals evaluate as undefined in JavaScript; if you want to return a function, you must evaluate an expression:
    pythonmonkey.eval("myFunction() { return 123 }; myFunction")
    
    or
    pythonmonkey.eval("(myFunction() { return 123 })")
    
  • function expressions are a great way to build JS IIFEs that accept Python arguments
    pythonmonkey.eval("(thing) => console.log('you said', thing)")("this string came from Python")
    

require(moduleIdentifier)

Return the exports of a CommonJS module identified by moduleIdentifier, using standard CommonJS semantics

  • modules are singletons and will never be loaded or evaluated more than once
  • moduleIdentifier is relative to the Python file invoking require
  • moduleIdentifier should not include a file extension
  • moduleIdentifiers which do not begin with ./, ../, or / are resolved by search require.path and module.paths.
  • Modules are evaluated immediately after loading
  • Modules are not loaded until they are required
  • The following extensions are supported:
  • .js - JavaScript module; source code decorates exports object
  • .py - Python module; source code decorates exports dict
  • .json - JSON module; exports are the result of parsing the JSON text in the file

globalThis

A Python Dict which is equivalent to the globalThis object in JavaScript.

createRequire(filename, extraPaths, isMain)

Factory function which returns a new require function

  • filename: the pathname of the module that this require function could be used for
  • extraPaths: [optional] a list of extra paths to search to resolve non-relative and non-absolute module identifiers
  • isMain: [optional] True if the require function is being created for a main module

runProgramModule(filename, argv, extraPaths)

Load and evaluate a program (main) module. Program modules must be written in JavaScript. Program modules are not necessary unless the main entry point of your program is written in JavaScript.

  • filename: the location of the JavaScript source code
  • argv: the program's argument vector
  • extraPaths: [optional] a list of extra paths to search to resolve non-relative and non-absolute module identifiers

Care should be taken to ensure that only one program module is run per JS context.

isCompilableUnit(code)

Examines the string code and returns False if the string might become a valid JS statement with the addition of more lines. This is used internally by pmjs and can be very helpful for building JavaScript REPLs; the idea is to accumulate lines in a buffer until isCompilableUnit is true, then evaluate the entire buffer.

new(function)

Returns a Python function which invokes function with the JS new operator.

import pythonmonkey as pm

>>> pm.eval("class MyClass { constructor() { console.log('ran ctor') }}")
>>> MyClass = pm.eval("MyClass")
>>> MyClass()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pythonmonkey.SpiderMonkeyError: TypeError: class constructors must be invoked with 'new'

>>> MyClassCtor = pm.new(MyClass)
>>> MyClassCtor()
ran ctor
{}
>>>

typeof(value)

This is the JS typeof operator, wrapped in a function so that it can be used easily from Python.

Standard Classes and Globals

All of the JS Standard Classes (Array, Function, Object, Date...) and objects (globalThis, FinalizationRegistry...) are available as exports of the pythonmonkey module. These exports are generated by enumerating the global variable in the current SpiderMonkey context. The current list is:

undefined, Boolean, JSON, Date, Math, Number, String, RegExp, Error, InternalError, AggregateError, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError, ArrayBuffer, Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array, Uint8ClampedArray, BigInt64Array, BigUint64Array, BigInt, Proxy, WeakMap, Map, Set, DataView, Symbol, Intl, Reflect, WeakSet, Promise, WebAssembly, WeakRef, Iterator, AsyncIterator, NaN, Infinity, isNaN, isFinite, parseFloat, parseInt, escape, unescape, decodeURI, encodeURI, decodeURIComponent, encodeURIComponent, Function, Object, debuggerGlobal, FinalizationRegistry, Array, globalThis

Built-In Functions

See definitions in python/pythonmonkey/global.d.ts. Including:

  • console
  • atob
  • btoa
  • setTimeout
  • clearTimeout

CommonJS Subsystem Additions

The CommonJS subsystem is activated by invoking the require or createRequire exports of the (Python) pythonmonkey module.

  • require
  • exports
  • module
  • __filename
  • __dirname
  • python.print - the Python print function
  • python.getenv - the Python getenv function
  • python.stdout - an object with read and write methods, which read and write to stdout
  • python.stderr - an object with read and write methods, which read and write to stderr
  • python.exec - the Python exec function
  • python.eval - the Python eval function
  • python.exit - exit via sys.exit(); the exit code is the function argument or python.exit.code.
  • python.paths - the Python sys.paths list, visible in JS as an Array

Type Transfer (Coercion / Wrapping)

When sending variables from Python into JavaScript, PythonMonkey will intelligently coerce or wrap your variables based on their type. PythonMonkey will share backing stores (use the same memory) for ctypes, typed arrays, and strings; moving these types across the language barrier is extremely fast because there is no copying involved.

Note: There are plans in Python 3.12 (PEP 623) to change the internal string representation so that every character in the string uses four bytes of memory. This will break fast string transfers for PythonMonkey, as it relies on the memory layout being the same in Python and JavaScript. As of this writing (July 2023), "classic" Python strings still work in the 3.12 beta releases.

Where shared backing store is not possible, PythonMonkey will automatically emit wrappers that use the "real" data structure as its value authority. Only immutable intrinsics are copied. This means that if you update an object in JavaScript, the corresponding Dict in Python will be updated, etc.

JavaScript Array and Object methods are implemented on Python List and Dictionaries, and vice-versa.

Python Type JavaScript Type
String string
Integer number
Bool boolean
Function function
Dict object
List Array
datetime Date object
awaitable Promise
Error Error object
Buffer ArrayBuffer
JavaScript Type Python Type
string pythonmonkey.JSStringProxy (String)
number Float
bigint pythonmonkey.bigint (Integer)
boolean Bool
function pythonmonkey.JSFunctionProxy
object - most pythonmonkey.JSObjectProxy (Dict)
object - Date datetime
object - Array pythonmonkey.JSArrayProxy (List)
object - Promise awaitable
object - ArrayBuffer Buffer
object - type arrays Buffer
object - Error Error

Tricks

Integer Type Coercion

You can force a number in JavaScript to be coerced as an integer by casting it to BigInt:

function myFunction(a, b) {
  const result = calculate(a, b);
  return BigInt(Math.floor(result));
}

The pythonmonkey.bigint object works like an int in Python, but it will be coerced as a BigInt in JavaScript:

import pythonmonkey

def fn myFunction()
  result = 5
  return pythonmonkey.bigint(result)

Symbol injection via cross-language IIFE

You can use a JavaScript IIFE to create a scope in which you can inject Python symbols:

globalThis.python.exit = pm.eval("""'use strict';
(exit) => function pythonExitWrapper(exitCode) {
  if (typeof exitCode === 'number')
    exitCode = BigInt(Math.floor(exitCode));
  exit(exitCode);
}
""")(sys.exit);

Run Python event-loop

You need an event-loop running to use setTimeout and Promise<=>awaitable coercion.

import asyncio

async def async_fn():
  await pm.eval("""
    new Promise((resolve) => setTimeout((...args) => {
        console.log(args);
        resolve();
      }, 1000, 42, "abc")
    )
  """)
  await pm.eval("async (x) => await x")(asyncio.sleep(0.5))

asyncio.run(async_fn())

pmjs

A basic JavaScript shell, pmjs, ships with PythonMonkey. This shell can act as a REPL or run JavaScript programs; it is conceptually similar to the node shell which ships with Node.js.

Modules

Pmjs starts PythonMonkey's CommonJS subsystem, which allow it to use CommonJS modules, with semantics that are similar to Node.js - e.g. searching module.paths, understanding package.json, index.js, and so on. See the ctx-module for a full list of supported features.

In addition to CommonJS modules written in JavaScript, PythonMonkey supports CommonJS modules written in Python. Simply decorate a Dict named exports inside a file with a .py extension, and it can be loaded by require() -- in either JavaScript or Python.

Program Module

The program module, or main module, is a special module in CommonJS. In a program module:

  • variables defined in the outermost scope are properties of globalThis
  • returning from the outermost scope is a syntax error
  • the arguments variable in an Array which holds your program's argument vector (command-line arguments)
$ echo "console.log('hello world')" > my-program.js
$ pmjs my-program.js
hello world
$

CommonJS Module: JavaScript language

// date-lib.js - require("./date-lib")
const d = new Date();
exports.today = `${d.getFullYear()}-${String(d.getMonth()).padStart(2,'0')}-${String(d.getDay()).padStart(2,'0')}`

CommonJS Module: Python language

# date-lib.py - require("./date-lib")
from datetime import date # You can use Python libraries.
exports['today'] = date.today()

Troubleshooting Tips

CommonJS (require)

If you are having trouble with the CommonJS require function, set environment variable DEBUG='ctx-module*' and you can see the filenames it tries to load.

pmdb

PythonMonkey has a built-in gdb-like JavaScript command-line debugger called pmdb, which would be automatically triggered on debugger; statements and uncaught exceptions.

To enable pmdb, simply call from pythonmonkey.lib import pmdb; pmdb.enable() before doing anything on PythonMonkey.

import pythonmonkey as pm
from pythonmonkey.lib import pmdb

pmdb.enable()

pm.eval("...")

Run help command in pmdb to see available commands.

(pmdb) > help
List of commands:
• ...
• ...

pmjs

  • there is a .help menu in the REPL
  • there is a --help command-line option
  • the --inspect option enables pmdb, a gdb-like JavaScript command-line debugger
  • the -r option can be used to load a module before your program or the REPL runs
  • the -e option can be used evaluate code -- e.g. define global variables -- before your program or the REPL runs
  • The REPL can evaluate Python expressions, storing them in variables named $1, $2, etc.
$ pmjs

Welcome to PythonMonkey v1.0.0.
Type ".help" for more information.
> .python import sys
> .python sys.path
$1 = { '0': '/home/wes/git/pythonmonkey2',
  '1': '/usr/lib/python310.zip',
  '2': '/usr/lib/python3.10',
  '3': '/usr/lib/python3.10/lib-dynload',
  '4': '/home/wes/.cache/pypoetry/virtualenvs/pythonmonkey-StuBmUri-py3.10/lib/python3.10/site-packages',
  '5': '/home/wes/git/pythonmonkey2/python' }
> $1[3]
'/usr/lib/python3.10/lib-dynload'
>

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

pythonmonkey-1.3.0.tar.gz (309.2 kB view details)

Uploaded Source

Built Distributions

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

pythonmonkey-1.3.0-cp314-cp314-win_amd64.whl (13.4 MB view details)

Uploaded CPython 3.14Windows x86-64

pythonmonkey-1.3.0-cp314-cp314-manylinux_2_31_x86_64.whl (22.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.31+ x86-64

pythonmonkey-1.3.0-cp314-cp314-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.0-cp314-cp314-macosx_11_0_x86_64.whl (15.4 MB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

pythonmonkey-1.3.0-cp314-cp314-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pythonmonkey-1.3.0-cp313-cp313-win_amd64.whl (13.0 MB view details)

Uploaded CPython 3.13Windows x86-64

pythonmonkey-1.3.0-cp313-cp313-manylinux_2_31_x86_64.whl (22.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.31+ x86-64

pythonmonkey-1.3.0-cp313-cp313-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.0-cp313-cp313-macosx_11_0_x86_64.whl (15.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

pythonmonkey-1.3.0-cp313-cp313-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pythonmonkey-1.3.0-cp312-cp312-win_amd64.whl (13.0 MB view details)

Uploaded CPython 3.12Windows x86-64

pythonmonkey-1.3.0-cp312-cp312-manylinux_2_31_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.31+ x86-64

pythonmonkey-1.3.0-cp312-cp312-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.0-cp312-cp312-macosx_11_0_x86_64.whl (15.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

pythonmonkey-1.3.0-cp312-cp312-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pythonmonkey-1.3.0-cp311-cp311-win_amd64.whl (13.0 MB view details)

Uploaded CPython 3.11Windows x86-64

pythonmonkey-1.3.0-cp311-cp311-manylinux_2_31_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.31+ x86-64

pythonmonkey-1.3.0-cp311-cp311-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.0-cp311-cp311-macosx_11_0_x86_64.whl (15.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

pythonmonkey-1.3.0-cp311-cp311-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pythonmonkey-1.3.0-cp310-cp310-win_amd64.whl (13.0 MB view details)

Uploaded CPython 3.10Windows x86-64

pythonmonkey-1.3.0-cp310-cp310-manylinux_2_31_x86_64.whl (22.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.31+ x86-64

pythonmonkey-1.3.0-cp310-cp310-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.0-cp310-cp310-macosx_11_0_x86_64.whl (15.4 MB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

pythonmonkey-1.3.0-cp310-cp310-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pythonmonkey-1.3.0-cp39-cp39-win_amd64.whl (13.0 MB view details)

Uploaded CPython 3.9Windows x86-64

pythonmonkey-1.3.0-cp39-cp39-manylinux_2_31_x86_64.whl (22.3 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.31+ x86-64

pythonmonkey-1.3.0-cp39-cp39-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.0-cp39-cp39-macosx_11_0_x86_64.whl (15.4 MB view details)

Uploaded CPython 3.9macOS 11.0+ x86-64

pythonmonkey-1.3.0-cp39-cp39-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

pythonmonkey-1.3.0-cp38-cp38-win_amd64.whl (13.0 MB view details)

Uploaded CPython 3.8Windows x86-64

pythonmonkey-1.3.0-cp38-cp38-manylinux_2_31_x86_64.whl (22.3 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ x86-64

pythonmonkey-1.3.0-cp38-cp38-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.0-cp38-cp38-macosx_11_0_x86_64.whl (15.4 MB view details)

Uploaded CPython 3.8macOS 11.0+ x86-64

pythonmonkey-1.3.0-cp38-cp38-macosx_11_0_arm64.whl (14.8 MB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

Details for the file pythonmonkey-1.3.0.tar.gz.

File metadata

  • Download URL: pythonmonkey-1.3.0.tar.gz
  • Upload date:
  • Size: 309.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.23

File hashes

Hashes for pythonmonkey-1.3.0.tar.gz
Algorithm Hash digest
SHA256 f91a7adc01250fdb70e6528c3855ccc5a2631952f087b16ae902b031154ba8df
MD5 f3678fcbd91e9cdfb9d95e052ddb4984
BLAKE2b-256 a2da87e41378d1949910cfa2976a1117c85094636c28eadd3b4c8a97cbf18c0a

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 75d2a080ccbbe9e7b9acadbc6e54a1ddff1fd33c0feffd804f83ec8637aab048
MD5 d2011975a759cbc590e584d3eb1ec03e
BLAKE2b-256 878ed6e11d803222eb2d079fa4c207962eca5291e2628da62df701868d9faf1e

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp314-cp314-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp314-cp314-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 45c0fbfb3795c1e5ce4639c25867b7b1195350f38148b9a6aaf6fa33e366d0a5
MD5 ac9005bd2375327f72e974492c8e8913
BLAKE2b-256 df2921d1e9a894df5654b210fdc7d33ff89d5045962f852e78d05111ac51de37

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp314-cp314-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp314-cp314-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 fe26246be1d3eb1f92718c9241ea84425dc15c4a2d2def67057aba5cbfff751b
MD5 637401b7dd7116577c661b9dab480437
BLAKE2b-256 9ccc3fd9c0a365b01e9bca0543a993eb4987d46ce9461c89ddbf7530f3beace9

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 61f599aa8e538e53cb01c33d3364a87450def85b87501fb99fac5317e9410185
MD5 a91075259a6e777210d52a6a7bac8b04
BLAKE2b-256 26f475637f172c1c197a851caa986981702c5545d10bc01a4779088e48d62dee

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 865ebb7ba25be5e305f4cb5598f46297b19f9e46605b5efac676040ced087b43
MD5 5f8b203e7b88b6e2d52dca142ea2218f
BLAKE2b-256 a75cf1f6e50886d564daa72e024457139dd38a4a166a084c4a3bc9fc55c6a489

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 816f49080c985500314bb09a47ef45f707c7021d84b4f638f0ebe7725aebc0a9
MD5 cf8911d777f9768a78bce3b73d352c61
BLAKE2b-256 447636cb7e28e263facdc2989ca214a0c99f0582eb4cd3104d13d71020a36daf

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp313-cp313-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp313-cp313-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 52c0a9f74b8b2efb2cf79458a9f08a20c338d81bf85fc1e7179b6c0c05431d9d
MD5 6ae66cc64b6181795ea9021816248f0e
BLAKE2b-256 bc7e03212f721119a71c2e2bc64b86b567a9e903f9c19f9941ee126ee4841833

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp313-cp313-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp313-cp313-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 4818fc9d876a7a759fec995055c96554920da599c750a45ed933d8b64edbf93a
MD5 46f4a064e143a47779120189754ac1be
BLAKE2b-256 67f7e33a0f18b2821fd6d3b7b7c5daf0efc740bc343528a7d2053e194e762fb7

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 16124197c462dcae03158ca750f41ba19acaf6e22e9c1275a7664888adc415ad
MD5 fcc72e92978f41b76143c5d32dc2a346
BLAKE2b-256 81e357f37484720351209603a5555bf3d3325aafa10fea9c0432657d2aa6ab53

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 30e659a5d52caace51e6c9276713af45c6929371a8e4bef4f6720d18f6787df8
MD5 3f82c13251d871c0d1e3465b128dd89d
BLAKE2b-256 779ee5fede17c1cd921c783352129f6fbb23c81debd2eefc105b270ed7a6f923

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6e80cfec60a0c0aaf8c7762611d5b46b7ca2e0eecca8fbef31546e264cd9836e
MD5 b8e0abb37c76114ebb52d4c6fe4ca5d4
BLAKE2b-256 108dddcd2f070dd25a105cf0d459cefe9e461584f8bce7c8025cff3970c435ab

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp312-cp312-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp312-cp312-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 63a4bbb371ab7b978319ed535c95da8fd454c07e09ba1c9902dfcc866bf2e83d
MD5 21d59c24013a2d41e37de92d7684cc75
BLAKE2b-256 a9d8ee9aa2f9637774f463911131cd726521c6d9683cb2452d0ba228d4edc6b2

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp312-cp312-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp312-cp312-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 a21a115478e6a040d4328b4567395d76123259511c539e6b59916f4ef9a5a9cb
MD5 1313046d322602ed971bdd044dbbc83b
BLAKE2b-256 885d5ccc741212dc7222eb5f03f53f1703f07f290ecde548f77394f51bd87d98

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f42891ca73e523538981b7974734708d3e846cb4645abacfb36831409940e8f7
MD5 ac22d46582a2be6b3ef30923066aa8df
BLAKE2b-256 0884adbf1565eb26152ef8e07b6adca77133ba75f498d09e9650bf6f4571ea17

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3df97c2a2c223dc708b1ba20195db7c144a5a943092f2b35e72a0c705d8dd693
MD5 15de872aa0b1f616e47ec9c70b5c580d
BLAKE2b-256 d4fcd907a41cc43cc7321b10a324a5003517b726a11b416080a1f7879bd87897

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 06975cc066cf33a82f9f5442e1b744898a6e70de5b0e26aa81a69204e1ea6797
MD5 f72cb52a37a9864fa27d485de6db37e8
BLAKE2b-256 c049de407faea66390c1a40cb5f1a2b4e8924029eefaa92b846d06a013df7563

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp311-cp311-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp311-cp311-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 c051aca9119c47a529edad0d550d4d5c2d012426d49e4c784a6cb65784ade6c1
MD5 8a4a12121afba8bd54d7c0dbddd37923
BLAKE2b-256 951bea8740ec5fccfee7f15645aec2209dff85d6a2bd7f1ec8df413ecb9ea24a

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp311-cp311-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp311-cp311-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 f5f0b376787c4c24f0528d46b136400232a7a4ba3fb285020692ac93af57ace2
MD5 3bb7714c752e3dab3d59e50cd22293fb
BLAKE2b-256 ea9889b6d0f59fd9af6547b03717d26485a68a3ab2664f0be86885b1d36717b4

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 25b6f1f72b3be698ba15925d6c0bd11e710a61c3c6536ebd989a63031975905d
MD5 0b0dc516db0ff0def3999dcca9959772
BLAKE2b-256 cea6cd0413592952a16d34ef1782f855b0d49182e99a869753f654ffc5258a9a

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 54d4c9dc95116ebc13c2dc0f605297eabbdabfaef423f9d53bc5d721e0ffb3e6
MD5 8b1a3954d5889fe28a29807bf708c23e
BLAKE2b-256 3a742660936121761217d88f6acd30bdfd8d1ac4f8b5db963a84e371611c4bda

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4f2a4133caa40d6de4f8d33096dc31bb2e47b23ef87c4cb76d5abb3efecd5bf4
MD5 fc761a8e01a495d1a55bc045f23c78e2
BLAKE2b-256 359223d79c5e08f081801af2ce30e3391783e8408aac850f8d4dd8837ebb01bd

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp310-cp310-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp310-cp310-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 49bd98f6ccbb302a0670508d6f70ac01ebdfa0eeb3e1f090eb17929f744aa594
MD5 151f5f65a909fa3e3e021022d77e0d54
BLAKE2b-256 14447d5a2fd0b9d3eabed5c5643a952364369c3d3192b38ecbdd0dbdeab96ae4

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp310-cp310-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp310-cp310-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 48ef19a4fe83d9062e040a3c270ee99e22f321e40d331c21291f011664587555
MD5 9d938822e804588bb12eb2285275dfe1
BLAKE2b-256 cdd740d1b27920c439c7e4ae60ff0d81775dd44a45f7f626bf1f2011928646c8

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 975a105f061b9982c3b40a5d363635b1b677da87807f6766447eb7ed0a0ec11e
MD5 f7bdd051f7061524f41dc5477cbd43bb
BLAKE2b-256 d73693615cc9590401e0768d0e8699c852ad5be22cfb2ca5446f5c20af00ad97

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5b23ee31fe077fcb8c488fb7e1bec0cbc091dc9fde3d7485afe585ef2d45f3cc
MD5 b8864bb411f2217b870aba3ef27e3c51
BLAKE2b-256 d9b778f3bfcfec2af982a429e5c6d9ef62ae023d4be01c79bd9bc016fc5b9a2d

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: pythonmonkey-1.3.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 13.0 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.23

File hashes

Hashes for pythonmonkey-1.3.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ca6a0c33e094e2e54107c88fbf2102f5c2bf5b365343bffbadb71bc53957e53b
MD5 053994f94f5d91c8bedc1756725a2779
BLAKE2b-256 8fba10df41f2bfd07a0158845d31fcf987dc65711ca3601dfe79c53673280b6c

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp39-cp39-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp39-cp39-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 de3b4e70bdc00af9bff019f378236d1551d40cd90529b5c5bb69411270435733
MD5 439829e914485a7c01e70b329266d760
BLAKE2b-256 176bb3327aa9b2b5bc4c2bcbcd226d2c284e05d9b9706df70728ecc12a3c314e

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp39-cp39-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp39-cp39-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 800d112473c712f9be71576b9aa165ea77606032d072728106ccf09cd015fb8b
MD5 ff6613a922875fabbb247f3ba41f4024
BLAKE2b-256 a9d00b725cdd4bf1324c3a10f2e815c0007703625777bd63a87f3e588a402cc4

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 032fe410069437e78d89f1ae9e52ab010f5e3abff36201caaf42fdd67045d4d5
MD5 8177e526a1cc325a4dba0b9ee636dba6
BLAKE2b-256 d3db904a5832ded457478009ac16838c2d652c109e189b043d79c2c3803818be

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 44fe86e12bbda02a4b7806bdd0774fcf8610cb12315c1dca1bf4b4b9c2241b39
MD5 27908e676929dcf579b24cde28cc4378
BLAKE2b-256 34651b52f81c5269541aabccc29a2340ccdcdffc6becb8a279126dada2579511

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: pythonmonkey-1.3.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 13.0 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.23

File hashes

Hashes for pythonmonkey-1.3.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 d0cefd777fe0d4f13adc85e26ff27428c03435e740f61e8e3e3a9881eaa6ee83
MD5 c44f644a77234f53876647df395267a1
BLAKE2b-256 3a8a68b0a3dda21b8307ffe9446696253ecc7bf38b32365eed75900d34e3949d

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp38-cp38-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 ab70b57735aceff2dc1f2da0204cbf8ea6ef9308d35263d60d96370cfc307df0
MD5 ca90c9d8ae7d3802fcdb9551929bd2bf
BLAKE2b-256 ead51c44c9e09fa422186baffdbae3996ade38bd9162d770db0b73618a05902d

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp38-cp38-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp38-cp38-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 2ab55fc43aa39f493759782da11308afa542bc9a3765dc6c9ef5cc0b13813b65
MD5 8c357c0e2a53e90241163a03f12ea0a6
BLAKE2b-256 55aae7dce22653a54516aa1dd922a16acc1f051f325cee5e23b5982050c44bdf

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp38-cp38-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 98e37fd35bcd22125918d2c1e551f3a8668b325b570095ebe4d3354e1a7d1309
MD5 3c577381b861da03efc6ec143772939a
BLAKE2b-256 56ed13aa418fb6619b7301565c6d471c1ba8a4bb31911712a22d9bf1000878ed

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.3.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.3.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee2108520030bd04b728c8ebc5fc239b1978e9bd0841748b8b70e814558ebf68
MD5 2d4b065a880c28c14e9df80062b65276
BLAKE2b-256 ca47080512202b94310a9123ac88a0a1b2f79f156222282d6fd6d98d9b334df9

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