1
2/* Python interpreter main program for frozen scripts */
3
4#include "Python.h"
5#include "pycore_runtime.h" // _PyRuntime_Initialize()
6#include <locale.h>
7
8#ifdef MS_WINDOWS
9extern void PyWinFreeze_ExeInit(void);
10extern void PyWinFreeze_ExeTerm(void);
11extern int PyInitFrozenExtensions(void);
12#endif
13
14/* Main program */
15
16int
17Py_FrozenMain(int argc, char **argv)
18{
19 PyStatus status = _PyRuntime_Initialize();
20 if (PyStatus_Exception(status)) {
21 Py_ExitStatusException(status);
22 }
23
24 const char *p;
25 int i, n, sts = 1;
26 int inspect = 0;
27 int unbuffered = 0;
28 char *oldloc = NULL;
29 wchar_t **argv_copy = NULL;
30 /* We need a second copies, as Python might modify the first one. */
31 wchar_t **argv_copy2 = NULL;
32
33 if (argc > 0) {
34 argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
35 argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
36 if (!argv_copy || !argv_copy2) {
37 fprintf(stderr, "out of memory\n");
38 goto error;
39 }
40 }
41
42 PyConfig config;
43 PyConfig_InitPythonConfig(&config);
44 config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */
45
46 if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
47 inspect = 1;
48 if ((p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
49 unbuffered = 1;
50
51 if (unbuffered) {
52 setbuf(stdin, (char *)NULL);
53 setbuf(stdout, (char *)NULL);
54 setbuf(stderr, (char *)NULL);
55 }
56
57 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
58 if (!oldloc) {
59 fprintf(stderr, "out of memory\n");
60 goto error;
61 }
62
63 setlocale(LC_ALL, "");
64 for (i = 0; i < argc; i++) {
65 argv_copy[i] = Py_DecodeLocale(argv[i], NULL);
66 argv_copy2[i] = argv_copy[i];
67 if (!argv_copy[i]) {
68 fprintf(stderr, "Unable to decode the command line argument #%i\n",
69 i + 1);
70 argc = i;
71 goto error;
72 }
73 }
74 setlocale(LC_ALL, oldloc);
75 PyMem_RawFree(oldloc);
76 oldloc = NULL;
77
78#ifdef MS_WINDOWS
79 PyInitFrozenExtensions();
80#endif /* MS_WINDOWS */
81 if (argc >= 1)
82 Py_SetProgramName(argv_copy[0]);
83
84 status = Py_InitializeFromConfig(&config);
85 PyConfig_Clear(&config);
86 if (PyStatus_Exception(status)) {
87 Py_ExitStatusException(status);
88 }
89
90#ifdef MS_WINDOWS
91 PyWinFreeze_ExeInit();
92#endif
93
94 if (Py_VerboseFlag)
95 fprintf(stderr, "Python %s\n%s\n",
96 Py_GetVersion(), Py_GetCopyright());
97
98 PySys_SetArgv(argc, argv_copy);
99
100 n = PyImport_ImportFrozenModule("__main__");
101 if (n == 0)
102 Py_FatalError("the __main__ module is not frozen");
103 if (n < 0) {
104 PyErr_Print();
105 sts = 1;
106 }
107 else
108 sts = 0;
109
110 if (inspect && isatty((int)fileno(stdin)))
111 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
112
113#ifdef MS_WINDOWS
114 PyWinFreeze_ExeTerm();
115#endif
116 if (Py_FinalizeEx() < 0) {
117 sts = 120;
118 }
119
120error:
121 PyMem_RawFree(argv_copy);
122 if (argv_copy2) {
123 for (i = 0; i < argc; i++)
124 PyMem_RawFree(argv_copy2[i]);
125 PyMem_RawFree(argv_copy2);
126 }
127 PyMem_RawFree(oldloc);
128 return sts;
129}
130