mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-44131: Py_FrozenMain() uses PyConfig_SetBytesArgv() (GH-26201)
Moreover, Py_FrozenMain() relies on Py_InitializeFromConfig() to handle the PYTHONUNBUFFERED environment variable and configure C stdio streams like stdout (make the stream unbuffered).
This commit is contained in:
parent
4d396e7d79
commit
58a993957a
4 changed files with 51 additions and 100 deletions
|
@ -20,74 +20,28 @@ Py_FrozenMain(int argc, char **argv)
|
|||
Py_ExitStatusException(status);
|
||||
}
|
||||
|
||||
const char *p;
|
||||
int i, n, sts = 1;
|
||||
int inspect = 0;
|
||||
int unbuffered = 0;
|
||||
char *oldloc = NULL;
|
||||
wchar_t **argv_copy = NULL;
|
||||
/* We need a second copies, as Python might modify the first one. */
|
||||
wchar_t **argv_copy2 = NULL;
|
||||
|
||||
if (argc > 0) {
|
||||
argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
|
||||
argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
|
||||
if (!argv_copy || !argv_copy2) {
|
||||
fprintf(stderr, "out of memory\n");
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
PyConfig config;
|
||||
PyConfig_InitPythonConfig(&config);
|
||||
config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */
|
||||
// Suppress errors from getpath.c
|
||||
config.pathconfig_warnings = 0;
|
||||
// Don't parse command line options like -E
|
||||
config.parse_argv = 0;
|
||||
|
||||
status = PyConfig_SetBytesArgv(&config, argc, argv);
|
||||
if (PyStatus_Exception(status)) {
|
||||
PyConfig_Clear(&config);
|
||||
Py_ExitStatusException(status);
|
||||
}
|
||||
|
||||
const char *p;
|
||||
int inspect = 0;
|
||||
if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') {
|
||||
inspect = 1;
|
||||
}
|
||||
if ((p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') {
|
||||
unbuffered = 1;
|
||||
}
|
||||
|
||||
if (unbuffered) {
|
||||
setbuf(stdin, (char *)NULL);
|
||||
setbuf(stdout, (char *)NULL);
|
||||
setbuf(stderr, (char *)NULL);
|
||||
}
|
||||
|
||||
oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
|
||||
if (!oldloc) {
|
||||
fprintf(stderr, "out of memory\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
for (i = 0; i < argc; i++) {
|
||||
argv_copy[i] = Py_DecodeLocale(argv[i], NULL);
|
||||
argv_copy2[i] = argv_copy[i];
|
||||
if (!argv_copy[i]) {
|
||||
fprintf(stderr,
|
||||
"Unable to decode the command line argument #%i\n",
|
||||
i + 1);
|
||||
argc = i;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
setlocale(LC_ALL, oldloc);
|
||||
PyMem_RawFree(oldloc);
|
||||
oldloc = NULL;
|
||||
|
||||
#ifdef MS_WINDOWS
|
||||
PyInitFrozenExtensions();
|
||||
#endif /* MS_WINDOWS */
|
||||
if (argc >= 1) {
|
||||
status = PyConfig_SetString(&config, &config.program_name,
|
||||
argv_copy[0]);
|
||||
if (PyStatus_Exception(status)) {
|
||||
PyConfig_Clear(&config);
|
||||
Py_ExitStatusException(status);
|
||||
}
|
||||
}
|
||||
|
||||
status = Py_InitializeFromConfig(&config);
|
||||
PyConfig_Clear(&config);
|
||||
|
@ -104,9 +58,8 @@ Py_FrozenMain(int argc, char **argv)
|
|||
Py_GetVersion(), Py_GetCopyright());
|
||||
}
|
||||
|
||||
PySys_SetArgv(argc, argv_copy);
|
||||
|
||||
n = PyImport_ImportFrozenModule("__main__");
|
||||
int sts = 1;
|
||||
int n = PyImport_ImportFrozenModule("__main__");
|
||||
if (n == 0) {
|
||||
Py_FatalError("the __main__ module is not frozen");
|
||||
}
|
||||
|
@ -128,14 +81,5 @@ Py_FrozenMain(int argc, char **argv)
|
|||
if (Py_FinalizeEx() < 0) {
|
||||
sts = 120;
|
||||
}
|
||||
|
||||
error:
|
||||
PyMem_RawFree(argv_copy);
|
||||
if (argv_copy2) {
|
||||
for (i = 0; i < argc; i++)
|
||||
PyMem_RawFree(argv_copy2[i]);
|
||||
PyMem_RawFree(argv_copy2);
|
||||
}
|
||||
PyMem_RawFree(oldloc);
|
||||
return sts;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue