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.0.0.tar.gz (305.4 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.12 Windows x86-64

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

Uploaded CPython 3.12 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.0.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.0.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.0.0-cp312-cp312-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

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

Uploaded CPython 3.11 Windows x86-64

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

Uploaded CPython 3.11 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.0.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.0.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.0.0-cp311-cp311-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.0.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.0.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.0.0-cp310-cp310-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.0.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.0.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.0.0-cp39-cp39-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 manylinux: glibc 2.35+ ARM64

pythonmonkey-1.0.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.0.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.0.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.0.0.tar.gz.

File metadata

  • Download URL: pythonmonkey-1.0.0.tar.gz
  • Upload date:
  • Size: 305.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.19

File hashes

Hashes for pythonmonkey-1.0.0.tar.gz
Algorithm Hash digest
SHA256 3f93156d4fb54512059ff8a0769d5a56b6a392c2a46502c4261e16d851d9d21d
MD5 13d0d73ba8f0be777db772c163c4c33f
BLAKE2b-256 f363bed105e2014dd2f89b71ca0b1de5a06ae2f773426a575af81584c8a40e99

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 85d66594fce734825278746ded35398d400587694105b3b42cb96e1e9cc0bb48
MD5 fdafb2e140b92590cd4195dc3f4e7e85
BLAKE2b-256 3c6225401308bc0f048877a2ef0f738125b54dc43ae0589f317a89c92103fdae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp312-cp312-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 87ee3f8dd4322918844321d2802e000ce8a7ccd58f80c23f3d1be5011222eda9
MD5 a5fd9e1bbd4a9d77307ac2fa244c0b48
BLAKE2b-256 8f1501a5bcae872b5b4fbcefe92af8532e139b96ba89fc2baa74d1064c2d60ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp312-cp312-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 623be0d6838d715eee090b45d4428f408a0283aaf8a69147de1e26f03c900666
MD5 35d84a144375364cb9cafaef2e2f834c
BLAKE2b-256 e6cd69a988b9498d9a533a669acd8e64ba06f29c32ecefc6f8655553b7f34ad2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6efddfa723275f042481a291405123f5915a70be035f891c1f6d05b565618794
MD5 fa68ee011c04ce7434448a042618ba00
BLAKE2b-256 bdd8c42df113ef01da5a38c09a1496af234081b0224c270b8de47a80a60a97fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db42b296724157906554a21daea264fb31c57ab54e7ce212359f6b2e62e7ce12
MD5 be47b98ab6fdeea27835750e869e067d
BLAKE2b-256 447c8ab2b98759d7318c1a58b320e745a61923b2a5cb34899d1f1533beb2dd42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4f54a3a1916cd9db0ad003f181165ff9e7564b657e495b457a7d58de68ff8904
MD5 6760f4c0abe11270ad7710856c877fb3
BLAKE2b-256 7695e25cad3ff508e4b8aa0f72ef7346eca734e9fca149b4d2dfa5a77ad35806

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp311-cp311-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 864b56e256ef543dc4f325aca52f3231fa34322614c7be747b22e03714e51212
MD5 20ad5e611d8f071033869d113d9a501a
BLAKE2b-256 502fe343f2c12916d5676d8e140e18f8abcacee21b1d44219701513a62eaa2e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp311-cp311-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 ee2f8f7ab5c5dd67bd23243d7bc8b07c1b795f910e60ef8f7cd29abc40d96188
MD5 d11a88523b81adf29599110b3616c3aa
BLAKE2b-256 d75c156df3a325b4033e688ab0d6497ac5e1d44ac14cc87d41227dd06e01f8bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 e0318a2ee8fba42caecfc824267a80946449e265464623f026278129959751b6
MD5 6d91829bb73ddd07714086dbfb915e9c
BLAKE2b-256 279fa156473a580ffba37c1213d05d4c67412efb037467f56b34c2250b66d33d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a374ff726a8cf550d9107a559d1c7358c50e5326c909b9ba7c301436a35dbd78
MD5 c35b362df368cb26061e1042e85f8000
BLAKE2b-256 049ff9a4f833d670fcbc83f2a567fdab0c800010d9ee304a826df6436a353a5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8d648a71620c329135b763cd7ecfc406259980116280b619d168c6c57f99d184
MD5 acc9aefe8479d09ab3eda36d2cc6d070
BLAKE2b-256 c3fdc153947d4f6568c6265156376d01ead8427aa9d3e3be46d617a48f58b24b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp310-cp310-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 56e94579950a0dae765888acc0afc2226d6e3a2cdbf2df24b63389ca2e6f8e90
MD5 44932a4bce886d44be7b8ab848f76bc0
BLAKE2b-256 050cf3b6b55b8432791c2207d699e03aacb12604a05374bc45636f5bea74cabc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp310-cp310-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 17ccb71439b5520f63f46b6f19cf1df212c3ccf60372a5bfb177c5326272e3cb
MD5 8c19e0991030ade246fcfec8c5fbaef3
BLAKE2b-256 8434c27424caa33155c01194b3a90ed7a03df0ada557b12db87534a64d38459d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c7db384c7c34a70e9023ea633a571a962ce90bd83dd59160b8f0274907478834
MD5 10b68a410f0a06fce8f19d351db43136
BLAKE2b-256 79f1546984306323dcbb645e8245bca9f1f1dc185b7d216b0807f875bbc04e1c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1cdb3e6d5740a5b1ff93f219230ce9cd68845781415b215839f888ae24614583
MD5 ddd155e6ed9377b3070e8863b7d7ab3c
BLAKE2b-256 fc098848cdd44c6cf6c14e71b2486c551763f94ab1d19f9bc54bab17d6ee8ede

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 2172646250482f47b0824c600c0ac1bc1c25104b21825cf860d876665105dc6a
MD5 078676f7f3ed2f96751f385b01dbfce8
BLAKE2b-256 c1ac187eaf8f8c91b8eb61c824199b6e8a195fc921da834e19d3344335e735f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp39-cp39-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 6872093d69442a6c2aa08de8da2c5efb07a8e1fba83e0537e86431e556ec66b4
MD5 7b5ea7c1820483f11ce1e926af40111f
BLAKE2b-256 09932040039d0a1f4878dcd3eac20a13ee5a211624f1adfc3d07bc55d6a2acb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp39-cp39-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 c7749aec3b3674616cf1a8e66237daf6402e1d44680c9c9e03db4811d015ce02
MD5 b4e85f2756bf3f4264aff384dc65fd60
BLAKE2b-256 c234b5b935dca12fbc2f4c976a4f2a86e55f7372407f39adf7e14d37c812d0f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6475d717c06a440ecf7ba34800f6230683075e8a7557e7a31d95b7e3df88b85a
MD5 903655c0a06d10bec043b8e9bf132496
BLAKE2b-256 57a0a7bc5b93bc14c1471458caf87ba78d1533e8cfe676980a6eb6c16766e2d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 45a76c656683f6db431062a2a2304be08d1edb5b1d53a602c5fbcf8e65e24058
MD5 2a9e3717f3b52ad8e9270dc9fc9f73ac
BLAKE2b-256 bd4b6ebc623f5b99c60c8e2d439497e360a0e6160b5b18e3322a5798aab60788

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 77084190ecaea14bd88d5eec0ec3675c3485c70d53784bc281a79507e6fcab01
MD5 7e1cea7e28e82d58ab25f509958331d9
BLAKE2b-256 b9f0e275430131d8e0406d498071bd12812919c369d1b552f02f9d88f6befaba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp38-cp38-manylinux_2_35_aarch64.whl
Algorithm Hash digest
SHA256 dc2b8eba10754482df74d89c9ab0021f4fdea08a791926e1641631a578c0b51b
MD5 e2ca2be5033e1f09b0cd4e836e5dd10c
BLAKE2b-256 dc65a4b1385abcef5d00d9e663d4d6e2e46958783fad2e36e9b152663e570791

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp38-cp38-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 7a0c97e6db89741a4aaef3c3767c01979dc74dc592f15d0c75a44c21192645aa
MD5 cc9ca6940adfa09a5faf9084eb4863c8
BLAKE2b-256 ae43bcb6236b430c9db73effcd1ebd995ec072e0e4497dc8aa26f52b8e661071

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6ac2e313192a72590ee07a38c608c9b634de040b05be08e65ac3d957a4245f04
MD5 acdb71e54f1010faf03e3f0cc1d40dc0
BLAKE2b-256 8329772969e8b244c676a5d7775527bc0704ceaf3ed7145f700bbc931b87a291

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pythonmonkey-1.0.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ae6dfce289afa0c8cf08060cadfd25dd229a6eaa7f2c36926694afbc5e07325
MD5 f7bc4e907e209156eadd599114cdd3ac
BLAKE2b-256 f49056fcd4b335b85c82e126c05de389ea090b6daed8d292c8b9963c55447012

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 Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page