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
  • [done] 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.2.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.2-cp314-cp314-win_amd64.whl (13.4 MB view details)

Uploaded CPython 3.14Windows x86-64

pythonmonkey-1.3.2-cp314-cp314-manylinux_2_31_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.14manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.2-cp314-cp314-macosx_11_0_x86_64.whl (15.2 MB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

pythonmonkey-1.3.2-cp313-cp313-manylinux_2_31_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.13manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.2-cp313-cp313-macosx_11_0_x86_64.whl (15.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

pythonmonkey-1.3.2-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.2-cp312-cp312-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.2-cp312-cp312-macosx_11_0_x86_64.whl (15.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

pythonmonkey-1.3.2-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.2-cp311-cp311-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.2-cp311-cp311-macosx_11_0_x86_64.whl (15.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

pythonmonkey-1.3.2-cp310-cp310-manylinux_2_31_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.2-cp310-cp310-macosx_11_0_x86_64.whl (15.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

pythonmonkey-1.3.2-cp39-cp39-manylinux_2_31_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.2-cp39-cp39-macosx_11_0_x86_64.whl (15.2 MB view details)

Uploaded CPython 3.9macOS 11.0+ x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Uploaded CPython 3.8Windows x86-64

pythonmonkey-1.3.2-cp38-cp38-manylinux_2_31_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.31+ ARM64

pythonmonkey-1.3.2-cp38-cp38-macosx_11_0_x86_64.whl (15.2 MB view details)

Uploaded CPython 3.8macOS 11.0+ x86-64

pythonmonkey-1.3.2-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.2.tar.gz.

File metadata

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

File hashes

Hashes for pythonmonkey-1.3.2.tar.gz
Algorithm Hash digest
SHA256 7f956b68c9c4689fb8918c1309468c08b6c34fb84a18f32549ba881b28a37aeb
MD5 98b5e5fc3301bf74571f1069b03e94dd
BLAKE2b-256 24027cc137bf75f25ac2ef917d7f78205963a63508a7336e194ba52902961e95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 dd807356c16b9b457c7e56e67184e6cae8b2a6f101ab8657510bd0559c55e5a1
MD5 9598b48ee5a4802fe700c603558e5959
BLAKE2b-256 b1269b74985db1afb99a11fad9f15189426d6ba7c7fb8e42cf8b13c4a445ef5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp314-cp314-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 1978a88095d7e92190962947af29db5c8fbc70eafd55210d4a69d791d6a3ba73
MD5 06ee99353f9ad53f5c56e43bb770033a
BLAKE2b-256 25103e0f1141ae329eeeababad7ed3025d91afa4e945f94c626c7f0cd0801aa2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp314-cp314-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 2390a1771618a622af3d6ac8e6efe6fb86855619561f5dc9ee79b0d98144665e
MD5 c6bfb73cd5034c3d4b58ae7e6441e9a4
BLAKE2b-256 c080b8a3061861330f25b5ac24f3d6784384b2826d81aa1fe93c95c0a9770510

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 519d07a0ecefa7bb575ad0b085089df6273f2c92866e7d374e3349dad1baff0f
MD5 6ea16a86ab59b7127fc59dbabd2f2044
BLAKE2b-256 5cf335e202d38c79acd846a2c2725864316d08e8b83e0eab1167bd73d06c1631

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 139147b58a206a9c4ad4df9c374d5f3cfac70bf3a4465efd2a5c1fd2b3f23a65
MD5 ee28f822731f78111c5e17e21315f62b
BLAKE2b-256 bb9974424d227885e0a9ae0beafb6913f8c2fa4061a3c7e11435b169f2dc026c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 717ec284f8339d2a68bf7fcab81cff84d786c7fa1933f023f2ca5d4d8062fa54
MD5 42f88f2ec3511b1104be46618eb22df4
BLAKE2b-256 48dadb561376e88b3d9415ea39f74335d2646d2df6fc98b17a581108d5da7b08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp313-cp313-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 e3f31b82792ab25397a2ba2c7e7dba3692248cb18a030d85a6cd47c8aa19d0a4
MD5 29a8047928ec3fa087cadcae373a90c6
BLAKE2b-256 5a84af03b7a75a707b9eb076e5a08a93af0165a44ecadce50e6d202c770cfef2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp313-cp313-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 f0373b8f7411d1fba8f10d29de7da1aeb25f978cd88ac5c86ce595c3112b181f
MD5 22dd54fcc37e7efc9cdff4eec90d6109
BLAKE2b-256 226d80e86275427985c863b2291e40e2429297e6a8f8f20c4e1a41467ec419fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 7c98b2259789d17571be7bb3b4c568d64cfa6dcc776c390d1da17d62cd1004f0
MD5 bbcf788d3650cc7740c213d1352309fa
BLAKE2b-256 530cfd46c22ca52f8a021b4b67767369d6da01e04a76f17c1fb7de43ec0426fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4e1e528fed6c8fb5b5723d50e7f51027a447e7942bf2f422c6012708dda4ae41
MD5 e51e4da1184d2497cc20961d9cedf0d0
BLAKE2b-256 6a1b144587e9d2e30183a51b3653503d562fc960610c1a0671e61dfaad266896

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ff18d183ab079d658f0a4afd7bffabd0e4f0b1d1bc15a73e96ebbe167cc70594
MD5 3acd9f5cddad95fe21828274615b09c0
BLAKE2b-256 3841c848c46c333624aedfcc253fc3fc8faaffb0e7028c3c9d7b8f48c0428e56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp312-cp312-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 31025ce752b0bcffe105b127a428596cd9cdf74c513aa8b30119c9d71e58668b
MD5 320b8cc627ab5174d2aa228e0fa21788
BLAKE2b-256 a89c677576bf0dadbdfaff7087a9945c11bd32139d5d8dc87672670ba3ca24eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp312-cp312-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 e406d545bd0f33c983b4e2c2855fbf78962d858b3f96f50b6067c51e863ac010
MD5 59de647a65687701d3b18b519bc93f04
BLAKE2b-256 1a14b99290ca12dc98dd8f69c6f6702376ff361ab74fbceb1d5d52f233d25487

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 7ae0c53e99cb494fb53f32b5ae072367c75c1b4d0d0e62d127a23cb50359d36a
MD5 7407307415368df6c01f94d21876876a
BLAKE2b-256 d645bd1ef4bda5b45c7e13303a54c9d01aefcc262ede4a954bb128f1d7c2a6c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 baf89197442b4bceed1e392cd5dc6e6fc07554f91f271662f148923d25fd76dc
MD5 90f9c5f1a8c1eb2e428eae7a3b63b60f
BLAKE2b-256 82a024acedc7c92cb6ad4556dd1c1c00c69517fc3cc1127d1304b855a14ed76b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 12262e9ea98cba6c0706d7cc58e8cce3b57c39bfb7452ee95dd2ba7fee6322c2
MD5 a89f32661ffb313c8e92a89cc6204f53
BLAKE2b-256 7f44ed73609dc85bbcf53496758105d2e32c78c00ddf7fb6b18c2713f8902556

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp311-cp311-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 fb9db119c60807522b7668e1ac907faf57c5a9c43733f265a1e426b70ddc50c8
MD5 f17f6177c65a90ee07b7bd00699e424b
BLAKE2b-256 4f958fa3428865c16fc2f4c06f615aa828c87c90aff846fe8d62403e33ab7c79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp311-cp311-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 a240f7cae3aff3276ebaff703d9dc3a4f1a897d38e82662f5139ce57861a02ca
MD5 f4fc00d8bbcdb7b27bd52f96541461b7
BLAKE2b-256 c67cf6414b79eb460dacc333814a95367db52817b3ecaca43861f5a90a047307

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 9d13df9253c61afb487b9f8a4d72999052afb7c15ab63d53fadaf6836d4948a2
MD5 99bf296c7d4568fc4d62f04544507261
BLAKE2b-256 aca9de8e96d1251f76a7912a7e36e5adab910de676c5b854945a95ea435a44eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 928c5c8d81c692df60c60d2f3c61420525e9c866c0bd4aceca63b9de7a69d135
MD5 c37c73b45850837a293540950f949aa3
BLAKE2b-256 6c02f984ef19827a02ffe2d23969f166aa25d49ad1c62c7221b447eac37c0d67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 edf6ac04f37414784cf016b6f589fc41dde5204c9d1f4d498efa9455785aa2da
MD5 27b3aa7639eacc31af60a801c45956b4
BLAKE2b-256 83940437475f93306af96d7d7af216370895ad045015eb944ed5540d12422be3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp310-cp310-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 d70ecbed0c78e98a957eaee938cab97543f316006860cd05a0fd36f17b8cb8bf
MD5 5638514b070d3694f92380a64f8bdb9b
BLAKE2b-256 7a8c1adeabca2c11b797e314016e2a70739491554d7853ad172af7aef791699d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp310-cp310-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 74bfe3e46de834bf5572c3a97202ca66cc108a30d8fd871c8be89842139f1aff
MD5 cde1a59f422014f61f8a336757555aab
BLAKE2b-256 aae0120c088b504a980cf2c11adc258521df4f7b2c44619eb695a4e457e066fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 18eb3a5b34b8e07341dfbf1dce07b5e8dd924f9417eeb9f382a815560461c396
MD5 e787d68f56ac2d387cfd626ae5d44343
BLAKE2b-256 29a7aa2978a061003440a41ae113acfae95eb2f4486011d9f3d78bc383b08bd9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 58abf7eeaef141d54ed90383ebb5e8de372a64528c7be3fdcfb55394be704e5a
MD5 f1ec320be523dcd4f78428aedb3c5ba9
BLAKE2b-256 dc732dc0561f0a7b7a063e63a01ef44155d07597c4ff083faf0c7c02a1a69fc5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pythonmonkey-1.3.2-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.25

File hashes

Hashes for pythonmonkey-1.3.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 51ff065c003c7e2247efa556c8424377f3376c0861dadbf301346a07d7abecf0
MD5 60a9d1b8422348cb40529f6203fcaee9
BLAKE2b-256 66da6cf82e9bc665acc278c96daacf6fdc2fc1c76dd2468196750cf1db556b61

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp39-cp39-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 973acaf6645513e80da72fadd0afc2bd93697337e94c15c666b5770521d00243
MD5 d2d10efee439c204cbb9505e2ecb75fd
BLAKE2b-256 f0de7918d2a7bebfa793ebc4cf520e0ce82663e04f89a3f1b17d8cf0cb3bf0ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp39-cp39-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 7c8ce651dbc4bd1c68bd277ceb2d7f69b350f950c7321032feab27ca1f0f574b
MD5 05074760f693990e93bb08790d5df49c
BLAKE2b-256 c06db6f3c7756e69cce6063a4148a2af7ffab9c3600152e785e638b8bcdf05ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f64dc8b3cdadc1da2ceee6740b01e3564ea72181ab63860ddf8a053f281a4a4e
MD5 a0f76f8e6cae789009faf1266c743779
BLAKE2b-256 6afb9c2bdb9baeaaee9ec1fcfc6f07146f61b219b2458750112702edd3a3d1ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ab12e1d49900a1366d60fc2fe2e19625d175438184598da65fbc7419b3d35833
MD5 568df3cd090a7170f93683979fc7fabf
BLAKE2b-256 7f41ae73aeb52ebe45a8d537d1724fbb9cca1e891cc05b0e1173799481a05d68

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pythonmonkey-1.3.2-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.25

File hashes

Hashes for pythonmonkey-1.3.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e5da664166fe0936a8adb0ee8fe14d3bc7da6aa2b0a6b2406beac2fe8a649433
MD5 f2d2ba471286c4f930d91bfab0664062
BLAKE2b-256 1d83d5f60b8c87fed09cd57c08a4c8d59bd67947c14af4a894dfb30c7eef7515

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 77c5fc26b67f9fff3920d01b8c9c9a55eb9433d96f06c03385155bd5755d07cf
MD5 500988dc85dd2ce400d0ed1544035fef
BLAKE2b-256 5736fcd032adcb8e77a4c9fe8007507608dbbb3809563ae69bf3eb2b9970d9b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp38-cp38-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 102071a9bf0450d97f0127316ff1922b4856edaff018b29a8e410bb023f52f35
MD5 c7045ea1633ceb3130711fea2454f5ac
BLAKE2b-256 ae3e721de7085f54fb83d88cf1726b6b0829984e7c30c5481acaf460b4f26fb4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d64c3b21df9a94606d347c9fd8ffbc5541f4a673c8646f8b61c70d4a22168791
MD5 44363a50a81fa46f7f6ade1d39db3c50
BLAKE2b-256 59392ba6e85be1637ac86a4707fd70f358cec5a7e6252cf398e391d01eb7513a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 95bf601f6f71c54ae79e078c56aac3bc3a28a51cce6aaf4a9de1906246db472c
MD5 88daf327fd5764e29e32a95b6f0e2450
BLAKE2b-256 62534ae1afd6c5dfba4e8f664ba690613960a886901f800c64ea2a86dc65a8a7

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