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.1.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.1-cp314-cp314-win_amd64.whl (13.4 MB view details)

Uploaded CPython 3.14Windows x86-64

pythonmonkey-1.3.1-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.1-cp314-cp314-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.31+ ARM64

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

Uploaded CPython 3.14macOS 11.0+ x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

pythonmonkey-1.3.1-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.1-cp313-cp313-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.31+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.31+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.31+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

pythonmonkey-1.3.1-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.1-cp310-cp310-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.31+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ x86-64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

pythonmonkey-1.3.1-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.1-cp39-cp39-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.31+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ x86-64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Uploaded CPython 3.8Windows x86-64

pythonmonkey-1.3.1-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.1-cp38-cp38-manylinux_2_31_aarch64.whl (22.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.31+ ARM64

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

Uploaded CPython 3.8macOS 11.0+ x86-64

pythonmonkey-1.3.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.3.1.tar.gz.

File metadata

  • Download URL: pythonmonkey-1.3.1.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.1.tar.gz
Algorithm Hash digest
SHA256 d26820bc38413e96dc06d20ffe1e41ae37560abfdb72f2f6da4405ab44f920c2
MD5 608c2485b388e3eb1fb5abada252bd8a
BLAKE2b-256 b3e8210c88fe4eac72c8c1df9cb69dc8dad7b2e1c096724358c0062b0bbbb9b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 d31e8f5938dc4ff29be498f315c916e617311ff3097d824c77a469af4568eef0
MD5 d92f9f4cf631d05cb4fd4f6131ada21c
BLAKE2b-256 f76e8d225470e2741fd7727a96cbe3f16b17a589fb7a52d742474b661919fb37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp314-cp314-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 3a22e2d371e484896b1cb5211cc735a813574af22c2525fd5d0e2131ba338ed6
MD5 f566b72d04554cd212bdf366e4947d94
BLAKE2b-256 96802ec68f39737005fbbc86499c9655e89b0526faccbc73a6957909330d87f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp314-cp314-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 66430bcfe24f8f21c05364293c6119cd6852869e7e2b5b739876e6928386abab
MD5 a43c92b65a46df1ba9c929af2e55c9ff
BLAKE2b-256 ff74c22ac049f7dd7ea6829c8915d8d14e21741e4e20404db610fd642fe3445c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 bf7e313ecef107b325a467868f32c11248b4882773bd9790f214d9060b161f60
MD5 09d1a832474c1b000d2ce3326934f11d
BLAKE2b-256 4fc1e56b57f31b2d698b1dcad5450d6a2fbb5f2a88d5a36ef7fd9b5808d034a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fc3ed47daf29d07d5c1811df05c3a046c787837ed047d123267ef795b34b2ccc
MD5 a276bb966abef7dafe57903c93a35be1
BLAKE2b-256 8eeb594a878b7c55e5626a58dea43776068ccf02ef3d70b64506cd10b40e1d18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 458473cc1d04c71affd410bd64373001b8dde62a4ea5bd7345ff42076427d396
MD5 b7c0d76bbd5b8bf37409f950384c2c22
BLAKE2b-256 2587b78f3b48f29c5c16af31e7401be2eab0bf634539142f391d964c751e3352

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp313-cp313-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 0ea2655090672d7f7525620a2e86f59996c08227237106197ad32e4b28614443
MD5 24a8edd7fa02cdb922c890c7607a91b7
BLAKE2b-256 bbc44eec9743392725895fb2606fe283514851a8cb41a0c967993d887efa351f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp313-cp313-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 944977f2da2e62555bc10a5125abf65abc38eb1b61f39416be403b4104d286b9
MD5 1829a6dac1d57fec8104e33d66df3137
BLAKE2b-256 5af7e0f2c63fd6bf68fff58fd340d051f82296f3a70a777edcb89259676c9e92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 35c31279f230797943b35f7d114886f3500070cc3084e629765708a7125e85d7
MD5 eb57aa52a5b194088922aabe7941a32f
BLAKE2b-256 6b2c1c8b66822962f209bceeb193d965b22ad9a2023d97a39519f6bebc9449a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1fcd2d3e5d948ce626cf6ae729d5085931133041cde323eaf037800b49f60837
MD5 e9b71b8f88d85980ffb8503c07e99af3
BLAKE2b-256 0aaa1752630c4f834f881e26774a45d4e42546bfe2cde4b502819fec9c9eaec8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9e8972ed5b27e58c910e84edef9e9ca347a94616485bda384f1c15d5a0217bb7
MD5 df73c7135ede127de451d8b62d414d65
BLAKE2b-256 21999d090c09a9ae72903594081ca659261962e0f6f860513b85e1de758abf6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp312-cp312-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 89f0bfa145d7a72b4494b0879614a56c88798c3bdfb82fbcba6eee83dae9c99b
MD5 9571e170a61a6314b20e736ccdd09b2f
BLAKE2b-256 43c300d9b43267888332e706be1a330ff6fdd6e1de4c00d165d73f7ea74f81ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp312-cp312-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 5ff4ccf7a84dd6e44d14395869e56597f8db7cbe906276b8c543ca164d12e262
MD5 8108e349bee2f45cf9fc8b605aa209a9
BLAKE2b-256 e8139a739385f6c411a166bc250e7bb4b5efe0e54bff26cba0bc970b020f2e3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 865e9c3e470a3ac96956d4dd2d7d2e3ddf2485912d7deb76f6f78aae8dc2d23c
MD5 97c871a3981b35c02344a879f4b3c1ca
BLAKE2b-256 49e088a8dcf07f47c016a292c16f337025e861d86bb0111908997ad5a45a9d91

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2c86506b1becf89a04df384200b06dbbac4af30c1224b55b7b445dc9c0773a2
MD5 272ec55e4665df74f7a3b8dd4faa7b34
BLAKE2b-256 07927e9a51cc8278d1d8e47b9e6e2646dbe12a5eec9f5c73e6f2ab33c85ebb9f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7ad3db7ba0c8e84d61393e580ba11541fe5aec37d136f70b1accf9e145d4cd09
MD5 0a78070a8c47453c62b1b4d52736496c
BLAKE2b-256 305a042f391562ff9281e12d1a553eec6df90236c34a8158c08a2974cdccb76c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp311-cp311-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 35a8beb0632a1d6b8a18953ff3095ad3170230a4c928d74dcd6453adaef4f63a
MD5 acbc8eb5c9e5165f56d1ce3ce541d6b9
BLAKE2b-256 94ab32df4f1c6cf7746ca65d5eb843307fa219c0d0d7c92e8a7ebd7174a9f5a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp311-cp311-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 8b711362ea60ee3fccb80986d7abd8e245dd6e79791b7d75fe33540a022c24ff
MD5 3fcef25d0dfb9c8191f505419dfc23d2
BLAKE2b-256 170424ceaf70d81313d04a56ffb57044403e16e199b3f3372d60f129f6e8604a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 429456afcb928b97c38318cf279415c18e5d51f26f697f0b0bfe51eb2beeec6f
MD5 18d35d5713c714c93a08a8523adc9d27
BLAKE2b-256 cc58f34e654374272624b0c2a4680a4e53ea3f37240a1bcb06c8da57ed637679

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 764930f3ae2b5bdd5d9ff65bcab30f8e688628d0668a2818704bfebacceeb323
MD5 2007f701558140530cc444f4247f1d31
BLAKE2b-256 15503f9de91aef60634da760ab1bbded29e068e83860a52811374bb1b06e69c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 15eef9027329cb25f82f567fbded3b32740afa40c81374162ed6b8438cf15d1d
MD5 893b0318164b81439a9ee725efd68169
BLAKE2b-256 2b9fe0d3671757ab5c0b4ef9a79bc1294dfcc3bbd34eca888a603e279c9eed84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp310-cp310-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 d6badd5e27913d25013391e9a492c0609624c54a28825e07527ceff1e4889e1d
MD5 4ad03a636a0b11d8a6428fc20aa8de9c
BLAKE2b-256 7ed02ebac9dd0da52f7f42ea108695c0f7371c8535844dc8f3307e1ae25542d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp310-cp310-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 c331fe0d8c7f44c9e12773370754c8f1207e09a576b9be6d0990294119e2e3f7
MD5 4a88d7ec3a8d5a062de7c4ec108f52b1
BLAKE2b-256 e8a2386d1398a68e4273929e9c207cbb29dd140a9c91aecd6cb265514ec8eeee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 feda423cfa612cb79a61edf7a98caebf1965f60e32aa0f80e0c5809aa352865b
MD5 567b51feb035ef1661418e07c28bc08d
BLAKE2b-256 cdcd37ce57a451f00d9da765b67f3ff1052a2cc193bbcda3cd44668179ced614

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b829e42d53b803baea440ceec99b4246b34ded1679d916a55497bd783cdbbea8
MD5 2625403fef698e829e9a2854614fd99f
BLAKE2b-256 7e0821307689aa4ad60ac599b49e60ea1ff586e2d555cebd3f311fbd385dfcd6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pythonmonkey-1.3.1-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.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 38f5098fd4b933de8d5cf1dca1c463f5e8ff607894917d76176e61b8dfc18068
MD5 740c8bf65c488690a15006c5c5446604
BLAKE2b-256 06cc7e361ebf0176220366550d4e3c7fefcad4a1a958f39485767cd72634ab98

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp39-cp39-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 80bdf12c4bb846564b72649340bdc141a370c9b0229628500a10a5f003b469c0
MD5 192e0fef906bf14f3e31e55243ffc798
BLAKE2b-256 b6d82c81457ae5ad6f401a17c74c8137ad2b452707e4f61262c9c10900520dda

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp39-cp39-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 ffb5dafa332fb6c526a3260e9993478ec5bce2fce72c34e4e07ef3c6fe71f05c
MD5 20827c3b05b8726a12ab74bfb3e3534e
BLAKE2b-256 46b00507c05d6c04c06474e1ddf6f60391b45f3168495bb93e585871d610c6c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 1e81ce79edbae4072de78bb0cc0fef213edb6f3ec558cc103a90423fa20a9969
MD5 ffa0f99e95dbb8800747a244071f291a
BLAKE2b-256 c01833e9b1b98c779902d143f7574d154d6d5f4b518cfdef8c56f8478b9c6496

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d78fa4d524aeb13a5efca97278ce7c819c2c9d19e7233901da37746955f841c1
MD5 c8800c1546be103bf12a4c2b48eb49d9
BLAKE2b-256 4eb6457d85f918c45e6d041d2d2d7d801653034e6043185f640f2257dd4ca70c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pythonmonkey-1.3.1-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.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 450bc5c8fb6b9ec0fb521711b4093f834e394ab4c6ef68ba23e23a8e48ca1077
MD5 fb8d21f2c3b89c85697eebc07e4206e5
BLAKE2b-256 cfca09294d585ab5266517157ce1adc56893545579ea1764577849b4d990a1bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 86117958cdf3ae62068f2d12a361d702c6824a5d5bf44e5ca228bee4b52082ab
MD5 3fbd3863e3ccb159a6430ce14fe7b645
BLAKE2b-256 d9a431959e5ad99adb363f2a724a2eb7f68e511269474b3a836a6d7747b05479

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp38-cp38-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 af443646e547f6eecdbe768efbd284f51734a961475c6ff53dc78e5aaa14e889
MD5 e77e8d6d8b69beb33081b6de0992c867
BLAKE2b-256 263099c9cbe2d7b0c45949ff8961ecf09503c53d3e891d5f20325c873ba834af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ea8515540371e462febb2f6a23ebe8eb9182269bf206ef05679d81f356ef4ff2
MD5 c4d5e3916e9642a40c69eb84aa2e8078
BLAKE2b-256 07b52969ef5cba759cedf3b46993e0dd62b3a0dfbcf6224bf5edf042d4bfb18c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.3.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4136d75ca37e7ad548d27da01e789f5fcb8e876bfa45fc4700c84aea80234bdc
MD5 33a7d65a9f7582f1fe700f0477275009
BLAKE2b-256 8759c2a1b01f2a97f922bec4794d9637351ab9e605c0618301ecd208ffd7ba65

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