pkpy 是一個輕量級(~15K LOC)Python 3.x 遊戲腳本解釋器,用 C11 編寫。
它旨在成為lua遊戲腳本的替代品,具有優雅的語法、強大的功能和有競爭力的性能。 pkpy 非常容易透過單一頭檔pocketpy.h嵌入,無需外部依賴。
請參閱 https://pocketpy.dev 以了解詳細資訊並嘗試以下資源。
pkpy 應該可以在任何具有 C11 編譯器的平台上運行。這些平台都經過官方測試。
您有兩個選項將 pkpy 整合到您的專案中。
在我們的 GitHub 發布頁面下載pocketpy.h和pocketpy.c 。並將其#include到您的專案中。
將整個儲存庫作為子模組複製到您的專案中,在 CMakelists.txt 中新增以下行:
add_subdirectory (pocketpy)
target_link_libraries (<your_target> pocketpy)有關詳細信息,請參閱 CMakeLists.txt。
如果 CI 徽章為綠色,則在生產中使用main分支是安全的。
要在您的專案中編譯它,必須設定這些標誌:
--std=c11標誌/utf-8標誌NDEBUG巨集應該為發布版本定義,否則效能會很差對於合併構建,運行python amalgamate.py在amalgamated/目錄中產生pocketpy.c和pocketpy.h 。
#include "pocketpy.h"
#include <stdio.h>
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!')" , "<string>" , 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)" , "<string>" , 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'] | ✅ |
| 列表比較 | [i for i in range(5)] | ✅ |
| 片 | a[1:2], a[:2], a[1:] | ✅ |
| 元組 | (1, 2, 'a') | ✅ |
| 字典 | {'a': 1, 'b': 2} | ✅ |
| F 弦 | 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 <expr> as <id>: | ✅ |
| 類型註釋 | 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)上進行 primes 基準測試的結果,大致反映了 c++、lua、pkpy 和 cpython 之間的效能。
| 姓名 | 版本 | 時間 | 文件 |
|---|---|---|---|
| 由 小碼哥發佈於 | gnu++11 | 0.104s ■□□□□□□□□□□□□□□□ | 基準/primes.cpp |
| 盧阿 | 5.3.3 | 1.576s ■■■■■■■■■□□□□□□□ | 基準測試/primes.lua |
| PKP | 1.2.7 | 2.385s ■■■■■■■■■■■■■□□□ | 基準/primes.py |
| Python直譯 | 3.8.10 | 2.871s ■■■■■■■■■■■■■■■■ | 基準/primes.py |
| 描述 | |
|---|---|
| TIC-80 | TIC-80 是一款用於製作、玩和分享小遊戲的夢幻電腦。 |
| Pythonjs | Max / MSP 的 Python3 外部。 |
| 新月 | Crescent 是一款跨平台 2D 格鬥和格鬥遊戲引擎。 |
| 奧克斯比 | orx 引擎的 Python 擴充。 |
| CANopen術語 | 適用於 CANopen CC 網路和裝置的開源軟體工具。 |
在此提交拉取請求以新增您的項目。
歡迎各種貢獻。
如果您發現 pkpy 有用,請考慮為該儲存庫加註星標 (●'◡'●)
您可以透過以下方式贊助該專案。
您的贊助將幫助我們持續發展pkpy。
Python直譯
Python 程式語言的官方實作。
位元組跑
極佳的學習材料。它說明了Python 虛擬機器的工作原理。
麻省理工學院許可證