| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 1220a47 commit dedaac0
10 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -43,6 +43,7 @@ Functions: | |||
| 43 | 43 | * :c:func:`Py_PreInitializeFromArgs` | |
| 44 | 44 | * :c:func:`Py_PreInitializeFromBytesArgs` | |
| 45 | 45 | * :c:func:`Py_RunMain` | |
| 46 | + * :c:func:`Py_GetArgcArgv` | ||
| 46 | 47 | ||
| 47 | 48 | The preconfiguration (``PyPreConfig`` type) is stored in | |
| 48 | 49 | ``_PyRuntime.preconfig`` and the configuration (``PyConfig`` type) is stored in | |
@@ -975,6 +976,14 @@ customized Python always running in isolated mode using | |||
| 975 | 976 | :c:func:`Py_RunMain`. | |
| 976 | 977 | ||
| 977 | 978 | ||
| 979 | + Py_GetArgcArgv() | ||
| 980 | + ---------------- | ||
| 981 | + | ||
| 982 | + .. c:function:: void Py_GetArgcArgv(int *argc, wchar_t ***argv) | ||
| 983 | + | ||
| 984 | + Get the original command line arguments, before Python modified them. | ||
| 985 | + | ||
| 986 | + | ||
| 978 | 987 | Multi-Phase Initialization Private Provisional API | |
| 979 | 988 | -------------------------------------------------- | |
| 980 | 989 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -413,6 +413,14 @@ typedef struct { | |||
| 413 | 413 | /* If non-zero, disallow threads, subprocesses, and fork. | |
| 414 | 414 | Default: 0. */ | |
| 415 | 415 | int _isolated_interpreter; | |
| 416 | + | ||
| 417 | + /* Original command line arguments. If _orig_argv is empty and _argv is | ||
| 418 | + not equal to [''], PyConfig_Read() copies the configuration 'argv' list | ||
| 419 | + into '_orig_argv' list before modifying 'argv' list (if parse_argv | ||
| 420 | + is non-zero). | ||
| 421 | + | ||
| 422 | + _PyConfig_Write() initializes Py_GetArgcArgv() to this list. */ | ||
| 423 | + PyWideStringList _orig_argv; | ||
| 416 | 424 | } PyConfig; | |
| 417 | 425 | ||
| 418 | 426 | PyAPI_FUNC(void) PyConfig_InitPythonConfig(PyConfig *config); | |
@@ -438,6 +446,14 @@ PyAPI_FUNC(PyStatus) PyConfig_SetWideStringList(PyConfig *config, | |||
| 438 | 446 | PyWideStringList *list, | |
| 439 | 447 | Py_ssize_t length, wchar_t **items); | |
| 440 | 448 | ||
| 449 | + | ||
| 450 | + /* --- Helper functions --------------------------------------- */ | ||
| 451 | + | ||
| 452 | + /* Get the original command line arguments, before Python modified them. | ||
| 453 | + | ||
| 454 | + See also PyConfig._orig_argv. */ | ||
| 455 | + PyAPI_FUNC(void) Py_GetArgcArgv(int *argc, wchar_t ***argv); | ||
| 456 | + | ||
| 441 | 457 | #ifdef __cplusplus | |
| 442 | 458 | } | |
| 443 | 459 | #endif | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -150,7 +150,7 @@ extern PyStatus _PyConfig_Copy( | |||
| 150 | 150 | PyConfig *config, | |
| 151 | 151 | const PyConfig *config2); | |
| 152 | 152 | extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); | |
| 153 | - extern void _PyConfig_Write(const PyConfig *config, | ||
| 153 | + extern PyStatus _PyConfig_Write(const PyConfig *config, | ||
| 154 | 154 | struct pyruntimestate *runtime); | |
| 155 | 155 | extern PyStatus _PyConfig_SetPyArgv( | |
| 156 | 156 | PyConfig *config, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -366,6 +366,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): | |||
| 366 | 366 | 'program_name': GET_DEFAULT_CONFIG, | |
| 367 | 367 | 'parse_argv': 0, | |
| 368 | 368 | 'argv': [""], | |
| 369 | + '_orig_argv': [], | ||
| 369 | 370 | ||
| 370 | 371 | 'xoptions': [], | |
| 371 | 372 | 'warnoptions': [], | |
@@ -737,7 +738,12 @@ def test_init_from_config(self): | |||
| 737 | 738 | ||
| 738 | 739 | 'pycache_prefix': 'conf_pycache_prefix', | |
| 739 | 740 | 'program_name': './conf_program_name', | |
| 740 | - 'argv': ['-c', 'arg2', ], | ||
| 741 | + 'argv': ['-c', 'arg2'], | ||
| 742 | + '_orig_argv': ['python3', | ||
| 743 | + '-W', 'cmdline_warnoption', | ||
| 744 | + '-X', 'cmdline_xoption', | ||
| 745 | + '-c', 'pass', | ||
| 746 | + 'arg2'], | ||
| 741 | 747 | 'parse_argv': 1, | |
| 742 | 748 | 'xoptions': [ | |
| 743 | 749 | 'config_xoption1=3', | |
@@ -864,6 +870,7 @@ def test_preinit_parse_argv(self): | |||
| 864 | 870 | } | |
| 865 | 871 | config = { | |
| 866 | 872 | 'argv': ['script.py'], | |
| 873 | + '_orig_argv': ['python3', '-X', 'dev', 'script.py'], | ||
| 867 | 874 | 'run_filename': os.path.abspath('script.py'), | |
| 868 | 875 | 'dev_mode': 1, | |
| 869 | 876 | 'faulthandler': 1, | |
@@ -878,9 +885,14 @@ def test_preinit_dont_parse_argv(self): | |||
| 878 | 885 | preconfig = { | |
| 879 | 886 | 'isolated': 0, | |
| 880 | 887 | } | |
| 888 | + argv = ["python3", | ||
| 889 | + "-E", "-I", | ||
| 890 | + "-X", "dev", | ||
| 891 | + "-X", "utf8", | ||
| 892 | + "script.py"] | ||
| 881 | 893 | config = { | |
| 882 | - 'argv': ["python3", "-E", "-I", | ||
| 883 | - "-X", "dev", "-X", "utf8", "script.py"], | ||
| 894 | + 'argv': argv, | ||
| 895 | + '_orig_argv': argv, | ||
| 884 | 896 | 'isolated': 0, | |
| 885 | 897 | } | |
| 886 | 898 | self.check_all_configs("test_preinit_dont_parse_argv", config, preconfig, | |
@@ -959,6 +971,9 @@ def test_init_sys_add(self): | |||
| 959 | 971 | 'ignore:::sysadd_warnoption', | |
| 960 | 972 | 'ignore:::config_warnoption', | |
| 961 | 973 | ], | |
| 974 | + '_orig_argv': ['python3', | ||
| 975 | + '-W', 'ignore:::cmdline_warnoption', | ||
| 976 | + '-X', 'cmdline_xoption'], | ||
| 962 | 977 | } | |
| 963 | 978 | self.check_all_configs("test_init_sys_add", config, api=API_PYTHON) | |
| 964 | 979 | ||
@@ -967,6 +982,7 @@ def test_init_run_main(self): | |||
| 967 | 982 | 'print(json.dumps(_testinternalcapi.get_configs()))') | |
| 968 | 983 | config = { | |
| 969 | 984 | 'argv': ['-c', 'arg2'], | |
| 985 | + '_orig_argv': ['python3', '-c', code, 'arg2'], | ||
| 970 | 986 | 'program_name': './python3', | |
| 971 | 987 | 'run_command': code + '\n', | |
| 972 | 988 | 'parse_argv': 1, | |
@@ -978,6 +994,9 @@ def test_init_main(self): | |||
| 978 | 994 | 'print(json.dumps(_testinternalcapi.get_configs()))') | |
| 979 | 995 | config = { | |
| 980 | 996 | 'argv': ['-c', 'arg2'], | |
| 997 | + '_orig_argv': ['python3', | ||
| 998 | + '-c', code, | ||
| 999 | + 'arg2'], | ||
| 981 | 1000 | 'program_name': './python3', | |
| 982 | 1001 | 'run_command': code + '\n', | |
| 983 | 1002 | 'parse_argv': 1, | |
@@ -991,6 +1010,7 @@ def test_init_parse_argv(self): | |||
| 991 | 1010 | config = { | |
| 992 | 1011 | 'parse_argv': 1, | |
| 993 | 1012 | 'argv': ['-c', 'arg1', '-v', 'arg3'], | |
| 1013 | + '_orig_argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], | ||
| 994 | 1014 | 'program_name': './argv0', | |
| 995 | 1015 | 'run_command': 'pass\n', | |
| 996 | 1016 | 'use_environment': 0, | |
@@ -1004,6 +1024,7 @@ def test_init_dont_parse_argv(self): | |||
| 1004 | 1024 | config = { | |
| 1005 | 1025 | 'parse_argv': 0, | |
| 1006 | 1026 | 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], | |
| 1027 | + '_orig_argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], | ||
| 1007 | 1028 | 'program_name': './argv0', | |
| 1008 | 1029 | } | |
| 1009 | 1030 | self.check_all_configs("test_init_dont_parse_argv", config, pre_config, | |
@@ -1291,10 +1312,17 @@ def test_init_warnoptions(self): | |||
| 1291 | 1312 | 'faulthandler': 1, | |
| 1292 | 1313 | 'bytes_warning': 1, | |
| 1293 | 1314 | 'warnoptions': warnoptions, | |
| 1315 | + '_orig_argv': ['python3', | ||
| 1316 | + '-Wignore:::cmdline1', | ||
| 1317 | + '-Wignore:::cmdline2'], | ||
| 1294 | 1318 | } | |
| 1295 | 1319 | self.check_all_configs("test_init_warnoptions", config, preconfig, | |
| 1296 | 1320 | api=API_PYTHON) | |
| 1297 | 1321 | ||
| 1322 | + def test_get_argc_argv(self): | ||
| 1323 | + self.run_embedded_interpreter("test_get_argc_argv") | ||
| 1324 | + # ignore output | ||
| 1325 | + | ||
| 1298 | 1326 | ||
| 1299 | 1327 | class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): | |
| 1300 | 1328 | def test_open_code_hook(self): | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,3 @@ | |||
| 1 | + Export explicitly the :c:func:`Py_GetArgcArgv` function to the C API and | ||
| 2 | + document the function. Previously, it was exported implicitly which no | ||
| 3 | + longer works since Python is built with ``-fvisibility=hidden``. | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -734,6 +734,7 @@ EXPORTS | |||
| 734 | 734 | Py_FinalizeEx=python39.Py_FinalizeEx | |
| 735 | 735 | Py_GenericAlias=python39.Py_GenericAlias | |
| 736 | 736 | Py_GenericAliasType=python39.Py_GenericAliasType | |
| 737 | + Py_GetArgcArgv=python39.Py_GetArgcArgv | ||
| 737 | 738 | Py_GetBuildInfo=python39.Py_GetBuildInfo | |
| 738 | 739 | Py_GetCompiler=python39.Py_GetCompiler | |
| 739 | 740 | Py_GetCopyright=python39.Py_GetCopyright | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1326,6 +1326,7 @@ static int test_init_read_set(void) | |||
| 1326 | 1326 | return 0; | |
| 1327 | 1327 | ||
| 1328 | 1328 | fail: | |
| 1329 | + PyConfig_Clear(&config); | ||
| 1329 | 1330 | Py_ExitStatusException(status); | |
| 1330 | 1331 | } | |
| 1331 | 1332 | ||
@@ -1584,6 +1585,46 @@ static int test_run_main(void) | |||
| 1584 | 1585 | } | |
| 1585 | 1586 | ||
| 1586 | 1587 | ||
| 1588 | + static int test_get_argc_argv(void) | ||
| 1589 | + { | ||
| 1590 | + PyConfig config; | ||
| 1591 | + PyConfig_InitPythonConfig(&config); | ||
| 1592 | + | ||
| 1593 | + wchar_t *argv[] = {L"python3", L"-c", | ||
| 1594 | + (L"import sys; " | ||
| 1595 | + L"print(f'Py_RunMain(): sys.argv={sys.argv}')"), | ||
| 1596 | + L"arg2"}; | ||
| 1597 | + config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); | ||
| 1598 | + config_set_string(&config, &config.program_name, L"./python3"); | ||
| 1599 | + | ||
| 1600 | + // Calling PyConfig_Read() twice must not change Py_GetArgcArgv() result. | ||
| 1601 | + // The second call is done by Py_InitializeFromConfig(). | ||
| 1602 | + PyStatus status = PyConfig_Read(&config); | ||
| 1603 | + if (PyStatus_Exception(status)) { | ||
| 1604 | + PyConfig_Clear(&config); | ||
| 1605 | + Py_ExitStatusException(status); | ||
| 1606 | + } | ||
| 1607 | + | ||
| 1608 | + init_from_config_clear(&config); | ||
| 1609 | + | ||
| 1610 | + int get_argc; | ||
| 1611 | + wchar_t **get_argv; | ||
| 1612 | + Py_GetArgcArgv(&get_argc, &get_argv); | ||
| 1613 | + printf("argc: %i\n", get_argc); | ||
| 1614 | + assert(get_argc == Py_ARRAY_LENGTH(argv)); | ||
| 1615 | + for (int i=0; i < get_argc; i++) { | ||
| 1616 | + printf("argv[%i]: %ls\n", i, get_argv[i]); | ||
| 1617 | + assert(wcscmp(get_argv[i], argv[i]) == 0); | ||
| 1618 | + } | ||
| 1619 | + | ||
| 1620 | + Py_Finalize(); | ||
| 1621 | + | ||
| 1622 | + printf("\n"); | ||
| 1623 | + printf("test ok\n"); | ||
| 1624 | + return 0; | ||
| 1625 | + } | ||
| 1626 | + | ||
| 1627 | + | ||
| 1587 | 1628 | /* ********************************************************* | |
| 1588 | 1629 | * List of test cases and the function that implements it. | |
| 1589 | 1630 | * | |
@@ -1641,6 +1682,7 @@ static struct TestCase TestCases[] = { | |||
| 1641 | 1682 | {"test_init_setpythonhome", test_init_setpythonhome}, | |
| 1642 | 1683 | {"test_init_warnoptions", test_init_warnoptions}, | |
| 1643 | 1684 | {"test_run_main", test_run_main}, | |
| 1685 | + {"test_get_argc_argv", test_get_argc_argv}, | ||
| 1644 | 1686 | ||
| 1645 | 1687 | {"test_open_code_hook", test_open_code_hook}, | |
| 1646 | 1688 | {"test_audit", test_audit}, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -580,7 +580,7 @@ _Py_HashRandomization_Init(const PyConfig *config) | |||
| 580 | 580 | res = pyurandom(secret, secret_size, 0, 0); | |
| 581 | 581 | if (res < 0) { | |
| 582 | 582 | return _PyStatus_ERR("failed to get random numbers " | |
| 583 | - "to initialize Python"); | ||
| 583 | + "to initialize Python"); | ||
| 584 | 584 | } | |
| 585 | 585 | } | |
| 586 | 586 | return _PyStatus_OK(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -543,8 +543,6 @@ _Py_SetArgcArgv(Py_ssize_t argc, wchar_t * const *argv) | |||
| 543 | 543 | } | |
| 544 | 544 | ||
| 545 | 545 | ||
| 546 | - /* Make the *original* argc/argv available to other modules. | ||
| 547 | - This is rare, but it is needed by the secureware extension. */ | ||
| 548 | 546 | void | |
| 549 | 547 | Py_GetArgcArgv(int *argc, wchar_t ***argv) | |
| 550 | 548 | { | |
@@ -852,6 +850,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) | |||
| 852 | 850 | COPY_ATTR(pathconfig_warnings); | |
| 853 | 851 | COPY_ATTR(_init_main); | |
| 854 | 852 | COPY_ATTR(_isolated_interpreter); | |
| 853 | + COPY_WSTRLIST(_orig_argv); | ||
| 855 | 854 | ||
| 856 | 855 | #undef COPY_ATTR | |
| 857 | 856 | #undef COPY_WSTR_ATTR | |
@@ -952,6 +951,7 @@ config_as_dict(const PyConfig *config) | |||
| 952 | 951 | SET_ITEM_INT(pathconfig_warnings); | |
| 953 | 952 | SET_ITEM_INT(_init_main); | |
| 954 | 953 | SET_ITEM_INT(_isolated_interpreter); | |
| 954 | + SET_ITEM_WSTRLIST(_orig_argv); | ||
| 955 | 955 | ||
| 956 | 956 | return dict; | |
| 957 | 957 | ||
@@ -1832,7 +1832,7 @@ config_init_stdio(const PyConfig *config) | |||
| 1832 | 1832 | ||
| 1833 | 1833 | - set Py_xxx global configuration variables | |
| 1834 | 1834 | - initialize C standard streams (stdin, stdout, stderr) */ | |
| 1835 | - void | ||
| 1835 | + PyStatus | ||
| 1836 | 1836 | _PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) | |
| 1837 | 1837 | { | |
| 1838 | 1838 | config_set_global_vars(config); | |
@@ -1846,6 +1846,13 @@ _PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) | |||
| 1846 | 1846 | preconfig->isolated = config->isolated; | |
| 1847 | 1847 | preconfig->use_environment = config->use_environment; | |
| 1848 | 1848 | preconfig->dev_mode = config->dev_mode; | |
| 1849 | + | ||
| 1850 | + if (_Py_SetArgcArgv(config->_orig_argv.length, | ||
| 1851 | + config->_orig_argv.items) < 0) | ||
| 1852 | + { | ||
| 1853 | + return _PyStatus_NO_MEMORY(); | ||
| 1854 | + } | ||
| 1855 | + return _PyStatus_OK(); | ||
| 1849 | 1856 | } | |
| 1850 | 1857 | ||
| 1851 | 1858 | ||
@@ -2469,7 +2476,6 @@ PyStatus | |||
| 2469 | 2476 | PyConfig_Read(PyConfig *config) | |
| 2470 | 2477 | { | |
| 2471 | 2478 | PyStatus status; | |
| 2472 | - PyWideStringList orig_argv = _PyWideStringList_INIT; | ||
| 2473 | 2479 | ||
| 2474 | 2480 | status = _Py_PreInitializeFromConfig(config, NULL); | |
| 2475 | 2481 | if (_PyStatus_EXCEPTION(status)) { | |
@@ -2478,8 +2484,13 @@ PyConfig_Read(PyConfig *config) | |||
| 2478 | 2484 | ||
| 2479 | 2485 | config_get_global_vars(config); | |
| 2480 | 2486 | ||
| 2481 | - if (_PyWideStringList_Copy(&orig_argv, &config->argv) < 0) { | ||
| 2482 | - return _PyStatus_NO_MEMORY(); | ||
| 2487 | + if (config->_orig_argv.length == 0 | ||
| 2488 | + && !(config->argv.length == 1 | ||
| 2489 | + && wcscmp(config->argv.items[0], L"") == 0)) | ||
| 2490 | + { | ||
| 2491 | + if (_PyWideStringList_Copy(&config->_orig_argv, &config->argv) < 0) { | ||
| 2492 | + return _PyStatus_NO_MEMORY(); | ||
| 2493 | + } | ||
| 2483 | 2494 | } | |
| 2484 | 2495 | ||
| 2485 | 2496 | _PyPreCmdline precmdline = _PyPreCmdline_INIT; | |
@@ -2510,11 +2521,6 @@ PyConfig_Read(PyConfig *config) | |||
| 2510 | 2521 | goto done; | |
| 2511 | 2522 | } | |
| 2512 | 2523 | ||
| 2513 | - if (_Py_SetArgcArgv(orig_argv.length, orig_argv.items) < 0) { | ||
| 2514 | - status = _PyStatus_NO_MEMORY(); | ||
| 2515 | - goto done; | ||
| 2516 | - } | ||
| 2517 | - | ||
| 2518 | 2524 | /* Check config consistency */ | |
| 2519 | 2525 | assert(config->isolated >= 0); | |
| 2520 | 2526 | assert(config->use_environment >= 0); | |
@@ -2566,11 +2572,11 @@ PyConfig_Read(PyConfig *config) | |||
| 2566 | 2572 | assert(config->check_hash_pycs_mode != NULL); | |
| 2567 | 2573 | assert(config->_install_importlib >= 0); | |
| 2568 | 2574 | assert(config->pathconfig_warnings >= 0); | |
| 2575 | + assert(_PyWideStringList_CheckConsistency(&config->_orig_argv)); | ||
| 2569 | 2576 | ||
| 2570 | 2577 | status = _PyStatus_OK(); | |
| 2571 | 2578 | ||
| 2572 | 2579 | done: | |
| 2573 | - _PyWideStringList_Clear(&orig_argv); | ||
| 2574 | 2580 | _PyPreCmdline_Clear(&precmdline); | |
| 2575 | 2581 | return status; | |
| 2576 | 2582 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -460,7 +460,10 @@ pyinit_core_reconfigure(_PyRuntimeState *runtime, | |||
| 460 | 460 | return _PyStatus_ERR("can't make main interpreter"); | |
| 461 | 461 | } | |
| 462 | 462 | ||
| 463 | - _PyConfig_Write(config, runtime); | ||
| 463 | + status = _PyConfig_Write(config, runtime); | ||
| 464 | + if (_PyStatus_EXCEPTION(status)) { | ||
| 465 | + return status; | ||
| 466 | + } | ||
| 464 | 467 | ||
| 465 | 468 | status = _PyInterpreterState_SetConfig(interp, config); | |
| 466 | 469 | if (_PyStatus_EXCEPTION(status)) { | |
@@ -486,7 +489,10 @@ pycore_init_runtime(_PyRuntimeState *runtime, | |||
| 486 | 489 | return _PyStatus_ERR("main interpreter already initialized"); | |
| 487 | 490 | } | |
| 488 | 491 | ||
| 489 | - _PyConfig_Write(config, runtime); | ||
| 492 | + PyStatus status = _PyConfig_Write(config, runtime); | ||
| 493 | + if (_PyStatus_EXCEPTION(status)) { | ||
| 494 | + return status; | ||
| 495 | + } | ||
| 490 | 496 | ||
| 491 | 497 | /* Py_Finalize leaves _Py_Finalizing set in order to help daemon | |
| 492 | 498 | * threads behave a little more gracefully at interpreter shutdown. | |
@@ -499,7 +505,7 @@ pycore_init_runtime(_PyRuntimeState *runtime, | |||
| 499 | 505 | */ | |
| 500 | 506 | _PyRuntimeState_SetFinalizing(runtime, NULL); | |
| 501 | 507 | ||
| 502 | - PyStatus status = _Py_HashRandomization_Init(config); | ||
| 508 | + status = _Py_HashRandomization_Init(config); | ||
| 503 | 509 | if (_PyStatus_EXCEPTION(status)) { | |
| 504 | 510 | return status; | |
| 505 | 511 | } | |
@@ -746,8 +752,6 @@ pyinit_config(_PyRuntimeState *runtime, | |||
| 746 | 752 | PyThreadState **tstate_p, | |
| 747 | 753 | const PyConfig *config) | |
| 748 | 754 | { | |
| 749 | - _PyConfig_Write(config, runtime); | ||
| 750 | - | ||
| 751 | 755 | PyStatus status = pycore_init_runtime(runtime, config); | |
| 752 | 756 | if (_PyStatus_EXCEPTION(status)) { | |
| 753 | 757 | return status; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments