diff options
author | nkozlovskiy <nmk@ydb.tech> | 2023-09-29 12:24:06 +0300 |
---|---|---|
committer | nkozlovskiy <nmk@ydb.tech> | 2023-09-29 12:41:34 +0300 |
commit | e0e3e1717e3d33762ce61950504f9637a6e669ed (patch) | |
tree | bca3ff6939b10ed60c3d5c12439963a1146b9711 /library/python/runtime/main/main.c | |
parent | 38f2c5852db84c7b4d83adfcb009eb61541d1ccd (diff) | |
download | ydb-e0e3e1717e3d33762ce61950504f9637a6e669ed.tar.gz |
add ydb deps
Diffstat (limited to 'library/python/runtime/main/main.c')
-rw-r--r-- | library/python/runtime/main/main.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/library/python/runtime/main/main.c b/library/python/runtime/main/main.c new file mode 100644 index 0000000000..69dd80e558 --- /dev/null +++ b/library/python/runtime/main/main.c @@ -0,0 +1,46 @@ +#include <Python.h> + +#include <stdlib.h> +#include <string.h> + +void Py_InitArgcArgv(int argc, char** argv); + +static const char* env_entry_point = "Y_PYTHON_ENTRY_POINT"; + +#ifdef _MSC_VER +extern char** environ; + +void unsetenv(const char* name) { + const int n = strlen(name); + char** dst = environ; + for (char** src = environ; *src; src++) + if (strncmp(*src, name, n) || (*src)[n] != '=') + *dst++ = *src; + *dst = NULL; +} +#endif + +static int pymain(int argc, char** argv) { + const char* entry_point = getenv(env_entry_point); + if (entry_point && !strcmp(entry_point, ":main")) { + unsetenv(env_entry_point); + return Py_Main(argc, argv); + } + Py_InitArgcArgv(argc, argv); + Py_SetProgramName(argv[0]); + Py_Initialize(); + PySys_SetArgv(argc, argv); + int rc = PyRun_SimpleString( + "from library.python.runtime import entry_points\n" + "entry_points.run_constructors()\n" + "import __res\n" + "__res.importer.run_main()\n"); + Py_Finalize(); + return rc == 0 ? 0 : 1; +} + +int (*mainptr)(int argc, char** argv) = pymain; + +int main(int argc, char** argv) { + return mainptr(argc, argv); +} |