Skip to main content

No project description provided

Project description

PythonMonkey

Test and Publish Suite

About

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

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

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

External contributions and feedback are welcome and encouraged.

tl;dr

$ pip install pythonmonkey
from pythonmonkey import eval as js_eval

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

Goals

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

Data Interchange

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

Roadmap

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

Build Instructions

Read this if you want to build a local version.

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

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

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

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

Running tests

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

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

Using the library

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

Install from PyPI

$ pip install pythonmonkey

Install the nightly build

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

Use local version

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

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

Alternatively, you can build installable packages by running

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

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

Uninstallation

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

$ pip uninstall pythonmonkey pminit

Debugging Steps

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

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

Examples

Official API

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

eval(code, options)

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

options

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

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

tricks

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

require(moduleIdentifier)

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

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

globalThis

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

createRequire(filename, extraPaths, isMain)

Factory function which returns a new require function

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

runProgramModule(filename, argv, extraPaths)

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

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

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

isCompilableUnit(code)

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

new(function)

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

import pythonmonkey as pm

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

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

typeof(value)

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

Standard Classes and Globals

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

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

Built-In Functions

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

  • console
  • atob
  • btoa
  • setTimeout
  • clearTimeout

CommonJS Subsystem Additions

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

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

Type Transfer (Coercion / Wrapping)

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

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

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

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

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

Tricks

Integer Type Coercion

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

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

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

import pythonmonkey

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

Symbol injection via cross-language IIFE

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

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

Run Python event-loop

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

import asyncio

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

asyncio.run(async_fn())

pmjs

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

Modules

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

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

Program Module

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

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

CommonJS Module: JavaScript language

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

CommonJS Module: Python language

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

Troubleshooting Tips

CommonJS (require)

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

pmdb

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

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

import pythonmonkey as pm
from pythonmonkey.lib import pmdb

pmdb.enable()

pm.eval("...")

Run help command in pmdb to see available commands.

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

pmjs

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

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

Project details


Download files

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

Source Distribution

pythonmonkey-1.1.0.tar.gz (308.1 kB view details)

Uploaded Source

Built Distributions

pythonmonkey-1.1.0-cp313-cp313-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.13 Windows x86-64

pythonmonkey-1.1.0-cp313-cp313-manylinux_2_35_aarch64.whl (19.1 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.0-cp313-cp313-manylinux_2_31_x86_64.whl (21.6 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.31+ x86-64

pythonmonkey-1.1.0-cp313-cp313-macosx_11_0_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.13 macOS 11.0+ x86-64

pythonmonkey-1.1.0-cp313-cp313-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

pythonmonkey-1.1.0-cp312-cp312-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.12 Windows x86-64

pythonmonkey-1.1.0-cp312-cp312-manylinux_2_35_aarch64.whl (19.1 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.0-cp312-cp312-manylinux_2_31_x86_64.whl (21.6 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.31+ x86-64

pythonmonkey-1.1.0-cp312-cp312-macosx_11_0_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.12 macOS 11.0+ x86-64

pythonmonkey-1.1.0-cp312-cp312-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

pythonmonkey-1.1.0-cp311-cp311-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.11 Windows x86-64

pythonmonkey-1.1.0-cp311-cp311-manylinux_2_35_aarch64.whl (19.1 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.0-cp311-cp311-manylinux_2_31_x86_64.whl (21.6 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.31+ x86-64

pythonmonkey-1.1.0-cp311-cp311-macosx_11_0_x86_64.whl (14.9 MB view details)

Uploaded CPython 3.11 macOS 11.0+ x86-64

pythonmonkey-1.1.0-cp311-cp311-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

pythonmonkey-1.1.0-cp310-cp310-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.10 Windows x86-64

pythonmonkey-1.1.0-cp310-cp310-manylinux_2_35_aarch64.whl (19.1 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.0-cp310-cp310-manylinux_2_31_x86_64.whl (21.6 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.31+ x86-64

pythonmonkey-1.1.0-cp310-cp310-macosx_11_0_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

pythonmonkey-1.1.0-cp310-cp310-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pythonmonkey-1.1.0-cp39-cp39-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.9 Windows x86-64

pythonmonkey-1.1.0-cp39-cp39-manylinux_2_35_aarch64.whl (19.1 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.0-cp39-cp39-manylinux_2_31_x86_64.whl (21.6 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.31+ x86-64

pythonmonkey-1.1.0-cp39-cp39-macosx_11_0_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

pythonmonkey-1.1.0-cp39-cp39-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

pythonmonkey-1.1.0-cp38-cp38-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.8 Windows x86-64

pythonmonkey-1.1.0-cp38-cp38-manylinux_2_35_aarch64.whl (19.1 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.1.0-cp38-cp38-manylinux_2_31_x86_64.whl (21.6 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.31+ x86-64

pythonmonkey-1.1.0-cp38-cp38-macosx_11_0_x86_64.whl (14.9 MB view details)

Uploaded CPython 3.8 macOS 11.0+ x86-64

pythonmonkey-1.1.0-cp38-cp38-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: pythonmonkey-1.1.0.tar.gz
  • Upload date:
  • Size: 308.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.9.20

File hashes

Hashes for pythonmonkey-1.1.0.tar.gz
Algorithm Hash digest
SHA256 71f752eba7aeeb8eb51d25ce357257285110bcffdb4c3639108f7b01bbf8f779
MD5 c6551ea5940098166b45960d01f16643
BLAKE2b-256 4accd91b0770685c79680cdd7ff0b3a9358d8467aaa0cb4a20eeb30b3767cd48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 759279e90d92e5069ecf33d9b0dcc6d1e2b67ebf3585fb40aa9aade462ecde26
MD5 59eedcc5305b041df3be435afa08ade3
BLAKE2b-256 adc09888d19411980e15394c6833cec3fd4aec3e1ec8f1cdb26630404cb2cb21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp313-cp313-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 8b6ccf89d22397a67c6e994cbf2f9a11200947af034dcede7c4abfbafbe5e988
MD5 0558cd5f47d69ad2973565638257511a
BLAKE2b-256 3f79e8fa69d20032869749b0747294050bc0043d2b8d1bcd6168fc712fd17aba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp313-cp313-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 3027b1cdd21dbd9941d32d20698f6c996aea9010b4565773854ab4ac9b074578
MD5 e29b51cef2a6f4f704af32c7bed7777d
BLAKE2b-256 2a8c71f6581c178882bb9fadada4cf401ecda49f6e76c3c3ae719aa81d326169

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 b0db36296fc2aaa899cc1f16d3c8558be22172cc3ec31b1bf2ad346866e29097
MD5 f83de7820a7f6c940e82123be764b97b
BLAKE2b-256 7a50f0197d74636c5a7457aa3d9028926dd38a2602935a00626b3bdf892a97cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d4af188936ae83aa18379f2135b1e0ec81821dcb4b2c1af8403a0f56fc0c3251
MD5 222286e1af14ad9d21655bce3bd88f2f
BLAKE2b-256 4a874c37832d9544b12b1ee26f7b287d2ecbcdc7206057df569bd0d8f13026b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1e570e2e7a5900b4603d0939a564c926e682e90d7b532bf76286e9772a87f012
MD5 40724519b30939ab70702118712e18f9
BLAKE2b-256 e6fe0b638ed8047fbd8fd3a6981f7d930c1f47f183aea96dd2cdbb5a0e4e282e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp312-cp312-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 fe3d48a84d3b9aee09bb6a096953e15702d959f8b91c4b46c26091478de05662
MD5 616ed770aa3cdb964e771fe05176e24a
BLAKE2b-256 2bb7801a19e298adf3ecb228791d8f4657c80ba40e62ad47e6c05b49c36d97a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp312-cp312-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 2bd3b71e7d6aa0f3b00105eb04dee0c5f124cfa1b2feb817139fd1b39b80e8ca
MD5 8fd58ca29ae2fd1d73245cce776df576
BLAKE2b-256 7ec0a8ab286af62443b51586c3f7df892b854f965a6688594134ae1e4a3c401d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 43a625903e3506cab54f331472f16897a2338c3d977ac3cde712e54388e84e44
MD5 36f8ae9b86d2cdd5d8d693ba4ad8d852
BLAKE2b-256 751fa7a3e4f5ca02766d039b0d6244ba6207a0913f06f26ae4b9402b872d4361

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a1af15cb56a8ab239770a251a68fbb1fbdc86ed2c31edf705c7da3bcc468365
MD5 221aa45a5d4e694aa03fe3b3e2667a32
BLAKE2b-256 b9a0a148e6fee4e42e65e9911ed3b18d331e5ffa9e100cc89587f687b271c26d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 be5afe015b6175d26aa38fda9cc0a6f046a6482eebd5d4c8396ef62e90767a08
MD5 3b510ad5c6b87860e9e001f39e3d9f4f
BLAKE2b-256 abf5de872b731911ac62f151c191c0067cfe25a04f59a14bf6479e9804d40e06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp311-cp311-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 7863a2187ca86011805e421bb5ef5952990d0e4cfe31a804fa96f38359c74930
MD5 2b4cb7fe96529356fe264de35ee361e8
BLAKE2b-256 f3249223a60d6ebbb119cfc06cae6fa7e90aa1da176aa21b7d565bd90236d063

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp311-cp311-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 b7923d8d3dd0d9c41a45528a5e507d56d32b49f3faaf88195cfe92af67919a38
MD5 1062c5a740a013ae8866eba14eb5ac94
BLAKE2b-256 e0fbfc875a64a66219419fcf4c986e03037a8028969d29f09c6e447a3275604f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6c6e3e9452f7f66590f0c1e51c443abc0860dbe1c3301dd1791aa757f8126d10
MD5 265ca6ffe1f2d8a59a5f1fcf8cd03133
BLAKE2b-256 c60e6c29e5e73124db9dcd134ec49a3fcc80256ba89f183db4729f0e277d5815

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d65ddebcd14fcf662a388b6efe162b7bd515137df64e25c0073f4873023a5942
MD5 702549ee28fe3f61a6882674f8ed8bdd
BLAKE2b-256 43b6151c01a340a2c2b30a017a6e152f746b586d411893115bac771176e0541b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 adea07d250a4ddf458a2df84585bbba12ac5499bc55aea29c9b636e3329ab8a2
MD5 f53ab1182f1c7429cbfdbba2aee5b2eb
BLAKE2b-256 1ac52990985c5ffab521f7e0455daa8837b77e98f39cf8423ac5e8cd973db923

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp310-cp310-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 03bfa3b4a682151608ae3c61a1bea5841981df4154922011a65cf499a380f399
MD5 818484cd80ed4a2f2275077f5ff7696e
BLAKE2b-256 5da614f43824dad60b9d3af7c1d6fa76f827d1c98176cc9961696843c0c8523f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp310-cp310-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 3ffa6205677713b74ab245e1120177b52e92694d6cfa51f9dc459f732a2bac0c
MD5 bc27c4aa2365adff3f9ddcc328d3919f
BLAKE2b-256 fd2ec49a8d35d74671e4da0693615f5f49d1bde1dd53cf1315dbc373d6f1383a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ad02a2e86a65e9fa40d09d70c66ef98c800e561bb2683e126e25c56274662900
MD5 0100d14bc03695947380d058cde5d0b0
BLAKE2b-256 84e16f2dbd1b67487e1086adad6451417514443b1694774009409e0748236ec5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1c1f3418982f92da4ebb1d920762bf2f32f2c70ac86a0d9582a867b3b6313424
MD5 932e6e149f6d401b0ed689f4c0bf375d
BLAKE2b-256 07514c9adcb7cd900ec22ddfef4d44973835ebce290aa064e31558475d7bef50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 bc21de90ec188dbdd5f4c91727ac72b02fab84746945cf77fd4cd3e3005ed100
MD5 3c2f193a02b5b15755844cccce15d623
BLAKE2b-256 554755434c8964ad5b4d940c2aca77a1c75b55bd56c620fdabe75eb180a668c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp39-cp39-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 57a8f65313789336e9a798ca2533dada031814bf60a160887d53b29551b38a66
MD5 533c1574c0e9befff098f271acab8b70
BLAKE2b-256 534b4bdb45b181187e5b55541914f2849678fb19d4ebe874d69929a70fec553a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp39-cp39-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 b5f50d8993fa46375bd2550522631c92e605e06b0f8f771b273ecef1663d6238
MD5 a2a7bc3813c8b955054fa448f9a87ba4
BLAKE2b-256 b925e8a92c14405caa391f8f054632e750a337cceeb877c523fdf0d1f7d52cd1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 a3442112b78dc01ec024b5b5e974f7597ac992aa4833af0f4ea2b6ef0b9587e3
MD5 9cc762eacba05d5d626e015fd4f508b8
BLAKE2b-256 1baca8ba07b70acf5c25b78d80bc964319abccce999a0d9820991fa711ea12c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 af8593b2525059f0ae0d44e7ac61995f3b07ce0f6103c27df255b6046735b7fd
MD5 edb73552ba2550245247dd4d016bf681
BLAKE2b-256 98cd6af477e8718f055b9be29340b918d450fa3734951407a2a362b0d218591e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 832bce1ae0e945673a7532f6978390ab26937df04c536d45fd402f0036deb316
MD5 ce0aa5e8e8ef4eeead13980d4bc7bee7
BLAKE2b-256 6c7c6c6e8bf5e7337d3c7d7a29596a46d4689d3091eea310508c1386c9686a93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp38-cp38-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 0baccb0ed4e30b3ec866bc1de87bc93c3ec96ca20b4a822ee0a38c661d4f15af
MD5 f49b7d786b58ef7d2e780521741945bb
BLAKE2b-256 639889034b3bd10debbe30bcba05269215c23125840462da52c3dbb9604cbb85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 ae4257f348161bc111ba291da6a877a3c54f2483e0ed1734593cb94c90d0e3ba
MD5 aea8ac9e2d1ab4af28570deca8be1201
BLAKE2b-256 e10d629f8b67825d1eb65907410d803e3ef08f22cd8839e2735dfd642b6875d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 b8ffba76ef7055c99cb4748ef51131a7aaa7073e7cc160f539d909f5eb4be527
MD5 bb7a59310a26e548bbac71f0aa2bd67e
BLAKE2b-256 2344f5e4abc6963bf8ef84c895b271bd76f1a40622bd8d4890db6d1cb5c13cb1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.1.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aa8cfeae5f105e49ce4ec64985162538d0f52e48e0140aa58486cf7d2a8a7331
MD5 4c4fd7b058025ddfc75d7e028b61162c
BLAKE2b-256 2dbae9ed0e0c696d6835b417b809b3743086d92c9e464b7a858026c41857a589

See more details on using hashes here.

Supported by

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