pkpy는 C11로 작성된 게임 스크립팅을 위한 경량(~15K LOC) Python 3.x 인터프리터입니다.
우아한 구문, 강력한 기능 및 경쟁력 있는 성능을 갖춘 게임 스크립팅을 위한 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'] | ✅ |
| ListComp | [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)에 대한 프라임 벤치마크 결과는 c++, lua, pkpy 및 cpython 간의 성능을 대략적으로 반영합니다.
| 이름 | 버전 | 시간 | 파일 |
|---|---|---|---|
| 씨++ | 그누++11 | 0.104s ■□□□□□□□□□□□□□□□ | 벤치마크/primes.cpp |
| 루아 | 5.3.3 | 1.576s ■■■■■■■■■□□□□□□□ | 벤치마크/primes.lua |
| pkpy | 1.2.7 | 2.385s ■■■■■■■■■■■■■□□□ | 벤치마크/primes.py |
| 파이썬 | 3.8.10 | 2.871s ■■■■■■■■■■■■■■■■ | 벤치마크/primes.py |
| 설명 | |
|---|---|
| TIC-80 | TIC-80은 작은 게임을 만들고, 플레이하고, 공유할 수 있는 환상적인 컴퓨터입니다. |
| py-js | Max/MSP용 Python3 외부입니다. |
| 초승달 | Crescent는 크로스 플랫폼 2D 격투 및 격투 게임 엔진입니다. |
| orxpy | orx 엔진용 Python 확장입니다. |
| CANopenTerm | CANopen CC 네트워크 및 장치용 오픈 소스 소프트웨어 도구입니다. |
여기에 프로젝트를 추가하려면 끌어오기 요청을 제출하세요.
모든 종류의 기여를 환영합니다.
pkpy가 유용하다고 생각되면 이 저장소에 별표를 표시하는 것을 고려해보세요(●'◡'●)
다음과 같은 방법으로 이 프로젝트를 후원할 수 있습니다.
귀하의 후원은 pkpy를 지속적으로 개발하는 데 도움이 됩니다.
파이썬
Python 프로그래밍 언어의 공식 구현입니다.
바이트룬
훌륭한 학습 자료입니다. Python의 가상 머신이 어떻게 작동하는지 보여줍니다.
MIT 라이센스