icon: rocket order: 20
You have two options to integrate pkpy into your project.
Download the pocketpy.h and pocketpy.c on our GitHub Release page.
And #include it in your project.
Clone the whole repository as a submodule into your project, In your CMakelists.txt, add the following lines:
add_subdirectory(pocketpy)
target_link_libraries(<your_target> pocketpy)
See CMakeLists.txt for details.
It is safe to use main branch in production if CI badge is green.
To compile it with your project, these flags must be set:
--std=c11 flag must be set/utf-8 flag must be setNDEBUG macro should be defined for release build, or you will get poor performanceWe have prebuilt binaries, check them out on our GitHub Actions.
You can download an artifact there which contains the following files.
├── android
│ ├── arm64-v8a
│ │ └── libpocketpy.so
│ ├── armeabi-v7a
│ │ └── libpocketpy.so
│ └── x86_64
│ └── libpocketpy.so
├── ios
│ └── libpocketpy.a
├── linux
│ └── x86_64
│ ├── libpocketpy.so
│ └── main
└── windows
└── x86_64
├── main.exe
└── pocketpy.dll
#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: %d\n", (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: %d\n", (int)res); // 10
py_finalize();
return 0;
__ERROR:
py_printexc();
py_finalize();
return 1;
}