diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-05-16 15:38:16 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-16 15:38:16 (GMT) |
commit | 9ef5dcaa0b3c7c7ba28dbb3ec0c9507d9d05e3a9 (patch) | |
tree | 56b9b45660cc83960c2752e22ee47090632ebb09 /Programs | |
parent | ae239f6b0626e926613a4a1dbafa323bd41fec32 (diff) | |
download | cpython-9ef5dcaa0b3c7c7ba28dbb3ec0c9507d9d05e3a9.zip cpython-9ef5dcaa0b3c7c7ba28dbb3ec0c9507d9d05e3a9.tar.gz cpython-9ef5dcaa0b3c7c7ba28dbb3ec0c9507d9d05e3a9.tar.bz2 |
bpo-36763: Add _Py_InitializeMain() (GH-13362)
* Add a private _Py_InitializeMain() function.
* Add again _PyCoreConfig._init_main.
* _Py_InitializeFromConfig() now uses _init_main to decide
if _Py_InitializeMainInterpreter() should be called.
* _PyCoreConfig: rename _frozen to pathconfig_warnings, its value is
now the opposite of Py_FrozenFlag.
* Add an unit test for _init_main=0 and _Py_InitializeMain().
Diffstat (limited to 'Programs')
-rw-r--r-- | Programs/_freeze_importlib.c | 3 | ||||
-rw-r--r-- | Programs/_testembed.c | 62 |
2 files changed, 52 insertions, 13 deletions
diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 4b2ed70..8cbbe17 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -83,7 +83,8 @@ main(int argc, char *argv[]) config.program_name = L"./_freeze_importlib"; /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; - config._frozen = 1; + config.pathconfig_warnings = 0; + config._init_main = 0; _PyInitError err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 6eee2e8..4ee2cd1 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -757,34 +757,71 @@ fail: } -static int test_run_main(void) +wchar_t *init_main_argv[] = { + L"python3", L"-c", + (L"import _testinternalcapi, json; " + L"print(json.dumps(_testinternalcapi.get_configs()))"), + L"arg2"}; + + +static void configure_init_main(_PyCoreConfig *config) +{ + config->argv.length = Py_ARRAY_LENGTH(init_main_argv); + config->argv.items = init_main_argv; + config->program_name = L"./python3"; +} + + +static int test_init_run_main(void) { _PyCoreConfig config = _PyCoreConfig_INIT; + configure_init_main(&config); + + _PyInitError err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + return _Py_RunMain(); +} - wchar_t *argv[] = {L"python3", L"-c", - (L"import sys; " - L"print(f'_Py_RunMain(): sys.argv={sys.argv}')"), - L"arg2"}; - config.argv.length = Py_ARRAY_LENGTH(argv); - config.argv.items = argv; - config.program_name = L"./python3"; + +static int test_init_main(void) +{ + _PyCoreConfig config = _PyCoreConfig_INIT; + configure_init_main(&config); + config._init_main = 0; _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } + /* sys.stdout don't exist yet: it is created by _Py_InitializeMain() */ + int res = PyRun_SimpleString( + "import sys; " + "print('Run Python code before _Py_InitializeMain', " + "file=sys.stderr)"); + if (res < 0) { + exit(1); + } + + err = _Py_InitializeMain(); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + return _Py_RunMain(); } -static int test_run_main_config(void) +static int test_run_main(void) { _PyCoreConfig config = _PyCoreConfig_INIT; wchar_t *argv[] = {L"python3", L"-c", - (L"import _testinternalcapi, json; " - L"print(json.dumps(_testinternalcapi.get_configs()))"), + (L"import sys; " + L"print(f'_Py_RunMain(): sys.argv={sys.argv}')"), L"arg2"}; config.argv.length = Py_ARRAY_LENGTH(argv); config.argv.items = argv; @@ -837,8 +874,9 @@ static struct TestCase TestCases[] = { { "preinit_isolated1", test_preinit_isolated1 }, { "preinit_isolated2", test_preinit_isolated2 }, { "init_read_set", test_init_read_set }, + { "init_run_main", test_init_run_main }, + { "init_main", test_init_main }, { "run_main", test_run_main }, - { "run_main_config", test_run_main_config }, { NULL, NULL } }; |