mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| /* Frozen modules bootstrap
 | |
|  *
 | |
|  * Limited and restricted Python interpreter to run
 | |
|  * "Tools/build/deepfreeze.py" on systems with no or older Python
 | |
|  * interpreter.
 | |
|  */
 | |
| 
 | |
| #include "Python.h"
 | |
| #include "pycore_import.h"
 | |
| 
 | |
| /* Includes for frozen modules: */
 | |
| #include "Python/frozen_modules/importlib._bootstrap.h"
 | |
| #include "Python/frozen_modules/importlib._bootstrap_external.h"
 | |
| #include "Python/frozen_modules/zipimport.h"
 | |
| /* End includes */
 | |
| 
 | |
| /* Note that a negative size indicates a package. */
 | |
| 
 | |
| static const struct _frozen bootstrap_modules[] = {
 | |
|     {"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap)},
 | |
|     {"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external)},
 | |
|     {"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport)},
 | |
|     {0, 0, 0} /* bootstrap sentinel */
 | |
| };
 | |
| static const struct _frozen stdlib_modules[] = {
 | |
|     {0, 0, 0} /* stdlib sentinel */
 | |
| };
 | |
| static const struct _frozen test_modules[] = {
 | |
|     {0, 0, 0} /* test sentinel */
 | |
| };
 | |
| const struct _frozen *_PyImport_FrozenBootstrap = bootstrap_modules;
 | |
| const struct _frozen *_PyImport_FrozenStdlib = stdlib_modules;
 | |
| const struct _frozen *_PyImport_FrozenTest = test_modules;
 | |
| 
 | |
| static const struct _module_alias aliases[] = {
 | |
|     {"_frozen_importlib", "importlib._bootstrap"},
 | |
|     {"_frozen_importlib_external", "importlib._bootstrap_external"},
 | |
|     {0, 0} /* aliases sentinel */
 | |
| };
 | |
| const struct _module_alias *_PyImport_FrozenAliases = aliases;
 | |
| 
 | |
| /* Embedding apps may change this pointer to point to their favorite
 | |
|    collection of frozen modules: */
 | |
| 
 | |
| const struct _frozen *PyImport_FrozenModules = NULL;
 | |
| 
 | |
| int
 | |
| #ifdef MS_WINDOWS
 | |
| wmain(int argc, wchar_t **argv)
 | |
| #else
 | |
| main(int argc, char **argv)
 | |
| #endif
 | |
| {
 | |
|     PyStatus status;
 | |
| 
 | |
|     PyConfig config;
 | |
|     PyConfig_InitIsolatedConfig(&config);
 | |
|     // don't warn, pybuilddir.txt does not exist yet
 | |
|     config.pathconfig_warnings = 0;
 | |
|     // parse arguments
 | |
|     config.parse_argv = 1;
 | |
|     // add current script dir to sys.path
 | |
|     config.isolated = 0;
 | |
|     config.safe_path = 0;
 | |
| 
 | |
| #ifdef MS_WINDOWS
 | |
|     status = PyConfig_SetArgv(&config, argc, argv);
 | |
| #else
 | |
|     status = PyConfig_SetBytesArgv(&config, argc, argv);
 | |
| #endif
 | |
|     if (PyStatus_Exception(status)) {
 | |
|         goto error;
 | |
|     }
 | |
| 
 | |
|     status = PyConfig_Read(&config);
 | |
|     if (config.run_filename == NULL) {
 | |
|         status = PyStatus_Error("Run filename expected");
 | |
|         goto error;
 | |
|     }
 | |
| 
 | |
| #define CLEAR(ATTR) \
 | |
|     do { \
 | |
|         PyMem_RawFree(ATTR); \
 | |
|         ATTR = NULL; \
 | |
|     } while (0)
 | |
| 
 | |
|     // isolate from system Python
 | |
|     CLEAR(config.base_prefix);
 | |
|     CLEAR(config.prefix);
 | |
|     CLEAR(config.base_exec_prefix);
 | |
|     CLEAR(config.exec_prefix);
 | |
| 
 | |
|     status = Py_InitializeFromConfig(&config);
 | |
|     if (PyStatus_Exception(status)) {
 | |
|         goto error;
 | |
|     }
 | |
|     PyConfig_Clear(&config);
 | |
| 
 | |
|     return Py_RunMain();
 | |
| 
 | |
| error:
 | |
|     PyConfig_Clear(&config);
 | |
|     if (PyStatus_IsExit(status)) {
 | |
|         return status.exitcode;
 | |
|     }
 | |
|     Py_ExitStatusException(status);
 | |
| }
 | |
| 
 | 
