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

Chatroom: Discord

New 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.

Full documentation

Quickstart

pip3 install raylib==5.0.0.4

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.0.0.4

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.0.0.4

(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

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

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). 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.

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 must 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 my_project

Point your browser to http://localhost:8000

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

Tanki

Alloy Bloxel Editor

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

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-pp310-pypy310_pp73-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2878f701444dd45069f36c128deaa75f3201e1911f68be79cc0f4daf27d3c39
MD5 cee0a399d8f55cb2327540c5ab7978a1
BLAKE2b-256 1662725b126fb3aeaaf7c3b2941a70ff193a6a9d7713e9f70133c2760f4e24a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8cb460c78710972aef0fcaf71609184b991c93fc458e09b6e39e213c5cfdf2cf
MD5 f7f564465cce7cfd8bcfafcd7c4f6b71
BLAKE2b-256 5093330eb587373ce0fd89176fe5fa7cf6d32862f3aecde2403a5a57de423b9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp313-cp313-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8524f9a5258b1d8f86e3392cf278c872569a2fda5444da32731f757e08af5846
MD5 d6d8275eb06c1287a2537158bbdde761
BLAKE2b-256 d5afa62d808d2c0bb86e675ef1ddec31a5be8e977bac0eb274898ac7ee78dc59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp312-cp312-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 544e9d86baeae5cced782356b606bbec5057ba9ece14d9c0de47c10b246010f9
MD5 8a98328e2583fd3aa673c5f063201270
BLAKE2b-256 bdf9e0e73833d34cf4661e3b8c252103bbd05f156e3fc2fdac2f7eaf4942ad19

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp312-cp312-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 aa7aef01db73a477dd39e2285abfcff57c4bb7081635d167a55ae03fc4226163
MD5 15b79e328ef4ec2f45b4fadf479f5367
BLAKE2b-256 2663df653ce8dea6571b50f7fd62d3a7309d64370cb7b2f0c487614c18b6c536

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp311-cp311-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f6f06da322ff1a0579f8510a71298f0ee73ae83aac8ce00ef6701ac3febdd671
MD5 00ecc5c2676806ee2307a7112ece3a26
BLAKE2b-256 5aa34875aaa9cf995d99d9c3c5ad14d3997fd9f6a868c80c484a213bdb1858d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp311-cp311-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2935aa8abae43867b09b7017603778edddd0b11592939a9aa26e95011e963e5f
MD5 9d88a9611b9ec7c3357e763c1c95aeb4
BLAKE2b-256 6a3772faaab8aed31d0b9f938d27817fd61b9914fe5909e04af46a815093f95a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp310-cp310-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf5b527630eb5499f0eed2389e105741659da14b6a7e65562096783e962e74f5
MD5 24c0b7e966f8b50d3acd363eda3f0d00
BLAKE2b-256 e715c3c4ecb52998bc849a002e8759b42db4d3e811c3a621e699911073011858

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp310-cp310-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7a434c168fa0fac3da83661e0c3de3e150d959f39ebc7623f926c7727c0b57a8
MD5 933975fb1dee32e4b6a53ca59cb043e2
BLAKE2b-256 25e50041d21c4aa15356fa406c4a9e5a11a7fdaeab93674cabb4ce7e992d17ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 507b83d942e3a3f76e0920b0ececbdbab6bb119ed6e222d2d7a6c43d5e3560f9
MD5 f76cfdf28ce85f547adc09d0f028f04c
BLAKE2b-256 4936221cd001857b15e7cd19bfaa0554b9049d16ef936fa761a6e2543b29b360

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for raylib_drm-5.5.0.0-cp39-cp39-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 299049551ac2f68637beb71f27ea90c542d7dfaff42f84ef9c50596ed8120bec
MD5 5742f5258b869277348668bb48023df3
BLAKE2b-256 463e43f270287727c93e3ea23d14feeb0708e374d678bcdd034bbbadc6faf72c

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