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
    • 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.1.1.tar.gz (308.6 kB view details)

Uploaded Source

Built Distributions

pythonmonkey-1.1.1-cp313-cp313-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.13Windows x86-64

pythonmonkey-1.1.1-cp313-cp313-manylinux_2_35_aarch64.whl (19.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.1-cp313-cp313-manylinux_2_31_x86_64.whl (22.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

pythonmonkey-1.1.1-cp312-cp312-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.12Windows x86-64

pythonmonkey-1.1.1-cp312-cp312-manylinux_2_35_aarch64.whl (19.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.1-cp312-cp312-manylinux_2_31_x86_64.whl (22.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

pythonmonkey-1.1.1-cp311-cp311-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.11Windows x86-64

pythonmonkey-1.1.1-cp311-cp311-manylinux_2_35_aarch64.whl (19.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.1-cp311-cp311-manylinux_2_31_x86_64.whl (22.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

pythonmonkey-1.1.1-cp310-cp310-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.10Windows x86-64

pythonmonkey-1.1.1-cp310-cp310-manylinux_2_35_aarch64.whl (19.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.1-cp310-cp310-manylinux_2_31_x86_64.whl (22.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.10macOS 11.0+ x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

pythonmonkey-1.1.1-cp39-cp39-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.9Windows x86-64

pythonmonkey-1.1.1-cp39-cp39-manylinux_2_35_aarch64.whl (19.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.1-cp39-cp39-manylinux_2_31_x86_64.whl (22.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.9macOS 11.0+ x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

pythonmonkey-1.1.1-cp38-cp38-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.8Windows x86-64

pythonmonkey-1.1.1-cp38-cp38-manylinux_2_35_aarch64.whl (19.7 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.1-cp38-cp38-manylinux_2_31_x86_64.whl (22.5 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ x86-64

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

Uploaded CPython 3.8macOS 11.0+ x86-64

pythonmonkey-1.1.1-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.1.1.tar.gz.

File metadata

  • Download URL: pythonmonkey-1.1.1.tar.gz
  • Upload date:
  • Size: 308.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.22

File hashes

Hashes for pythonmonkey-1.1.1.tar.gz
Algorithm Hash digest
SHA256 142b2505e02e7c556bd446c29d9cabb74690008c9a78f44b923f8a75ed288c61
MD5 b2dd6af1067f77d564fe7706069f7668
BLAKE2b-256 d1b48a7e4b6a3390be4137d54def1d98c68a0ebce0387943a25ad34579a27315

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d60e19f0d7340378586980f0b782efb9352864fb3b832c37bfd23486bd6987fd
MD5 a422c560f9ca414a5ebc85cf0cd61001
BLAKE2b-256 8e9a11b7bd8fde90a66e2aedd691e7ec9b99e0bad62b22e18783b4d953719e66

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.1.1-cp313-cp313-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp313-cp313-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 7b0df0690226670f289449331f0483a120d600c1a893c1bff779dc2d3334658a
MD5 f0cb309ed50efa21afd98bf23c0a401e
BLAKE2b-256 2ccfc9b6b1a835f8ebe915ffabe698225fc02144e9f67a0111e4f45313824a26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp313-cp313-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 7d231b5ec8ffa2ab45feacba55d5fb78fa7069fad100d43cc4b23959b609b10e
MD5 7d443c95ca1b029acaed753232debb5f
BLAKE2b-256 7b0784a87ceb8167a9b9fe36d4101f75171e6f129d2be782916b73015dcdbbd0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 2c57ac9248450c73629cb63189a422df96241395eb102939cb64e443cf59e00d
MD5 ad17bd18cb00a7a89fcd94ea1e02a4ef
BLAKE2b-256 3ac585fa204608c1748317bda872e6a0733fe84035641225bba1894be2e328f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a7c0b50421c98fcb9a2ff0c50d65c3cf05a3d5bf95ef0e68d634f8e968924030
MD5 c155cdcc80f76ee6d07c965d15680767
BLAKE2b-256 1dab1a64819254fef0ed24cffb3c033be40921eba8a9947b7c0f985cba1666f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 098ad7902271cffdc49650a0853b4a4e995e94040ece496d9b76a5d6d9daa7fc
MD5 32a7ba1d710a9e4c126a8179c962d266
BLAKE2b-256 1f416f2517f53fa06b879c4a5a99ecb9a340a9084a8abd9a0f54f09ce89d2fd6

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.1.1-cp312-cp312-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp312-cp312-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 0312cf447461a8f2a5e536ea40a761188670b4629291e3340e405b370a3f79b5
MD5 05bdbdf538021d48c7915477a7a12145
BLAKE2b-256 65040e6b416d5f0daf7776e0cfffa4118c0ae750e7644f7f619d891dea9b34ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp312-cp312-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 87981ca73b43b383fef71a2fadfbea367a8e4d05f156e9ba9ad8f2f42c97a06c
MD5 c4922623fb0da1eeea58e94dea99e99c
BLAKE2b-256 be4e8b8d0335e3ebe4266b020ab4772ea4a6996d658bfe641febac6aab3e2762

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 7cc8b524f88841e2474cda70a09fe4269848cf65fe2584cb133c76d3deb57199
MD5 7c759c794975db1ff6d311acf08e3f7c
BLAKE2b-256 771112bf1e14f94e6ddb3223016aa57c467a66d5b98016ed9f523d3e2df63b3c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dffb087553ac10e32fc1e4a3487d6d0584b349a6c8d6b8d55dcc4fc73827d1d1
MD5 f034754fc90cd6c595d9f826bce33fb1
BLAKE2b-256 fccd2f03e250359532b9b0d5cad5e1ffa1eb89bb3074ef0fd4d5bc5eb0fcf49b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0a2e63742bc1f867f35e75ed9d0e0403216e536619f67e4ab078793ed2bbdfc6
MD5 67158acb57fbd3a6f4ed1fb5dbb78da5
BLAKE2b-256 84d0299ca22757a76771fcc9a566d67b86764c403df0a2af467ef91e9841a9e5

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.1.1-cp311-cp311-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp311-cp311-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 ec09af85926b588f358bed81458112fc1c3c285349c80673fec5e5920f9d9d5b
MD5 b55a1f2cbcc9ced6350f510ba4de7ba6
BLAKE2b-256 5dcad263ddd6d56ede2a48d4adf3fae1fbcdbf8961acf599b2d1b9faa75a9ca0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp311-cp311-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 76909398f47de0de47f8dd9491a62f2f6b21b1396ac5883fed6c247e3b757298
MD5 e752fce1d42fabc688a2dcdceb273ce5
BLAKE2b-256 26e49bfea62d58732601659756b854a449b2b68fa90d313985579960c07e73e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 1e35f8516e9191adbb03a180439a5c225e94308789e17c1f987c69efe957a530
MD5 f1231d61bc63c8b7b021e4c492400493
BLAKE2b-256 5a3829e927feb950badf198e20ee86e23359ffd5b0bdcfa9f494595ee02d63d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 731240e74af3b0730d30f02787056df9bbb36369a8f1d78a3b208b81e8905e6d
MD5 decfc80e450c2d633dd866d0a4747325
BLAKE2b-256 28f2897a1a3aefe74683cc52b6e44592a1c4fbf0f5acb46e977dfb7d8f310634

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f87764c1406bb432659a05dee0cac2ce847be0b9a85e6e6ca2ee5fcf6feb6d95
MD5 2c863bcc6ff3f69508aba40987f617f9
BLAKE2b-256 3d7811e1896ad4e514fdb3242a5ee633727c2aeac9a48b9762d4cc54d2916c11

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.1.1-cp310-cp310-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp310-cp310-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 23e7269e6d766c5b1062f5c3b1ecdb011a9e7f06d24fd3760f8a9e83097d9852
MD5 3baf87e9899817ea0b16118033188310
BLAKE2b-256 c67a241868de736ece4d9731a74e867ac592c23b1db7accfc3ac80403747eea9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp310-cp310-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 a663e24ed6c97ddcc3a49af1bb19e3e6817e4307bd496911986633a9b0d2c5b9
MD5 d47fa0f2e7414939ff13109d99e938bd
BLAKE2b-256 53492e641504915b2242bfe4a65350f59dd7356ce93858c3f1451919d32c9f97

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 da5a1a7efc94b9255192a8b378a9e4f8c1e0d19b09d5e2bb0cfd30e8d07ea6ef
MD5 47f41386a675ab8b0898c992caa256f0
BLAKE2b-256 4804abcb99a3101877465ed53b73f3dac0026dd11ed104326ad5093b6bf15730

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad653c000059837cd8e5513ead4dfa6fac01dea13044b911235d0de39593a1f3
MD5 612dcd93426fe87d432ca0bc98476cb7
BLAKE2b-256 0e68b73688013a2b2a38e762720e1ee00c7aa2bcd9b83419795658caef4842a5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pythonmonkey-1.1.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 12.7 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.22

File hashes

Hashes for pythonmonkey-1.1.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 14b20a06cfe414c36421ab5017f809f2a534c43e6638c53a6fa9ef34ea719a7c
MD5 9b65a61c90ff514b3d8557fd20fcf26f
BLAKE2b-256 85ff194992d3975faacab4dd716aa0ba75a3081bd3328744e331dba01f136b02

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.1.1-cp39-cp39-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp39-cp39-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 0cf37b77f9a6efc2a6f5f64dc042f266cda22f7647013daafe07b375cb00920f
MD5 ea379c536f1ffbf42c8abc19821657c1
BLAKE2b-256 914fdebf6c89b07697f7fe0e71429b4b6b3e4cfaa3f2f26864c09e783f3b8460

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp39-cp39-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 9d665d964d968f15199c02261ca11b002e66b511e1322329cf55cb636795a6af
MD5 15c68f6c3fc229fd4026f95bb7fa4f50
BLAKE2b-256 81722e6016befb13e7a232209de2ca08c0a956874fdf4eb883476cfee787e128

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ee6d631563aac0493a3883e3fa1b1dad646526356a240ae735711ecf157664ad
MD5 f142398b4b092a3c70537bbf6cc58cf7
BLAKE2b-256 10d55f70875ae7ade53b86d92b3d4d191bbc63a64e85f7f00219508674523530

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 40746d8aa3c734740a21c52f0aaf0e3952155a15b4ac17a286536d457a357aef
MD5 4af37a5e75abf0c14203d8bdbe868a20
BLAKE2b-256 466a32c4f6dd70c314855a51d31b73b08298a29ad8d530eb98800143e6dc5e8d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pythonmonkey-1.1.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 12.7 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.22

File hashes

Hashes for pythonmonkey-1.1.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 469cb0b348f27177ac8e202855ef0260c032a5eb1adf771897ba5fdc87b37be8
MD5 7aebd6a05be455a9c0864217cf9afe0c
BLAKE2b-256 47fa00cff2d8893a0a0551f17e6235d37b8f1d1e13469a15a68fed98efc2e9c4

See more details on using hashes here.

File details

Details for the file pythonmonkey-1.1.1-cp38-cp38-manylinux_2_35_aarch64.whl.

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp38-cp38-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 91138aafbd9e7b50fccb93613d373bde88a4a58cb6d3a0dfc63ace0b9db8f72d
MD5 3a51b7c3120550b35a1081de429a0f82
BLAKE2b-256 110b9c198fe5dd05ffd40d7e5eed99de60bef0270eddc6d90dd08f0fea7fa533

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 c5c999a2a9320cbafafbe50c152d953442306c8fe33d21a68de979871eef3a68
MD5 87347c4acc5bd1e95a8b85dbd2cf7fd6
BLAKE2b-256 0c648f95316362586b875d49b7f3d8e1c4c5dc2feaa13eed8bb599c75ba6b6ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 2ff99cb97d7849546f3bf33e667fa3bc323bb2d96a6ac2b8883f1d978a306c73
MD5 a48db42560a5bf6c24072bd96c3b2fbf
BLAKE2b-256 f5c95827d05210953c9dfb989602cf9ab920ffa129127eb64a09dfedfd02ded8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 19b1a88d587fab7f4be0a3b1e931cc5f920082661a95175c5212eee244a47999
MD5 ed46e910c5479c58f8854e359345cd5c
BLAKE2b-256 e6fd047534f86e355f3a576d2a0d16954f439523fd3dd23ad46c9af8bcc48842

See more details on using hashes here.

Supported by

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