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 |
9 | extern void PyWinFreeze_ExeInit(void); |
10 | extern void PyWinFreeze_ExeTerm(void); |
11 | extern int PyInitFrozenExtensions(void); |
12 | #endif |
13 | |
14 | /* Main program */ |
15 | |
16 | int |
17 | Py_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 | |
120 | error: |
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 | |