aboutsummaryrefslogtreecommitdiffstats
path: root/library/python/runtime/main/main.c
diff options
context:
space:
mode:
authornkozlovskiy <nmk@ydb.tech>2023-09-29 12:24:06 +0300
committernkozlovskiy <nmk@ydb.tech>2023-09-29 12:41:34 +0300
commite0e3e1717e3d33762ce61950504f9637a6e669ed (patch)
treebca3ff6939b10ed60c3d5c12439963a1146b9711 /library/python/runtime/main/main.c
parent38f2c5852db84c7b4d83adfcb009eb61541d1ccd (diff)
downloadydb-e0e3e1717e3d33762ce61950504f9637a6e669ed.tar.gz
add ydb deps
Diffstat (limited to 'library/python/runtime/main/main.c')
-rw-r--r--library/python/runtime/main/main.c46
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);
+}