nes-py
nes-py is a native NES emulator with a modern Gymnasium interface for
reinforcement learning, scripted gameplay, emulator experimentation, and custom
environment design. It runs on macOS, Linux, and Windows, builds on the
SimpleNES emulator, and currently
supports CPython 3.13 and 3.14 in CI.
Bring your own legally obtained .nes ROM, then use nes-py directly as a
Gymnasium environment, from the bundled command-line player, or through one of
the game-specific environment packages in the same ecosystem.
Highlights
- Gymnasium-native
reset,step, render-mode, and seeding semantics. - Native C++ emulator core packaged as the
nes_py._nativeextension. - Manual, random, windowed, and headless command-line play modes.
- NES joypad wrappers for compact reinforcement-learning action spaces.
- Mapper support for common cartridges including NROM, MMC1, UxROM, CNROM, MMC3, MMC5, AxROM, MMC2, and Sunsoft FME-7.
- Cross-platform wheels and source distributions published through PyPI trusted publishing.
|
|
|
|
|
|
|
|
|
|
|
|
Ecosystem
Use nes-py directly for arbitrary NES ROMs, or start from one of the focused
Gymnasium environment packages:
- gym-super-mario-bros for Super Mario Bros.
- gym-tetris for Tetris.
- gym-zelda-1 for The Legend of Zelda.
Installation
Install nes-py from PyPI:
pip install nes-py
Python 3.13 or newer is required. The supported CI wheel targets are CPython 3.13 and 3.14.
Binary wheels are published for Linux, macOS, and Windows on those supported
Python versions. If pip cannot find a compatible wheel for your interpreter
or platform, it will fall back to a source build and therefore needs a working
native C++ toolchain in the active environment.
Debian
Make sure you have the clang++ compiler installed:
sudo apt-get install clang
Windows
You'll need to install the Visual-Studio 17.0 tools for Windows installation. The Visual Studio Community package provides these tools for free.
Native Runtime Troubleshooting
nes-py ships a native extension, so import-time loader failures usually point
to a compiler-runtime mismatch rather than a Python API bug.
- On Linux, errors mentioning
GLIBCXX_* not foundmean the activelibstdc++.so.6is older than the one expected by the installed wheel or build artifacts. Update the environment's C++ runtime, use a newer distribution/toolchain, or rebuild from source inside the target environment withpip install --no-binary nes-py nes-py. - On Windows, build failures usually mean the MSVC C++ build tools are missing from the selected Python environment. Install Visual Studio Build Tools 2022 or the full Visual Studio Community package with the desktop C++ workload.
- If you are using
conda,venv, or another isolated environment manager, make sure the compiler runtime loaded at import time matches the Python environment wherenes-pywas installed.
Usage
Command Line
Launch an interactive emulator session with a local ROM:
python3 -m nes_py.play --rom <path_to_rom>
The installed console script exposes the same interface:
nes_py --rom <path_to_rom>
Print the command-line help with:
python3 -m nes_py.play -h
The play command supports keyboard controls and random controls. Random play is handy for smoke tests and can run with or without a graphical window:
python3 -m nes_py.play --rom <path_to_rom> --mode random --steps 500
python3 -m nes_py.play --rom <path_to_rom> --mode random --steps 500 --no-render
Python API
Construct the environment with the desired Gymnasium render mode, seed through
reset, and handle the separated termination and truncation flags:
from nes_py.nes_env import NESEnv
env = NESEnv("<path_to_rom>", render_mode="rgb_array")
observation, info = env.reset(seed=123)
terminated = False
truncated = False
while not (terminated or truncated):
action = env.action_space.sample()
observation, reward, terminated, truncated, info = env.step(action)
frame = env.render()
env.close()
ML Observation Helpers
NESEnv.step and render in rgb_array mode keep returning the default
(240, 256, 3) uint8 RGB screen view. That view is zero-copy, but it is
strided over the native 32-bit screen buffer. Training loops that need a
C-contiguous RGB frame or a grayscale frame can opt into explicit copy helpers
and reuse output buffers:
import numpy as np
from nes_py.nes_env import NESEnv
from nes_py.nes_env import SCREEN_SHAPE_24_BIT
from nes_py.nes_env import SCREEN_SHAPE_GRAYSCALE
env = NESEnv("<path_to_rom>")
rgb = np.empty(SCREEN_SHAPE_24_BIT, dtype=np.uint8)
gray = np.empty(SCREEN_SHAPE_GRAYSCALE, dtype=np.uint8)
observation, info = env.reset()
contiguous_rgb = env.observation("rgb_array_contiguous", output=rgb)
grayscale = env.observation("grayscale", output=gray)
The helpers are intended for measured ML pipelines, not as a replacement for Gymnasium's default observation contract. Benchmark local workloads with:
python3 -m nes_py.speedtest --rom <path_to_rom> --observation-profile --no-progress
Vector, RAM, and Snapshot Helpers
Same-ROM training loops can opt into a native vector emulator that batches
controller writes, frame stepping, observation copies, RAM readback, and
per-slot resets without moving game-specific reward or info logic into
nes-py:
import numpy as np
from nes_py.vector_env import VectorNESEmulator
vector = VectorNESEmulator("<path_to_rom>", 4)
vector.reset()
screens = vector.step(np.array([0, 1, 2, 3], dtype=np.uint8))
gray = vector.observation("grayscale")
ram_values = vector.ram_values((0x0000, (0x0001, 2, "little")))
snapshot = vector.dump_state(0)
vector.load_state(0, snapshot)
vector.close()
Scalar NESEnv also exposes ram_values(specs, output=None),
dump_state(), and load_state(snapshot). Snapshots are opaque same-process
checkpoint objects, not a stable cross-version save-state format.
Design notes and benchmark decisions live in:
docs/vector-native-emulator.mddocs/native-batch-ram-info-reads.mddocs/vector-throughput-instrumentation.mddocs/explicit-state-snapshot-api.md
Controls
| Keyboard Key | NES Joypad |
|---|---|
| W | Up |
| A | Left |
| S | Down |
| D | Right |
| O | A |
| P | B |
| Enter | Start |
| Space | Select |
Parallelism Caveats
Both the threading and multiprocessing packages are supported by
nes-py. The rendering caveats only apply to windowed human rendering:
rgb_arrayrendering is supported fromthreading.Threadandmultiprocessing.Processinstances.humanrendering is not supported from instances ofthreading.Thread; it must run on the process's main Python thread.humanrendering is supported from instances ofmultiprocessing.Process, but the viewer must be created in the process that owns the render call. Importingnes-pyornes_py.playin a parent process does not initialize the windowing backend.
Development
To design a custom environment, introduce new emulator features, or fix a bug, start with the Wiki. It includes:
- setting up the development environment
- designing environments based on the
NESEnvclass - reference material for the
NESEnvAPI - documentation for the
nes_py.wrappersmodule
Project metadata, runtime dependencies, release extras, console scripts, and
package discovery are configured in pyproject.toml. The native emulator
source tree lives under nes_emu, with public and internal headers below
nes_emu/include/nes_emu and C++ sources below nes_emu/src/nes_emu. CMake
builds those sources into the nes_py._native extension through
scikit-build-core. The runtime binding imports nes_py._native directly; the
old ctypes shared-library discovery path is no longer used. For local
development, install the package in editable mode, run the Python test suite,
and build distributions through the standard PEP 517 frontend:
python -m pip install --upgrade pip build
python -m pip install --editable . --config-settings=editable.mode=inplace
python -m unittest discover .
./main.sh clean
python -m build
Native emulator internals use opt-in CMake test and benchmark targets so normal Python installs do not fetch C++ test dependencies:
cmake -S . -B build/nes-emu-debug -DCMAKE_BUILD_TYPE=Debug -DNES_EMU_BUILD_TESTS=ON
cmake --build build/nes-emu-debug --target nes_emu_tests
ctest --test-dir build/nes-emu-debug --output-on-failure
cmake -S . -B build/nes-emu-release -DCMAKE_BUILD_TYPE=Release -DNES_EMU_BUILD_BENCHMARKS=ON
cmake --build build/nes-emu-release --target nes_emu_benchmarks
PyPI releases are published by the Publish to PyPI GitHub Actions workflow
through PyPI trusted publishing, not by local twine credentials. Configure the
PyPI project publisher with owner Kautenja, repository nes-py, workflow
filename publish.yml, and environment pypi. Then create a GitHub release
from a tag matching pyproject.toml's version, with or without a leading v.
The workflow builds the source distribution and CPython 3.13 and 3.14 wheels
for Linux, Windows, and macOS before publishing.
Benchmarking
Developer throughput checks are available through the packaged speedtest module:
python -m nes_py.speedtest --rom nes_py/tests/games/super-mario-bros-1.nes --steps 5000
Use --json for machine-readable output. Benchmark numbers are informational
and vary by machine, compiler, runner load, and display settings; they are not
correctness criteria. Backup and restore stress options use explicit interval
semantics, so --backup-interval 12 runs a backup at steps 12, 24, 36, and so
on.
Additional profiles are available for ML and vector workflows:
python -m nes_py.speedtest --rom nes_py/tests/games/super-mario-bros-1.nes --observation-profile --json --no-progress
python -m nes_py.speedtest --rom nes_py/tests/games/super-mario-bros-1.nes --ram-profile --json --no-progress
python -m nes_py.speedtest --rom nes_py/tests/games/super-mario-bros-1.nes --vector-profile --runs 5 --env-counts 1,2,4,8,16 --instrumentation --json --no-progress
Cartridge Mapper Compatibility
nes-py supports the following cartridge mappers:
- NROM
- MMC1 / SxROM
- UxROM
- CNROM
- MMC3 / TxROM
- MMC5 / ExROM
- AxROM / AOROM
- MMC2 / PxROM
- Sunsoft FME-7 / Sunsoft 5B
MMC3 support includes PPU A12 observations during the sprite-fetch phase, which keeps scanline IRQ split-screen effects such as Super Mario Bros. 3 status bars aligned with the rendered frame. MMC5 vertical split rendering and MMC5 pulse/PCM audio are not implemented yet. Sunsoft 5B audio register state is preserved, but expansion-audio mixing is not implemented yet. Planned mapper expansion is tracked in the umbrella repository's mapper specs.
Citation
Please cite nes-py if you use it in your research.
@misc{nes-py,
author = {Christian Kauten},
howpublished = {GitHub},
title = {{NES-py}: An {NES} Emulator and {Gymnasium} Interface},
URL = {https://github.com/Kautenja/nes-py},
year = {2018},
}
Disclaimer
This project is provided for educational purposes only. It is not affiliated with and has not been approved by Nintendo.
Release files for nes-py 9.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nes_py-9.0.1.tar.gz | 113.2 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| nes_py-9.0.1-cp314-cp314-win_amd64.whl | CPython 3.14 | CPython 3.14 | Windows x86-64 | Details |
| nes_py-9.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| nes_py-9.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nes_py-9.0.1-cp314-cp314-macosx_11_0_arm64.whl | CPython 3.14 | CPython 3.14 | macOS 11.0+ ARM64 | Details |
| nes_py-9.0.1-cp314-cp314-macosx_10_15_x86_64.whl | CPython 3.14 | CPython 3.14 | macOS 10.15+ x86-64 | Details |
| nes_py-9.0.1-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| nes_py-9.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| nes_py-9.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.24+ ARM64, Linux glibc 2.28+ ARM64 | Details |
| nes_py-9.0.1-cp313-cp313-macosx_11_0_arm64.whl | CPython 3.13 | CPython 3.13 | macOS 11.0+ ARM64 | Details |
| nes_py-9.0.1-cp313-cp313-macosx_10_13_x86_64.whl | CPython 3.13 | CPython 3.13 | macOS 10.13+ x86-64 | Details |
Total release size: 1.6 MB
Release files / nes_py-9.0.1.tar.gz
| Download URL | nes_py-9.0.1.tar.gz |
|---|---|
| Size | 113.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f9aafc42a90600af39e844b6c0a153fdfc2b7635997cb70be345c22e58b4557b
|
|
BLAKE2b-256 checksum How to use checksums |
c077d27858362aaaea8a371062515ba5c4ae0c48dc482797998485c998c70e8c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp314-cp314-win_amd64.whl
| Download URL | nes_py-9.0.1-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 141.6 kB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f97ff88d504a4a53e40a3a20ff6642367ebb7b9aac3ea397130e80bc425521e0
|
|
BLAKE2b-256 checksum How to use checksums |
1823b60ab177979fc09c94151ca438f815a8e284b6b5a11fcc8bc34a87286d76
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nes_py-9.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 158.5 kB |
| Tags | CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
20e414ef7300990d2204b1e0fe439fcd1b0a70f5ea18d783db78e23f2cfc3ea5
|
|
BLAKE2b-256 checksum How to use checksums |
a72cd6f602b33c3e07dd61a1c01f671b53d1cd39d2e93c54df667a458406f307
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nes_py-9.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 150.6 kB |
| Tags | CPython 3.14 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
65c343f13529ecaa5927d156af6eaa4d06aa4f7aa13e618be342beb87f618157
|
|
BLAKE2b-256 checksum How to use checksums |
41e8cd22a06a8264cc6e49d4ccb6080bac9e38cb3bee7fd89a5e1850b26efd23
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | nes_py-9.0.1-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 137.0 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ecb5827e9b664686f7b2046d5d1878d75553f70076a186df468bdea8b5e2aad6
|
|
BLAKE2b-256 checksum How to use checksums |
56fb47cc4ee81c3ea6c9eb7aa031bb3e09820d03a610655c1bdc355986a49ccc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp314-cp314-macosx_10_15_x86_64.whl
| Download URL | nes_py-9.0.1-cp314-cp314-macosx_10_15_x86_64.whl |
|---|---|
| Size | 143.9 kB |
| Tags | CPython 3.14 macOS 10.15+ x86-64 |
|
SHA-256 checksum How to use checksums |
0934d1b8711e7db1f00772590a2b072eb831907ad932e34ffab4c3afd73de5d7
|
|
BLAKE2b-256 checksum How to use checksums |
65c5cbf579c39dc18b91608eb6bd71173b47b65d1b02e311356eed80f7aa9613
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp313-cp313-win_amd64.whl
| Download URL | nes_py-9.0.1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 137.7 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2ad6a8e3e57e2af343292b636fcc866fa4887efd14a8de3543045f5f72ef08b6
|
|
BLAKE2b-256 checksum How to use checksums |
78df360f26e13c9787c601162e7c18b8d7d1f84c24989e6a814b4f058976b6eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | nes_py-9.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 158.0 kB |
| Tags | CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
628698766186e880498994dfc52bf329e8f6fb49b60916050e01710bed036f9e
|
|
BLAKE2b-256 checksum How to use checksums |
17cc9e62cccdadeb6e27aa00ffec04c4875268f89d2bba2a3c1e390f31ce774f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
| Download URL | nes_py-9.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 149.3 kB |
| Tags | CPython 3.13 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
d53f3ca69d54a44bc0fbe028a521e06feb4d2a0e09bcb5630e2cf78bc5556bb3
|
|
BLAKE2b-256 checksum How to use checksums |
791d84be8057c12cdaa60278363f85aeef35c9a0b82b929aacf151b508dbfdbd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | nes_py-9.0.1-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 136.5 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b15f5d8e7b51916fbfc17994c5f9e139815a169317146365aeee0e0dbb70e153
|
|
BLAKE2b-256 checksum How to use checksums |
ffb9883da012016194fe02fc3ac28466c84c40bac77024cd3c8a3d6df88e956c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / nes_py-9.0.1-cp313-cp313-macosx_10_13_x86_64.whl
| Download URL | nes_py-9.0.1-cp313-cp313-macosx_10_13_x86_64.whl |
|---|---|
| Size | 143.5 kB |
| Tags | CPython 3.13 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
d61747fd93abfd31eaeb1d4a52bc1385223471e67b016fa06d6e8ee61b1d3523
|
|
BLAKE2b-256 checksum How to use checksums |
154bf58ce386f120faa369e7f8615d45024ec55f707948822520af0f630e9fca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency log