1 /* Python interpreter main program for frozen scripts */
2 
3 #include "Python.h"
4 #include "pycore_runtime.h"  // _PyRuntime_Initialize()
5 #include <locale.h>
6 
7 #ifdef MS_WINDOWS
8 extern void PyWinFreeze_ExeInit(void);
9 extern void PyWinFreeze_ExeTerm(void);
10 extern int PyInitFrozenExtensions(void);
11 #endif
12 
13 /* Main program */
14 
15 int
Py_FrozenMain(int argc,char ** argv)16 Py_FrozenMain(int argc, char **argv)
17 {
18     PyStatus status = _PyRuntime_Initialize();
19     if (PyStatus_Exception(status)) {
20         Py_ExitStatusException(status);
21     }
22 
23     PyConfig config;
24     PyConfig_InitPythonConfig(&config);
25     // Suppress errors from getpath.c
26     config.pathconfig_warnings = 0;
27     // Don't parse command line options like -E
28     config.parse_argv = 0;
29 
30     status = PyConfig_SetBytesArgv(&config, argc, argv);
31     if (PyStatus_Exception(status)) {
32         PyConfig_Clear(&config);
33         Py_ExitStatusException(status);
34     }
35 
36     const char *p;
37     int inspect = 0;
38     if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') {
39         inspect = 1;
40     }
41 
42 #ifdef MS_WINDOWS
43     PyInitFrozenExtensions();
44 #endif /* MS_WINDOWS */
45 
46     status = Py_InitializeFromConfig(&config);
47     PyConfig_Clear(&config);
48     if (PyStatus_Exception(status)) {
49         Py_ExitStatusException(status);
50     }
51 
52 #ifdef MS_WINDOWS
53     PyWinFreeze_ExeInit();
54 #endif
55 
56     if (Py_VerboseFlag) {
57         fprintf(stderr, "Python %s\n%s\n",
58                 Py_GetVersion(), Py_GetCopyright());
59     }
60 
61     int sts = 1;
62     int n = PyImport_ImportFrozenModule("__main__");
63     if (n == 0) {
64         Py_FatalError("the __main__ module is not frozen");
65     }
66     if (n < 0) {
67         PyErr_Print();
68         sts = 1;
69     }
70     else {
71         sts = 0;
72     }
73 
74     if (inspect && isatty((int)fileno(stdin))) {
75         sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
76     }
77 
78 #ifdef MS_WINDOWS
79     PyWinFreeze_ExeTerm();
80 #endif
81     if (Py_FinalizeEx() < 0) {
82         sts = 120;
83     }
84     return sts;
85 }
86