Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Include/cpython/coreconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,9 @@ typedef struct {
If set to -1 (default), inherit Py_FrozenFlag value. */
int _frozen;

/* If non-zero, use "main" Python initialization */
int _init_main;

} _PyCoreConfig;

#ifdef MS_WINDOWS
Expand Down Expand Up @@ -398,7 +401,8 @@ typedef struct {
.buffered_stdio = -1, \
._install_importlib = 1, \
._check_hash_pycs_mode = "default", \
._frozen = -1}
._frozen = -1, \
._init_main = 1}
/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */


Expand Down
6 changes: 2 additions & 4 deletions Include/cpython/pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig(
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig(
const _PyCoreConfig *coreconfig);

PyAPI_FUNC(_PyInitError) _Py_InitializeCore(
const _PyCoreConfig *config,
PyInterpreterState **interp);
PyAPI_FUNC(int) _Py_IsCoreInitialized(void);


Expand All @@ -32,7 +29,8 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(
/* Initialization and finalization */

PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig(
const _PyCoreConfig *config);
const _PyCoreConfig *config,
PyInterpreterState **interp_p);
PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err);

/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level
Expand Down
1 change: 1 addition & 0 deletions Lib/test/test_embed.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
'_install_importlib': 1,
'_check_hash_pycs_mode': 'default',
'_frozen': 0,
'_init_main': 1,
}
if MS_WINDOWS:
DEFAULT_PRE_CONFIG.update({
Expand Down
29 changes: 10 additions & 19 deletions Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,19 +53,6 @@ pymain_init_preconfig(const _PyArgv *args)
}


static _PyInitError
pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args,
PyInterpreterState **interp_p)
{
_PyInitError err = _PyCoreConfig_Read(config, args);
if (_Py_INIT_FAILED(err)) {
return err;
}

return _Py_InitializeCore(config, interp_p);
}


static _PyInitError
pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
{
Expand All @@ -91,18 +78,22 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
}

_PyCoreConfig config = _PyCoreConfig_INIT;
err = pymain_init_coreconfig(&config, args, interp_p);
_PyCoreConfig_Clear(&config);

err = _PyCoreConfig_Read(&config, args);
if (_Py_INIT_FAILED(err)) {
return err;
goto done;
}

err = _Py_InitializeMainInterpreter(*interp_p);
err = _Py_InitializeFromConfig(&config, interp_p);
if (_Py_INIT_FAILED(err)) {
return err;
goto done;
}

return _Py_INIT_OK();
err = _Py_INIT_OK();

done:
_PyCoreConfig_Clear(&config);
return err;
}


Expand Down
3 changes: 2 additions & 1 deletion Programs/_freeze_importlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,9 @@ main(int argc, char *argv[])
/* Don't install importlib, since it could execute outdated bytecode. */
config._install_importlib = 0;
config._frozen = 1;
config._init_main = 0;

_PyInitError err = _Py_InitializeFromConfig(&config);
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
memory: program_name is a constant string. */
if (_Py_INIT_FAILED(err)) {
Expand Down
10 changes: 5 additions & 5 deletions Programs/_testembed.c
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ static int test_init_from_config(void)
Py_FrozenFlag = 0;
config._frozen = 1;

err = _Py_InitializeFromConfig(&config);
err = _Py_InitializeFromConfig(&config, NULL);
/* Don't call _PyCoreConfig_Clear() since all strings are static */
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
Expand Down Expand Up @@ -638,7 +638,7 @@ static int test_init_isolated(void)
config.program_name = L"./_testembed";

test_init_env_dev_mode_putenvs();
err = _Py_InitializeFromConfig(&config);
err = _Py_InitializeFromConfig(&config, NULL);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}
Expand Down Expand Up @@ -669,7 +669,7 @@ static int test_preinit_isolated1(void)
config.program_name = L"./_testembed";

test_init_env_dev_mode_putenvs();
err = _Py_InitializeFromConfig(&config);
err = _Py_InitializeFromConfig(&config, NULL);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}
Expand Down Expand Up @@ -706,7 +706,7 @@ static int test_preinit_isolated2(void)
config.program_name = L"./_testembed";

test_init_env_dev_mode_putenvs();
err = _Py_InitializeFromConfig(&config);
err = _Py_InitializeFromConfig(&config, NULL);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}
Expand All @@ -723,7 +723,7 @@ static int test_init_dev_mode(void)
putenv("PYTHONMALLOC=");
config.dev_mode = 1;
config.program_name = L"./_testembed";
_PyInitError err = _Py_InitializeFromConfig(&config);
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}
Expand Down
2 changes: 2 additions & 0 deletions Python/coreconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
COPY_WSTR_ATTR(run_filename);
COPY_ATTR(_check_hash_pycs_mode);
COPY_ATTR(_frozen);
COPY_ATTR(_init_main);

#undef COPY_ATTR
#undef COPY_STR_ATTR
Expand Down Expand Up @@ -715,6 +716,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)
SET_ITEM_INT(_install_importlib);
SET_ITEM_STR(_check_hash_pycs_mode);
SET_ITEM_INT(_frozen);
SET_ITEM_INT(_init_main);

return dict;

Expand Down
2 changes: 1 addition & 1 deletion Python/frozenmain.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ Py_FrozenMain(int argc, char **argv)
if (argc >= 1)
Py_SetProgramName(argv_copy[0]);

err = _Py_InitializeFromConfig(&config);
err = _Py_InitializeFromConfig(&config, NULL);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
memory: program_name is a constant string. */
if (_Py_INIT_FAILED(err)) {
Expand Down
24 changes: 14 additions & 10 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ _Py_SetLocaleFromEnv(int category)
/* Global initializations. Can be undone by Py_Finalize(). Don't
call this twice without an intervening Py_Finalize() call.

Every call to _Py_InitializeCore, Py_Initialize or Py_InitializeEx
Every call to _Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx
must have a corresponding call to Py_Finalize.

Locking: you must hold the interpreter lock while calling these APIs.
Expand Down Expand Up @@ -832,7 +832,7 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config,
* to the Python C API (unless the API is explicitly listed as being
* safe to call without calling Py_Initialize first)
*/
_PyInitError
static _PyInitError
_Py_InitializeCore(const _PyCoreConfig *src_config,
PyInterpreterState **interp_p)
{
Expand Down Expand Up @@ -981,20 +981,27 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp)
#undef _INIT_DEBUG_PRINT

_PyInitError
_Py_InitializeFromConfig(const _PyCoreConfig *config)
_Py_InitializeFromConfig(const _PyCoreConfig *config,
PyInterpreterState **interp_p)
{
PyInterpreterState *interp = NULL;
_PyInitError err;
err = _Py_InitializeCore(config, &interp);
if (_Py_INIT_FAILED(err)) {
return err;
}
if (interp_p) {
*interp_p = interp;
}
config = &interp->core_config;

err = _Py_InitializeMainInterpreter(interp);
if (_Py_INIT_FAILED(err)) {
return err;
if (config->_init_main) {
err = _Py_InitializeMainInterpreter(interp);
if (_Py_INIT_FAILED(err)) {
return err;
}
}

return _Py_INIT_OK();
}

Expand All @@ -1007,13 +1014,10 @@ Py_InitializeEx(int install_sigs)
return;
}

_PyInitError err;
_PyCoreConfig config = _PyCoreConfig_INIT;
config.install_signal_handlers = install_sigs;

err = _Py_InitializeFromConfig(&config);
_PyCoreConfig_Clear(&config);

_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}
Expand Down