pkpy — это легкий (~15 КБ LOC) интерпретатор Python 3.x для написания игровых сценариев, написанный на C11.
Он призван стать альтернативой lua для написания игровых сценариев с элегантным синтаксисом, мощными функциями и конкурентоспособной производительностью. pkpy чрезвычайно легко встроить с помощью одного заголовочного файла pocketpy.h
без внешних зависимостей.
Подробную информацию см. на https://pocketpy.dev и попробуйте следующие ресурсы.
pkpy должен работать на любой платформе с компилятором C11. Эти платформы официально протестированы.
У вас есть два варианта интеграции pkpy в ваш проект.
Загрузите pocketpy.h
и pocketpy.c
на нашей странице релиза GitHub. И #include
его в свой проект.
Клонируйте весь репозиторий как подмодуль в свой проект. В CMakelists.txt добавьте следующие строки:
add_subdirectory (pocketpy)
target_link_libraries ( pocketpy)
Подробности см. в CMakeLists.txt.
Безопасно использовать main
ветку в производстве, если значок CI зеленый.
Чтобы скомпилировать его с вашим проектом, необходимо установить эти флаги:
--std=c11
должен быть установлен/utf-8
NDEBUG
должен быть определен для сборки выпуска, иначе вы получите низкую производительность. Для объединенной сборки запустите python amalgamate.py
, чтобы сгенерировать pocketpy.c
и pocketpy.h
в каталоге amalgamated/
.
#include "pocketpy.h"
#include
static bool int_add ( int argc , py_Ref argv ) {
PY_CHECK_ARGC ( 2 );
PY_CHECK_ARG_TYPE ( 0 , tp_int );
PY_CHECK_ARG_TYPE ( 1 , tp_int );
py_i64 a = py_toint ( py_arg ( 0 ));
py_i64 b = py_toint ( py_arg ( 1 ));
py_newint ( py_retval (), a + b );
return true;
}
int main () {
// Initialize pocketpy
py_initialize ();
// Hello world!
bool ok = py_exec ( "print('Hello world!')" , "" , EXEC_MODE , NULL );
if (! ok ) goto __ERROR;
// Create a list: [1, 2, 3]
py_Ref r0 = py_getreg ( 0 );
py_newlistn ( r0 , 3 );
py_newint ( py_list_getitem ( r0 , 0 ), 1 );
py_newint ( py_list_getitem ( r0 , 1 ), 2 );
py_newint ( py_list_getitem ( r0 , 2 ), 3 );
// Eval the sum of the list
py_Ref f_sum = py_getbuiltin ( py_name ( "sum" ));
py_push ( f_sum );
py_pushnil ();
py_push ( r0 );
ok = py_vectorcall ( 1 , 0 );
if (! ok ) goto __ERROR;
printf ( "Sum of the list: %dn" , ( int ) py_toint ( py_retval ())); // 6
// Bind native `int_add` as a global variable
py_newnativefunc ( r0 , int_add );
py_setglobal ( py_name ( "add" ), r0 );
// Call `add` in python
ok = py_exec ( "add(3, 7)" , "" , EVAL_MODE , NULL );
if (! ok ) goto __ERROR;
py_i64 res = py_toint ( py_retval ());
printf ( "Sum of 2 variables: %dn" , ( int ) res ); // 10
py_finalize ();
return 0 ;
__ERROR:
py_printexc ();
py_finalize ();
return 1 ;
}
Имя | Пример | Поддерживается |
---|---|---|
Если еще | if..else..elif | ✅ |
Петля | for/while/break/continue | ✅ |
Функция | def f(x,*args,y=1): | ✅ |
Подкласс | class A(B): | ✅ |
Список | [1, 2, 'a'] | ✅ |
ListComp | [i for i in range(5)] | ✅ |
Срез | a[1:2], a[:2], a[1:] | ✅ |
Кортеж | (1, 2, 'a') | ✅ |
Дикт | {'a': 1, 'b': 2} | ✅ |
Фа-струна | f'value is {x}' | ✅ |
Распаковка | a, b = 1, 2 | ✅ |
Звезда распаковка | a, *b = [1, 2, 3] | ✅ |
Исключение | raise/try..catch..finally | ✅ |
Динамический код | eval()/exec() | ✅ |
Отражение | hasattr()/getattr()/setattr() | ✅ |
Импорт | import/from..import | ✅ |
Контекстный блок | with | ✅ |
Тип Аннотация | def f(a:int, b:float=1) | ✅ |
Генератор | yield i | ✅ |
Декоратор | @cache | ✅ |
В настоящее время pkpy работает так же быстро, как cpython 3.9. Результаты производительности для cpython 3.9 применимы и для pkpy.
Подробности см. на https://pocketpy.dev/ Performance/.
А это результаты теста простых чисел на Intel i5-12400F, WSL (Ubuntu 20.04 LTS), который примерно отражает производительность среди c++, lua, pkpy и cpython.
имя | версия | время | файл |
---|---|---|---|
С++ | гну++11 | 0.104s ■□□□□□□□□□□□□□□□ | тесты/primes.cpp |
Луа | 5.3.3 | 1.576s ■■■■■■■■■□□□□□□□ | тесты/primes.lua |
пкпи | 1.2.7 | 2.385s ■■■■■■■■■■■■■□□□ | тесты/primes.py |
cpython | 3.8.10 | 2.871s ■■■■■■■■■■■■■■■■ | тесты/primes.py |
Описание | |
---|---|
ТИК-80 | TIC-80 — это фантастический компьютер для создания, запуска и обмена крошечными играми. |
py-js | Внешние возможности Python3 для Max/MSP. |
полумесяц | Crescent — это кроссплатформенный 2D-движок для файтингов и битв. |
оркспи | Расширение Python для движка orx. |
CANopenTerm | Программный инструмент с открытым исходным кодом для сетей и устройств CANopen CC. |
Отправьте запрос на включение, чтобы добавить свой проект здесь.
Приветствуются любые виды вкладов.
Если вы найдете pkpy полезным, поставьте галочку этому репозиторию ( ●'◡'ا)
Вы можете спонсировать этот проект следующими способами.
Ваше спонсорство поможет нам постоянно развивать pkpy.
cpython
Официальная реализация языка программирования Python.
байтран
Отличный учебный материал. Он иллюстрирует, как работает виртуальная машина Python.
Лицензия MIT