Created
July 21, 2017 05:21
-
-
Save bhavishyagopesh/376b52ffb71e6b639872eedc5c07b5a9 to your computer and use it in GitHub Desktop.
Py_InitializeEx Definition
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void | |
Py_InitializeEx(int install_sigs) | |
{ | |
PyInterpreterState *interp; | |
PyThreadState *tstate; | |
PyObject *bimod, *sysmod; | |
char *p; | |
char *icodeset = NULL; /* On Windows, input codeset may theoretically | |
differ from output codeset. */ | |
char *codeset = NULL; | |
char *errors = NULL; | |
int free_codeset = 0; | |
int overridden = 0; | |
PyObject *sys_stream; | |
#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) | |
char *saved_locale, *loc_codeset; | |
#endif | |
#ifdef MS_WINDOWS | |
char ibuf[128]; | |
char buf[128]; | |
#endif | |
extern void _Py_ReadyTypes(void); | |
if (initialized) | |
return; | |
initialized = 1; | |
if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0') | |
Py_DebugFlag = add_flag(Py_DebugFlag, p); | |
if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0') | |
Py_VerboseFlag = add_flag(Py_VerboseFlag, p); | |
if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0') | |
Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); | |
if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') | |
Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); | |
/* The variable is only tested for existence here; _PyRandom_Init will | |
check its value further. */ | |
if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') | |
Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); | |
_PyRandom_Init(); | |
interp = PyInterpreterState_New(); | |
if (interp == NULL) | |
Py_FatalError("Py_Initialize: can't make first interpreter"); | |
tstate = PyThreadState_New(interp); | |
if (tstate == NULL) | |
Py_FatalError("Py_Initialize: can't make first thread"); | |
(void) PyThreadState_Swap(tstate); | |
_Py_ReadyTypes(); | |
if (!_PyFrame_Init()) | |
Py_FatalError("Py_Initialize: can't init frames"); | |
if (!_PyInt_Init()) | |
Py_FatalError("Py_Initialize: can't init ints"); | |
if (!_PyLong_Init()) | |
Py_FatalError("Py_Initialize: can't init longs"); | |
if (!PyByteArray_Init()) | |
Py_FatalError("Py_Initialize: can't init bytearray"); | |
_PyFloat_Init(); | |
interp->modules = PyDict_New(); | |
if (interp->modules == NULL) | |
Py_FatalError("Py_Initialize: can't make modules dictionary"); | |
interp->modules_reloading = PyDict_New(); | |
if (interp->modules_reloading == NULL) | |
Py_FatalError("Py_Initialize: can't make modules_reloading dictionary"); | |
#ifdef Py_USING_UNICODE | |
/* Init Unicode implementation; relies on the codec registry */ | |
_PyUnicode_Init(); | |
#endif | |
bimod = _PyBuiltin_Init(); | |
if (bimod == NULL) | |
Py_FatalError("Py_Initialize: can't initialize __builtin__"); | |
interp->builtins = PyModule_GetDict(bimod); | |
if (interp->builtins == NULL) | |
Py_FatalError("Py_Initialize: can't initialize builtins dict"); | |
Py_INCREF(interp->builtins); | |
sysmod = _PySys_Init(); | |
if (sysmod == NULL) | |
Py_FatalError("Py_Initialize: can't initialize sys"); | |
interp->sysdict = PyModule_GetDict(sysmod); | |
if (interp->sysdict == NULL) | |
Py_FatalError("Py_Initialize: can't initialize sys dict"); | |
Py_INCREF(interp->sysdict); | |
_PyImport_FixupExtension("sys", "sys"); | |
PySys_SetPath(Py_GetPath()); | |
PyDict_SetItemString(interp->sysdict, "modules", | |
interp->modules); | |
_PyImport_Init(); | |
/* initialize builtin exceptions */ | |
_PyExc_Init(); | |
_PyImport_FixupExtension("exceptions", "exceptions"); | |
/* phase 2 of builtins */ | |
_PyImport_FixupExtension("__builtin__", "__builtin__"); | |
_PyImportHooks_Init(); | |
if (install_sigs) | |
initsigs(); /* Signal handling stuff, including initintr() */ | |
/* Initialize warnings. */ | |
_PyWarnings_Init(); | |
if (PySys_HasWarnOptions()) { | |
PyObject *warnings_module = PyImport_ImportModule("warnings"); | |
if (!warnings_module) | |
PyErr_Clear(); | |
Py_XDECREF(warnings_module); | |
} | |
initmain(); /* Module __main__ */ | |
/* auto-thread-state API, if available */ | |
#ifdef WITH_THREAD | |
_PyGILState_Init(interp, tstate); | |
#endif /* WITH_THREAD */ | |
if (!Py_NoSiteFlag) | |
initsite(); /* Module site */ | |
if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') { | |
p = icodeset = codeset = strdup(p); | |
free_codeset = 1; | |
errors = strchr(p, ':'); | |
if (errors) { | |
*errors = '\0'; | |
errors++; | |
} | |
overridden = 1; | |
} | |
#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) | |
/* On Unix, set the file system encoding according to the | |
user's preference, if the CODESET names a well-known | |
Python codec, and Py_FileSystemDefaultEncoding isn't | |
initialized by other means. Also set the encoding of | |
stdin and stdout if these are terminals, unless overridden. */ | |
if (!overridden || !Py_FileSystemDefaultEncoding) { | |
saved_locale = strdup(setlocale(LC_CTYPE, NULL)); | |
setlocale(LC_CTYPE, ""); | |
loc_codeset = nl_langinfo(CODESET); | |
if (loc_codeset && *loc_codeset) { | |
PyObject *enc = PyCodec_Encoder(loc_codeset); | |
if (enc) { | |
loc_codeset = strdup(loc_codeset); | |
Py_DECREF(enc); | |
} else { | |
if (PyErr_ExceptionMatches(PyExc_LookupError)) { | |
PyErr_Clear(); | |
loc_codeset = NULL; | |
} else { | |
PyErr_Print(); | |
exit(1); | |
} | |
} | |
} else | |
loc_codeset = NULL; | |
setlocale(LC_CTYPE, saved_locale); | |
free(saved_locale); | |
if (!overridden) { | |
codeset = icodeset = loc_codeset; | |
free_codeset = 1; | |
} | |
/* Initialize Py_FileSystemDefaultEncoding from | |
locale even if PYTHONIOENCODING is set. */ | |
if (!Py_FileSystemDefaultEncoding) { | |
Py_FileSystemDefaultEncoding = loc_codeset; | |
if (!overridden) | |
free_codeset = 0; | |
} | |
} | |
#endif | |
#ifdef MS_WINDOWS | |
if (!overridden) { | |
icodeset = ibuf; | |
codeset = buf; | |
sprintf(ibuf, "cp%d", GetConsoleCP()); | |
sprintf(buf, "cp%d", GetConsoleOutputCP()); | |
} | |
#endif | |
if (codeset) { | |
sys_stream = PySys_GetObject("stdin"); | |
if ((overridden || isatty_no_error(sys_stream)) && | |
PyFile_Check(sys_stream)) { | |
if (!PyFile_SetEncodingAndErrors(sys_stream, icodeset, errors)) | |
Py_FatalError("Cannot set codeset of stdin"); | |
} | |
sys_stream = PySys_GetObject("stdout"); | |
if ((overridden || isatty_no_error(sys_stream)) && | |
PyFile_Check(sys_stream)) { | |
if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) | |
Py_FatalError("Cannot set codeset of stdout"); | |
} | |
sys_stream = PySys_GetObject("stderr"); | |
if ((overridden || isatty_no_error(sys_stream)) && | |
PyFile_Check(sys_stream)) { | |
if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) | |
Py_FatalError("Cannot set codeset of stderr"); | |
} | |
if (free_codeset) | |
free(codeset); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment