Skip to main content

Python CFFI bindings for Raylib

Project description

Python Bindings for Raylib 5.5

Libraries: raymath, raygui, rlgl, physac and GLFW

Backends: Desktop, SDL, DRM, Web

Platforms: Windows, Mac, Linux, Raspberry Pi, Web

PyPI - Downloads

Chatroom: Discord

HELP WANTED: writing examples

Features:

  • CFFI API static bindings.
  • Automatically generated to be as close as possible to original Raylib.
  • Faster, fewer bugs and easier to maintain than ctypes.
  • Commercial-friendly license.
  • Docstrings and auto-completion.
  • Type checking with Mypy

Full documentation

Quickstart

pip3 install raylib==5.5.0.0

from pyray import *
init_window(800, 450, "Hello")
while not window_should_close():
    begin_drawing()
    clear_background(WHITE)
    draw_text("Hello world", 190, 200, 20, VIOLET)
    end_drawing()
close_window()

Installation

First make sure you have the latest pip installed:

python3 -m pip install --upgrade pip

Then install

python3 -m pip install setuptools
python3 -m pip install raylib==5.5.0.0

On most platforms it should install a binary wheel. If yours isn't available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g. using homebrew, apt, etc.

Windows

Binaries require x64 Windows 10 or newer. (For x86 or older Windows you will have to build from source.)

Use an official Windows Python release rather than WSL, MSYS, etc.

MacOS

Binaries require:

  • arm64 MacOS 14
  • x64 MacOS 10.13, or newer.

Older MacOS requires building from source but this is usually simple:

brew install pkg-config
brew install raylib
python3 -m pip install raylib==5.5.0.0

(I do have binaries for arm64 MacOS 11, 12 and 13 but I have no way of testing they work, so post an issue if you want to test them.)

Linux

Binaries require OS newer than Ubuntu 2020, x64 or arm64. Otherwise build from source. (Pip should attempt automatically but will need Raylib itself installed and also pkg-config.)

The arm64 binaries are built on Raspberry Pi arm64 Bullseye with OpenGL 2.0 so may not work on other boards.

Raspberry Pi

Using on Rasperry Pi

Backends

Dynamic binding version

There is now a separate dynamic version of this binding:

python3 -m pip uninstall raylib
python3 -m pip install raylib_dynamic

It works on some systems where the static version doesn't, but be sure to read these caveats before using it

You can't have multiple raylib packages installed at once.

SDL backend

This is not well tested but has better support for controllers:

python3 -m pip uninstall raylib
python3 -m pip install raylib_sdl

You can't have multiple raylib packages installed at once.

DRM backend

This uses the Linux framebuffer for devices that don't run X11/Wayland:

python3 -m pip uninstall raylib
python3 -m pip install raylib_drm

You can't have multiple raylib packages installed at once.

Problems?

If it doesn't work, try to build manually.. If that works then submit an issue to let us know what you did.

If you need help you can try asking on our discord. There is also a large Raylib discord for issues that are not Python-specific.

If it still doesn't work, submit an issue.

How to use

There are two modules in the raylib package, raylib and pyray. (There is no separate package for pyray. Do not pip install pyray). You can use either or both:

If you are familiar with C coding and the Raylib C library and you want to use an exact copy of the C API

Use the raylib module.

If you prefer a more Pythonistic API

Use the pyray module.

Running in a web browser

Pygbag >=0.8.7 supports running in a web browser. Usually the latest git version is recommended.

Make a folder my_project with a file main.py:

# /// script
# dependencies = [
#     "cffi",
#     "raylib"
# ]
# ///
import asyncio
import platform
from pyray import *

async def main():   # You MUST have an async main function
    init_window(500, 500, "Hello")
    platform.window.window_resize()  # You MAY want to add this line
    while not window_should_close():
        begin_drawing()
        clear_background(WHITE)
        draw_text("Hello world", 190, 200, 20, VIOLET)
        end_drawing()
        await asyncio.sleep(0) # You MUST call this in your main loop
    close_window()

asyncio.run(main())

Then to create the web files and launch a web server:

python3.12 -m pip install --user --upgrade pygbag
python3.12 -m pygbag --PYBUILD 3.12 --ume_block 0 --template noctx.tmpl --git my_project

Point your browser to http://localhost:8000

Some features may not work, so you can disable them like this:

if platform.system() != "Emscripten":  # audio does not work on current version of emscripten
    init_audio_device()

This is all done by Pygbag rather than by me, so you should probably contact them with any issues. Carefully read all their documentation.

It does work for most of these examples

App showcase

Tempest-raylib

KarabinerKeyboard

PyTaiko

DOOM-Clone

Tanki

Alloy Bloxel Editor

Eidolon

Add your app here!

RLZero

A related library (that is a work in progress!):

A simplified API for Raylib for use in education and to enable beginners to create 3d games

Help wanted

  • Converting more examples from C to Python
  • Testing on more platforms

License

Eclipse Public License, so you are free to statically link and use in non-free / proprietary / commercial projects!

Performance

If you need more performance, do in this order:

  1. Use Pypy rather than standard CPython. It is much, much faster and will make more difference than any other optimisations you might do.

  2. Every call to C is costly, so it's slightly faster if you use Python data structures and functions when calculating in your update loop and then only convert them to C data structures when you have to call the C functions for drawing.

  3. The raylib.* functions are potentially slightly faster than the pyray.* equivalents, so if you need a tiny bit more performance you can switch your inner loop functions to these.

  4. There is a version of Python that is faster than Pypy: GraalPy. However it's not fully compatible with all Python packages. It doesn't work with CFFI and so doesn't work with this binding. But it is compatible with the Java binding, Jaylib! There is an example of this here: https://github.com/electronstudio/megabunny/tree/master/raylib-python-jaylib

Bunnymark

Library Implementation Bunnies (60 FPS) Percentage
Raylib 5.0 C 180000 100%
Raylib Python CFFI 5.0.0.2 Python 3.12 10500 5.8%
Raylib Python CFFI 5.0.0.2 Pypy 3.10 95000 53%
Raylib 3.7 C 168100 100%
Raylib Python CFFI 3.7 Pypy 3.7 33800 20%
Raylib Python CFFI 3.7 Python 3.9 7700 4.5%
Raylib Python CFFI 3.7 Python 3.9 Nuitka 8600 5.1%
Raylib Python CFFI 3.7 Dynamic Python 3.9 6300 3.7%

See also https://github.com/electronstudio/megabunny/

Packaging your app

You can create a standalone binary using the Nuitka compiler. For example, here is how to package Bunnymark:

pip3 install nuitka
cd examples/textures
python3 -m nuitka --onefile --linux-onefile-icon resources/wabbit_alpha.png textures_bunnymark.py

Advert

RetroWar: 8-bit Party Battle is out now. Defeat up to 15 of your friends in a tournament of 80s-inspired retro mini games.

Coding Games With Pygame Zero & Python is a book for Python beginners.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

raylib_drm-5.5.0.1-cp313-cp313-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13

raylib_drm-5.5.0.1-cp312-cp312-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.12

raylib_drm-5.5.0.1-cp312-cp312-manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.12

raylib_drm-5.5.0.1-cp311-cp311-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11

raylib_drm-5.5.0.1-cp311-cp311-manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.11

raylib_drm-5.5.0.1-cp310-cp310-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.10

raylib_drm-5.5.0.1-cp310-cp310-manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.10

raylib_drm-5.5.0.1-cp39-cp39-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.9

raylib_drm-5.5.0.1-cp39-cp39-manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.9

File details

Details for the file raylib_drm-5.5.0.1-pp310-pypy310_pp73-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-pp310-pypy310_pp73-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9313e51b2996c41c4214494b38455fb36fece6be4c22c41337e23701e0147477
MD5 e5bb99996b9dd457ac8122cd8c08c110
BLAKE2b-256 86467340dbeaac4c10cf3f4f95a44b444d590b24f42558e765f06803ecad6426

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-pp39-pypy39_pp73-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-pp39-pypy39_pp73-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 52bf442083f312418daa2a8b1aa9bab78e89e3f772f206ba32dcb052b76703cc
MD5 d084ceddce232fd039e62a6fb00b9725
BLAKE2b-256 0ea3b642869d91c26af8a53a9a0768cacec784bb547db2f9e3adbab451ea741e

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp313-cp313-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp313-cp313-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d8f2e365981e020196ad223fff9894715e66c0655e0cc51aa1bf7e9bd862f9bc
MD5 a6d32db7b4e866691e4460c22315591c
BLAKE2b-256 44cd4f0e6331511b8651c354c3d3e7ee168b548314e521a33ebc1cac54584f30

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp312-cp312-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp312-cp312-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b4913820b065f7ee248df26a249f7359cd7bff76d79a4ce839aaf3c3416c502d
MD5 3f70fe1e4e9c564c248e722dfc4f3331
BLAKE2b-256 2132c68d5dce33c8752770d080f14e441f309bde9390680e9f9e420bc4d0d3f6

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp312-cp312-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp312-cp312-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 889304d100996cd2ce7cbddbb89a575f25b832569e533ff4869d4a2d518159d5
MD5 9c4caa6eaa6232ae018233ca141482f8
BLAKE2b-256 87cae172d7ea386c5ef2340e7930c9ec593b067c2cd5a33057d353ffede31795

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp311-cp311-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp311-cp311-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 73f7aec6921189b84e13e96ef4f14bcbf8de022f0d55e67b1db0af8a3ed93b2c
MD5 8b38d2918f822aa1dff972b92ab00236
BLAKE2b-256 8cd3238f67704afedb7999ef1cffdd41ae9a4daf5265e6d6c990751de3b692b5

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp311-cp311-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp311-cp311-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b608c792f04b6b2596f25291633e93e1fbcb27e154d34d82321945a81c24842e
MD5 8de39b47e2e7f0e4a012b9276e4add69
BLAKE2b-256 2484b68eaadb97c6f8d85f18db0426af51d466065c8d25ba71c02c17a1a455f2

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp310-cp310-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp310-cp310-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 97756dbe2f6a7816004cda77a85bf63e951158813f92ca73e0626fc182f6f641
MD5 a33a0cd1b7ce6527ef1efae02affa8af
BLAKE2b-256 0ef6ba0a11cf83515290ee23edfc96f2942121e6a571cfc41527016957e0e244

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp310-cp310-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp310-cp310-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 559b9408ecc54218602a63ebe5e7dc8cd2d9457087b3e457ff0ca589f2df862e
MD5 2bfcbd83e3e90232a44fdfc419ddb3e1
BLAKE2b-256 2ac44ab5fd9df420e1630f64ac2865488e189d27c9c77deb0cee1b9e5ae4a60b

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c5438493aa89f482ba2e787c7765fdd411ddd5270c5622a41f6cc1c9c0425578
MD5 11edb140fbaccf54834f2c7d3ad06191
BLAKE2b-256 067486e24b178b8f0183f55dd068386802c2e36d2d5409997a1668cd39723793

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.1-cp39-cp39-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.1-cp39-cp39-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1d42fca858f94e6a55dc88b158acb389b86b55a14d25c44c90db6e578f55183a
MD5 4825f78c1d9dd3c94b2f7cf0a20f506d
BLAKE2b-256 006474c71fe549abb65b9356a7fca6643a1573b5d46e41bd03d61210c9600044

See more details on using hashes here.

Supported by

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