Browse Source

DEVTOOLSSUPPORT-18626: In venv directly call Py_BytesMain()

The arcadia main function (library/python/runtime_py3/main/main.c::pymain) calls Py_InitializeFromConfig() before going to the vanilla python Py_Main().
Py_InitializeFromConfig() overrides sys.prefix and sys.exec_prefix by default values ('/var/empty') and then import __res module (and importer.pxi as a part of it).
importer.pxi::_init_venv() set a proper value to sys.prefix and sys.exec_prefix attributes.
Py_Main() in turn also calls Py_InitializeFromConfig() and reset the sys attributes to their default values again.
I don't know why it was not a problem in python 3.9 but in 3.10 it is.

ref:0466de641f92d66c4f992ae12c02d8d58db397f6
say 2 years ago
parent
commit
692098a972

+ 4 - 0
library/python/runtime_py3/main/main.c

@@ -7,6 +7,7 @@
 
 
 void Py_InitArgcArgv(int argc, wchar_t **argv);
 void Py_InitArgcArgv(int argc, wchar_t **argv);
 char* GetPyMain();
 char* GetPyMain();
+int IsYaIdeVenv();
 
 
 static const char* env_entry_point = "Y_PYTHON_ENTRY_POINT";
 static const char* env_entry_point = "Y_PYTHON_ENTRY_POINT";
 static const char* env_bytes_warning = "Y_PYTHON_BYTES_WARNING";
 static const char* env_bytes_warning = "Y_PYTHON_BYTES_WARNING";
@@ -74,6 +75,9 @@ static int RunModule(const char *modname)
 }
 }
 
 
 static int pymain(int argc, char** argv) {
 static int pymain(int argc, char** argv) {
+    if (IsYaIdeVenv()) {
+        return Py_BytesMain(argc, argv);
+    }
     PyStatus status = _PyRuntime_Initialize();
     PyStatus status = _PyRuntime_Initialize();
     if (PyStatus_Exception(status)) {
     if (PyStatus_Exception(status)) {
         Py_ExitStatusException(status);
         Py_ExitStatusException(status);

+ 6 - 0
library/python/runtime_py3/main/venv.cpp

@@ -0,0 +1,6 @@
+#include <library/cpp/resource/resource.h>
+
+extern "C" int IsYaIdeVenv() {
+    TString dummy;
+    return NResource::FindExact("YA_IDE_VENV", &dummy);
+}