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

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

Quickstart

pip3 install raylib==5.5.0.2 --break-system-packages

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

Links

Installation

If you are on a modern Linux you will probably want to create a venv:

python3 -m venv venv
source venv/bin/activate

Then 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.2

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

(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 may 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.3rc1-pp311-pypy311_pp73-manylinux_2_38_x86_64.whl (1.4 MB view details)

Uploaded PyPymanylinux: glibc 2.38+ x86-64

raylib_drm-5.5.0.3rc1-pp310-pypy310_pp73-manylinux_2_38_x86_64.whl (1.4 MB view details)

Uploaded PyPymanylinux: glibc 2.38+ x86-64

raylib_drm-5.5.0.3rc1-cp313-cp313-manylinux_2_24_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64

raylib_drm-5.5.0.3rc1-cp312-cp312-manylinux_2_24_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64

raylib_drm-5.5.0.3rc1-cp311-cp311-manylinux_2_24_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64

raylib_drm-5.5.0.3rc1-cp310-cp310-manylinux_2_24_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64

File details

Details for the file raylib_drm-5.5.0.3rc1-pp311-pypy311_pp73-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.3rc1-pp311-pypy311_pp73-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 665ed2b5586e561896701dbd63ce61691b1551bb936e67973f46b1afceae1ddb
MD5 3c5b116dfa8f74aae677b10866f4c0bb
BLAKE2b-256 5d7e00aa2918642c8bbb4b295dba2e8c9f5dd40655b6634efc40e97529a790f5

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.3rc1-pp310-pypy310_pp73-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.3rc1-pp310-pypy310_pp73-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 d39288b483d183aa0404872e728fed838f4828479b025ad38ad8958cffefe1b8
MD5 3900ac10c26fba6047be96b86fed74f8
BLAKE2b-256 8966cd24391a7e3b7506e1ea0c8d98e5cb65cd723af23919a6afc1517913cc76

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.3rc1-cp313-cp313-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.3rc1-cp313-cp313-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 ea16ab5b0e2a0a8215da678463e314ec383abcaedc1c06ddc654e90ebf644cbc
MD5 124e4f128d3b56c5dc833237d6585e60
BLAKE2b-256 b4b68b975a5302e8f06e8e577783e4af98696755a07f134edb751ac470e4f410

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.3rc1-cp312-cp312-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.3rc1-cp312-cp312-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 32553ef754757563a7ccc66fd2c0332b4158740ad8847c9faaecf20d738d00a6
MD5 4004c2f22cda633b50652c9d661705ae
BLAKE2b-256 2dc5b7662d14a0314b2a0aaa25349459c553e6503b1c9388e632a5b02c8a54cd

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.3rc1-cp311-cp311-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.3rc1-cp311-cp311-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 e8aeef5bd99b01fcc1a0691e6ca68b2438cd07d4124633f87774148f709fa8dc
MD5 9198c8c3291eb6ee8303860cd9ef1207
BLAKE2b-256 66fcf94dbc2e3ee88aba5d2bfaa438ea9b5b2bdbeb3d420459a6a19b48e9af86

See more details on using hashes here.

File details

Details for the file raylib_drm-5.5.0.3rc1-cp310-cp310-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for raylib_drm-5.5.0.3rc1-cp310-cp310-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 a5502be71b5a38ed5a24bc6e7c3a2ad2a1f8766b7fbbdbe30d6f69f49e64e6b8
MD5 e6b368d96d2c396fb342a2f146cade5d
BLAKE2b-256 809c60557183d0fca3f085d140602d3ed9de9b2e96fd9d29cd938559775df407

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