bpo-34008: Allow to call Py_Main() after Py_Initialize() (GH-8043) (GH-8352)

Py_Main() can again be called after Py_Initialize(), as in Python
3.6. The new configuration is ignored, except of
_PyMainInterpreterConfig.argv which is used to update sys.argv.
(cherry picked from commit fb47bca9ee2d07ce96df94b4e4abafd11826eb01)

Co-authored-by: Victor Stinner <vstinner@redhat.com>
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index fdb759f..219a465 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -775,6 +775,22 @@
     return _Py_INIT_OK();
 }
 
+/* Py_Initialize() has already been called: update the main interpreter
+   configuration. Example of bpo-34008: Py_Main() called after
+   Py_Initialize(). */
+static _PyInitError
+_Py_ReconfigureMainInterpreter(PyInterpreterState *interp,
+                               const _PyMainInterpreterConfig *config)
+{
+    if (config->argv != NULL) {
+        int res = PyDict_SetItemString(interp->sysdict, "argv", config->argv);
+        if (res < 0) {
+            return _Py_INIT_ERR("fail to set sys.argv");
+        }
+    }
+    return _Py_INIT_OK();
+}
+
 /* Update interpreter state based on supplied configuration settings
  *
  * After calling this function, most of the restrictions on the interpreter
@@ -796,9 +812,6 @@
     if (!_PyRuntime.core_initialized) {
         return _Py_INIT_ERR("runtime core not initialized");
     }
-    if (_PyRuntime.initialized) {
-        return _Py_INIT_ERR("main interpreter already initialized");
-    }
 
     /* Get current thread state and interpreter pointer */
     tstate = PyThreadState_GET();
@@ -813,6 +826,10 @@
         return _Py_INIT_ERR("failed to copy main interpreter config");
     }
 
+    if (_PyRuntime.initialized) {
+        return _Py_ReconfigureMainInterpreter(interp, config);
+    }
+
     if (interp->core_config._disable_importlib) {
         /* Special mode for freeze_importlib: run with no import system
          *