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

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

Example project

Project generator

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

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

(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_software-5.6.0.0.dev2-cp314-cp314-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.14Windows x86-64

raylib_software-5.6.0.0.dev2-cp314-cp314-win32.whl (1.8 MB view details)

Uploaded CPython 3.14Windows x86

raylib_software-5.6.0.0.dev2-cp313-cp313-win32.whl (1.8 MB view details)

Uploaded CPython 3.13Windows x86

raylib_software-5.6.0.0.dev2-cp312-cp312-win32.whl (1.8 MB view details)

Uploaded CPython 3.12Windows x86

raylib_software-5.6.0.0.dev2-cp311-cp311-win32.whl (1.8 MB view details)

Uploaded CPython 3.11Windows x86

raylib_software-5.6.0.0.dev2-cp310-cp310-win32.whl (1.8 MB view details)

Uploaded CPython 3.10Windows x86

raylib_software-5.6.0.0.dev2-cp39-cp39-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.9Windows x86-64

raylib_software-5.6.0.0.dev2-cp39-cp39-win32.whl (1.8 MB view details)

Uploaded CPython 3.9Windows x86

raylib_software-5.6.0.0.dev2-cp38-cp38-win32.whl (1.8 MB view details)

Uploaded CPython 3.8Windows x86

raylib_software-5.6.0.0.dev2-cp37-cp37m-win32.whl (1.8 MB view details)

Uploaded CPython 3.7mWindows x86

File details

Details for the file raylib_software-5.6.0.0.dev2-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 79a4d0c43007d9d7a9df8d0830a81d5f691ec327bac6fb5c6f5564971f3d6f39
MD5 4dbb1e685b31c79e7799aa794ab29de5
BLAKE2b-256 1f32c2d3b9bbc8d8aa3875f1f004701da90dd9b183af56f10ebf2655da839348

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp314-cp314-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 09f34dbc0dd11fc1f4db99d162ddb91ec8a6336a874161e359a3285784f0c00e
MD5 7e6f7dae050a289067dbdf067cc3fa33
BLAKE2b-256 60d288a31919781e96336fa726596b23a1cf261347c665ba89c6376b37458e97

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp313-cp313-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 dfea6b740d7abfd93214af973ecb5090d2177fac2481720332bc635d685a23a6
MD5 b587e4d1ff282685fb2819bdd9413384
BLAKE2b-256 e99e7116ddb967a14527315b8d470c8f9857f7ba2d0c6c796a3a8a9a2e3db9e3

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp312-cp312-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 0900996b29a1446d51f9498c28fbaf19f509f07c337879c2634bef96d893330a
MD5 61c9917ed543f9ddb78c3428fc7973fc
BLAKE2b-256 aa264a69e747d509508a59d8c60d5aca5030bb74473ae8992eb93fba9c273ab1

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp311-cp311-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 10386131c7052fa7765488bc889c1cccd2c6035e85a781d5a16e7a1b9dbf97f5
MD5 56a24b8bbd263eadc59cd0032c5c2326
BLAKE2b-256 c9bb173894e7702a9608e04350503e2769c02a7c29f8424485aba91fb7f66a1a

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp310-cp310-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 4afa685744299921e8eb393edafb5522229d7020fe1f75770e741dd0c7dc481a
MD5 720af8eb3e093ba00bbf572933ca8b83
BLAKE2b-256 e835f67ace4f8c65cc69f30b73b17a9de094724292954441d7d54addf94d863d

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 427ec96187382ea6f4ecf78e331b5e37f7c5733994b85d7ccd7e389489c26f18
MD5 ecfd8a1cd1e33a1cedabda1a5c7b6cf6
BLAKE2b-256 09affb22c79a8573fc8514809cb092f864da377b6d2576ee6ef4e7b5ed5199f7

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp39-cp39-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 3820736da4a9a9f1b552c25f0756a9abd55db9a0974d730e96c401bb444d55f4
MD5 8ef7449a753c3eb7ec23d94421ba1b12
BLAKE2b-256 69677887a7b16714eede1071b12cde02d87dfdad08587c89cb4c84bba8bf44cd

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp38-cp38-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 b168228068e7c0fcaa2d71ef15c847b3354b7021f6645b1abff2a54cbe844743
MD5 b05786013f725ab5d13ef37a92349f12
BLAKE2b-256 86189834857c021c261ac3c4e8527a873b355d9be4ca670577c121b165cdf7b2

See more details on using hashes here.

File details

Details for the file raylib_software-5.6.0.0.dev2-cp37-cp37m-win32.whl.

File metadata

File hashes

Hashes for raylib_software-5.6.0.0.dev2-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 d4dddf00d9127f97df8897507599255110a7c4bbc30985aa742f3e7ade72cee0
MD5 2f84ec9a94b4442f2b0771bf727a7a28
BLAKE2b-256 f84ffedd0c13c77a3594b6d2dd0a35437436209dc9c9986c45cd1116fbeb78bd

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