Žiadny popis

BLUELOVETH 5891a88c56 Create FUNDING.yml 2 rokov pred
.github 5891a88c56 Create FUNDING.yml 2 rokov pred
benchmarks 51cf6d42e8 ... 2 rokov pred
c_bindings a00cba8de1 complex error case is working 2 rokov pred
docs 12210636ef ... 2 rokov pred
plugins 2e5c2b7147 Update build.gradle 2 rokov pred
python 940159e1ab add `dict.pop` 2 rokov pred
scripts ee0489b8d6 up 2 rokov pred
src 19c0e8cac6 ... 2 rokov pred
tests 1898c8a434 fix a lexer bug 2 rokov pred
web db2492829b ... 2 rokov pred
.gitattributes 0891000a46 init 3 rokov pred
.gitignore 9182ba5fc5 ... 2 rokov pred
LICENSE a71b1a6e90 ... 2 rokov pred
README.md d1b06f0633 ... 2 rokov pred
README_zh.md d1b06f0633 ... 2 rokov pred
amalgamate.py fa94d49a2a Update amalgamate.py 2 rokov pred
build.py a421377116 ... 2 rokov pred
compile_flags.txt 65101b4334 ... 2 rokov pred
preprocess.py a186f52354 Update preprocess.py 2 rokov pred
run_c_binding_test.sh ea9f7ee97e fix error handler 2 rokov pred
run_profile.sh 429f572c53 ... 2 rokov pred
run_profile_test.sh a71b1a6e90 ... 2 rokov pred
run_tests.sh a71b1a6e90 ... 2 rokov pred

README.md

pocketpy: python interpreter in 1 file

GitHub GitHub release

English | 简体中文

pkpy is a lightweight(~10000 LOC) Python interpreter for game scripting, built on C++17 with STL.

It aims to be an alternative to lua for game scripting, with elegant syntax, powerful features and competitive performance. pkpy is extremely easy to embed via a single header file pocketpy.h, without external dependencies.

Please see https://pocketpy.dev for details or try Live Demo.

Quick start

Download the pocketpy.h on our GitHub Release page. And #include it in your project.

Compile flags

To compile it with your project, these flags must be set:

  • --std=c++17 flag must be set
  • Exception must be enabled
  • RTTI is not required

!!! For maximum performance, we recommend to use clang++ with -O2 flag. !!!

Example

#include "pocketpy.h"

using namespace pkpy;

int main(){
    // Create a virtual machine
    VM* vm = new VM();
    
    // Hello world!
    vm->exec("print('Hello world!')", "main.py", EXEC_MODE);

    // Create a list
    vm->exec("a = [1, 2, 3]", "main.py", EXEC_MODE);

    // Eval the sum of the list
    PyObject* result = vm->exec("sum(a)", "<eval>", EVAL_MODE);
    std::cout << CAST(int, result);   // 6
    return 0;
}

Features

Name Example Supported
If Else if..else..elif YES
Loop for/while/break/continue YES
Function def f(x,*args,y=1): YES
Subclass class A(B): YES
List [1, 2, 'a'] YES
ListComp [i for i in range(5)] YES
Slice a[1:2], a[:2], a[1:] YES
Tuple (1, 2, 'a') YES
Dict {'a': 1, 'b': 2} YES
F-String f'value is {x}' YES
Unpacking a, b = 1, 2 YES
Star Unpacking a, *b = [1, 2, 3] YES
Exception raise/try..catch YES
Dynamic Code eval()/exec() YES
Reflection hasattr()/getattr()/setattr() YES
Import import/from..import YES
Context Block with <expr> as <id>: YES
Type Annotation def f(a:int, b:float=1) YES
Generator yield i YES
Decorator @cache YES

Contribution

All kinds of contributions are welcome.

  • Submit a Pull Request
    • fix a bug
    • add a new feature
  • Open an Issue
    • any suggestions
    • any questions

Check our Coding Style Guide if you want to contribute C++ code.

Reference

The official implementation of Python programming language.

An excellent learning material. It illustrates how Python's virtual machine works.

License

pkpy is licensed under the MIT License.