}
-int
+static int
_Py_SetArgcArgv(int argc, wchar_t * const *argv)
{
int res;
CLEAR(config->filesystem_errors);
CLEAR(config->stdio_encoding);
CLEAR(config->stdio_errors);
+ CLEAR(config->run_command);
+ CLEAR(config->run_module);
+ CLEAR(config->run_filename);
#undef CLEAR
#undef CLEAR_WSTRLIST
}
void
_PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config)
{
- _PyPreConfig_SetGlobalConfig(&config->preconfig);
-
#define COPY_FLAG(ATTR, VAR) \
if (config->ATTR != -1) { \
VAR = config->ATTR; \
return _Py_INIT_OK();
}
+
static const wchar_t*
config_get_xoption(const _PyCoreConfig *config, wchar_t *name)
{
static _PyInitError
config_read_env_vars(_PyCoreConfig *config)
{
-#define get_env_flag(CONFIG, ATTR, NAME) \
- _Py_get_env_flag(&(CONFIG)->preconfig, (ATTR), (NAME))
+ _PyPreConfig *preconfig = &config->preconfig;
/* Get environment variables */
- get_env_flag(config, &config->parser_debug, "PYTHONDEBUG");
- get_env_flag(config, &config->verbose, "PYTHONVERBOSE");
- get_env_flag(config, &config->optimization_level, "PYTHONOPTIMIZE");
- get_env_flag(config, &config->inspect, "PYTHONINSPECT");
+ _Py_get_env_flag(preconfig, &config->parser_debug, "PYTHONDEBUG");
+ _Py_get_env_flag(preconfig, &config->verbose, "PYTHONVERBOSE");
+ _Py_get_env_flag(preconfig, &config->optimization_level, "PYTHONOPTIMIZE");
+ _Py_get_env_flag(preconfig, &config->inspect, "PYTHONINSPECT");
int dont_write_bytecode = 0;
- get_env_flag(config, &dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
+ _Py_get_env_flag(preconfig, &dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
if (dont_write_bytecode) {
config->write_bytecode = 0;
}
int no_user_site_directory = 0;
- get_env_flag(config, &no_user_site_directory, "PYTHONNOUSERSITE");
+ _Py_get_env_flag(preconfig, &no_user_site_directory, "PYTHONNOUSERSITE");
if (no_user_site_directory) {
config->user_site_directory = 0;
}
int unbuffered_stdio = 0;
- get_env_flag(config, &unbuffered_stdio, "PYTHONUNBUFFERED");
+ _Py_get_env_flag(preconfig, &unbuffered_stdio, "PYTHONUNBUFFERED");
if (unbuffered_stdio) {
config->buffered_stdio = 0;
}
#ifdef MS_WINDOWS
- get_env_flag(config, &config->legacy_windows_stdio,
+ _Py_get_env_flag(preconfig, &config->legacy_windows_stdio,
"PYTHONLEGACYWINDOWSSTDIO");
#endif
}
return _Py_INIT_OK();
-
-#undef get_env_flag
}
}
-/* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE
- locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538).
-
- Read the configuration from:
+/* Read the configuration into _PyCoreConfig from:
* Environment variables
* Py_xxx global configuration variables
/* Write the configuration:
- - coerce the LC_CTYPE locale (PEP 538)
- - UTF-8 mode (PEP 540)
- set Py_xxx global configuration variables
- initialize C standard streams (stdin, stdout, stderr) */
void
}
-/* Read the configuration into _PyCoreConfig and initialize the LC_CTYPE
- locale: enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538).
-
- Read the configuration from:
+/* Read the configuration into _PyCoreConfig from:
* Command line arguments
* Environment variables
}
+static _PyInitError
+get_ctype_locale(char **locale_p)
+{
+ const char *loc = setlocale(LC_CTYPE, NULL);
+ if (loc == NULL) {
+ return _Py_INIT_ERR("failed to LC_CTYPE locale");
+ }
+
+ char *copy = _PyMem_RawStrdup(loc);
+ if (copy == NULL) {
+ return _Py_INIT_NO_MEMORY();
+ }
+
+ *locale_p = copy;
+ return _Py_INIT_OK();
+}
+
+
+/* Read the configuration from:
+
+ - environment variables
+ - Py_xxx global configuration variables
+ - the LC_CTYPE locale
+
+ See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */
_PyInitError
_PyPreConfig_Read(_PyPreConfig *config)
{
- return preconfig_read(config, NULL);
+ _PyInitError err;
+ char *old_loc;
+
+ err = get_ctype_locale(&old_loc);
+ if (_Py_INIT_FAILED(err)) {
+ return err;
+ }
+
+ /* Set LC_CTYPE to the user preferred locale */
+ _Py_SetLocaleFromEnv(LC_CTYPE);
+
+ err = preconfig_read(config, NULL);
+
+ setlocale(LC_CTYPE, old_loc);
+
+ return err;
}
}
-/* Read the preconfiguration. */
+/* Read the configuration from:
+
+ - command line arguments
+ - environment variables
+ - Py_xxx global configuration variables
+ - the LC_CTYPE locale
+
+ See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */
_PyInitError
_PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args)
{
int locale_coerced = 0;
int loops = 0;
- /* copy LC_CTYPE locale */
- const char *loc = setlocale(LC_CTYPE, NULL);
- if (loc == NULL) {
- err = _Py_INIT_ERR("failed to LC_CTYPE locale");
- goto done;
- }
- init_ctype_locale = _PyMem_RawStrdup(loc);
- if (init_ctype_locale == NULL) {
- err = _Py_INIT_NO_MEMORY();
+ err = get_ctype_locale(&init_ctype_locale);
+ if (_Py_INIT_FAILED(err)) {
goto done;
}
}
-/* Write the pre-configuration.
+/* Write the pre-configuration:
+
+ - set the memory allocators
+ - set Py_xxx global configuration variables
+ - set the LC_CTYPE locale (coerce C locale, PEP 538) and set the UTF-8 mode
+ (PEP 540)
If the memory allocator is changed, config is re-allocated with new
- allocator. So calling _PyPreConfig_Clear(config) is safe after this call. */
+ allocator. So calling _PyPreConfig_Clear(config) is safe after this call.
+
+ Do nothing if called after Py_Initialize(): ignore the new
+ pre-configuration. */
_PyInitError
_PyPreConfig_Write(_PyPreConfig *config)
{
if (_PyRuntime.core_initialized) {
- /* bpo-34008: Calling Py_Main() after Py_Initialize() ignores
+ /* bpo-34008: Calling this functions after Py_Initialize() ignores
the new configuration. */
return _Py_INIT_OK();
}