blob: dd502119d985e92bbb5498956573a2971f8e3e97 [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001/* Python interpreter main program */
2
3#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +00004#include "osdefs.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00005
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00006#include <locale.h>
7
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00008#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +00009#include <windows.h>
Steve Dowerbfce0f92016-12-28 15:41:09 -080010#ifdef HAVE_IO_H
11#include <io.h>
12#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000013#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000014#include <fcntl.h>
15#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000016#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000017
Martin v. Löwis945362c2007-08-30 14:57:25 +000018#ifdef _MSC_VER
19#include <crtdbg.h>
20#endif
21
Jesus Ceaab70e2a2012-10-05 01:48:08 +020022#if defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000023#define PYTHONHOMEHELP "<prefix>\\lib"
24#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000025#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000026#endif
27
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000028#include "pygetopt.h"
29
Guido van Rossuma22865e2000-09-05 04:41:18 +000030#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000031 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
32 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000033
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000034#ifdef __cplusplus
35extern "C" {
36#endif
37
Guido van Rossumac56b031996-07-21 02:33:38 +000038/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000039static wchar_t **orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000040static int orig_argc;
41
Guido van Rossumbceccf52001-04-10 22:07:43 +000042/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020043#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000044
Guido van Rossumbceccf52001-04-10 22:07:43 +000045#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000046
Guido van Rossum667d7041995-08-04 04:20:48 +000047/* Short usage message (with %s for argv0) */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020048static const char usage_line[] =
Martin v. Löwis790465f2008-04-05 20:41:37 +000049"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000050
51/* Long usage message, split into parts < 512 bytes */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020052static const char usage_1[] = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000053Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000054-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
55 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Christian Heimes790c8232008-01-07 21:14:23 +000056-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000057-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000058-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000059-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000060-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000061";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020062static const char usage_2[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000063-i : inspect interactively after running script; forces a prompt even\n\
64 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020065-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000066-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000067-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000068-OO : remove doc-strings in addition to the -O optimizations\n\
Georg Brandl9d871192010-12-04 10:47:18 +000069-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +000070-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000071-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000072";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020073static const char usage_3[] = "\
Ezio Melotti61b0c672013-07-25 05:04:02 +020074-u : unbuffered binary stdout and stderr, stdin always buffered;\n\
75 also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000076 see man page for details on internal buffering relating to '-u'\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000077-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
78 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000079-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +090080 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000081-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +000082 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000083-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +000084-X opt : set implementation-specific option\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000085";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020086static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000087file : program read from script file\n\
88- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000089arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000090Other environment variables:\n\
91PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020092PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000093 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000094";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020095static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020096"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +000097" The default module search path uses %s.\n"
98"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
99"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be8072016-03-14 12:04:26 +0100100"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
101static const char usage_6[] =
102"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
103" to seed the hashes of str, bytes and datetime objects. It can also be\n"
104" set to an integer in the range [0,4294967295] to get hash values with a\n"
105" predictable seed.\n"
106"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
107" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
108" hooks.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000109
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000110static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200111usage(int exitcode, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 FILE *f = exitcode ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 fprintf(f, usage_line, program);
116 if (exitcode)
117 fprintf(f, "Try `python -h' for more information.\n");
118 else {
119 fputs(usage_1, f);
120 fputs(usage_2, f);
121 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200122 fprintf(f, usage_4, (wint_t)DELIM);
123 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100124 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 return exitcode;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000127}
128
Martin v. Löwis6caea372003-11-18 19:46:25 +0000129static void RunStartupFile(PyCompilerFlags *cf)
130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 char *startup = Py_GETENV("PYTHONSTARTUP");
132 if (startup != NULL && startup[0] != '\0') {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200133 FILE *fp = _Py_fopen(startup, "r");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 if (fp != NULL) {
135 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
136 PyErr_Clear();
137 fclose(fp);
138 } else {
139 int save_errno;
140
141 save_errno = errno;
142 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
143 errno = save_errno;
144 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
145 startup);
146 PyErr_Print();
147 PyErr_Clear();
148 }
149 }
Martin v. Löwis6caea372003-11-18 19:46:25 +0000150}
151
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200152static void RunInteractiveHook(void)
153{
154 PyObject *sys, *hook, *result;
155 sys = PyImport_ImportModule("sys");
156 if (sys == NULL)
157 goto error;
158 hook = PyObject_GetAttrString(sys, "__interactivehook__");
159 Py_DECREF(sys);
160 if (hook == NULL)
161 PyErr_Clear();
162 else {
163 result = PyObject_CallObject(hook, NULL);
164 Py_DECREF(hook);
165 if (result == NULL)
166 goto error;
167 else
168 Py_DECREF(result);
169 }
170 return;
171
172error:
173 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
174 PyErr_Print();
175 PyErr_Clear();
176}
177
Thomas Woutersa9773292006-04-21 09:43:23 +0000178
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000179static int RunModule(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyObject *module, *runpy, *runmodule, *runargs, *result;
182 runpy = PyImport_ImportModule("runpy");
183 if (runpy == NULL) {
184 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200185 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 return -1;
187 }
188 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
189 if (runmodule == NULL) {
190 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200191 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 Py_DECREF(runpy);
193 return -1;
194 }
195 module = PyUnicode_FromWideChar(modname, wcslen(modname));
196 if (module == NULL) {
197 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200198 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 Py_DECREF(runpy);
200 Py_DECREF(runmodule);
201 return -1;
202 }
203 runargs = Py_BuildValue("(Oi)", module, set_argv0);
204 if (runargs == NULL) {
205 fprintf(stderr,
206 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200207 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 Py_DECREF(runpy);
209 Py_DECREF(runmodule);
210 Py_DECREF(module);
211 return -1;
212 }
213 result = PyObject_Call(runmodule, runargs, NULL);
214 if (result == NULL) {
215 PyErr_Print();
216 }
217 Py_DECREF(runpy);
218 Py_DECREF(runmodule);
219 Py_DECREF(module);
220 Py_DECREF(runargs);
221 if (result == NULL) {
222 return -1;
223 }
224 Py_DECREF(result);
225 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000226}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000227
Nick Coghlan75345c52017-03-12 21:34:22 +1000228static PyObject *
229AsImportPathEntry(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000230{
Nick Coghlan75345c52017-03-12 21:34:22 +1000231 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000232
Nick Coghlan75345c52017-03-12 21:34:22 +1000233 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
234 if (sys_path0 == NULL)
Victor Stinner4726e402010-10-06 23:24:57 +0000235 goto error;
236
Nick Coghlan75345c52017-03-12 21:34:22 +1000237 importer = PyImport_GetImporter(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000238 if (importer == NULL)
239 goto error;
240
Brett Cannonaa936422012-04-27 15:30:58 -0400241 if (importer == Py_None) {
Nick Coghlan75345c52017-03-12 21:34:22 +1000242 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000243 Py_DECREF(importer);
Nick Coghlan75345c52017-03-12 21:34:22 +1000244 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 }
Victor Stinner4726e402010-10-06 23:24:57 +0000246 Py_DECREF(importer);
Nick Coghlan75345c52017-03-12 21:34:22 +1000247 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000248
Nick Coghlan75345c52017-03-12 21:34:22 +1000249error:
250 Py_XDECREF(sys_path0);
251 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
252 PyErr_Print();
253 PyErr_Clear();
254 return NULL;
255}
256
257
258static int
259RunMainFromImporter(PyObject *sys_path0)
260{
261 PyObject *sys_path;
262 int sts;
263
264 /* Assume sys_path0 has already been checked by AsImportPathEntry,
265 * so put it in sys.path[0] and import __main__ */
Victor Stinnerbd303c12013-11-07 23:07:29 +0100266 sys_path = PySys_GetObject("path");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200267 if (sys_path == NULL) {
268 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
Victor Stinner4726e402010-10-06 23:24:57 +0000269 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200270 }
Nick Coghlan75345c52017-03-12 21:34:22 +1000271 sts = PyList_Insert(sys_path, 0, sys_path0);
Steve Dower6d46ae72017-02-04 15:39:21 -0800272 if (sts) {
Nick Coghlan75345c52017-03-12 21:34:22 +1000273 sys_path0 = NULL;
Victor Stinner4726e402010-10-06 23:24:57 +0000274 goto error;
275 }
Victor Stinner4726e402010-10-06 23:24:57 +0000276
277 sts = RunModule(L"__main__", 0);
278 return sts != 0;
279
280error:
Nick Coghlan75345c52017-03-12 21:34:22 +1000281 Py_XDECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000282 PyErr_Print();
283 return 1;
Christian Heimes9cd17752007-11-18 19:35:23 +0000284}
285
Victor Stinnera62207c2010-08-07 10:57:17 +0000286static int
287run_command(wchar_t *command, PyCompilerFlags *cf)
288{
289 PyObject *unicode, *bytes;
290 int ret;
291
292 unicode = PyUnicode_FromWideChar(command, -1);
293 if (unicode == NULL)
294 goto error;
295 bytes = PyUnicode_AsUTF8String(unicode);
296 Py_DECREF(unicode);
297 if (bytes == NULL)
298 goto error;
299 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
300 Py_DECREF(bytes);
301 return ret != 0;
302
303error:
Victor Stinner398356b2010-08-18 22:23:22 +0000304 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000305 PyErr_Print();
306 return 1;
307}
308
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000309static int
310run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
311{
312 PyObject *unicode, *bytes = NULL;
313 char *filename_str;
314 int run;
315
316 /* call pending calls like signal handlers (SIGINT) */
317 if (Py_MakePendingCalls() == -1) {
318 PyErr_Print();
319 return 1;
320 }
321
322 if (filename) {
323 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
324 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000325 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000326 Py_DECREF(unicode);
327 }
328 if (bytes != NULL)
329 filename_str = PyBytes_AsString(bytes);
330 else {
331 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000332 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000333 }
334 }
335 else
336 filename_str = "<stdin>";
337
338 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
339 Py_XDECREF(bytes);
340 return run != 0;
341}
342
Christian Heimes9cd17752007-11-18 19:35:23 +0000343
Guido van Rossum667d7041995-08-04 04:20:48 +0000344/* Main program */
345
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000346int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000347Py_Main(int argc, wchar_t **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 int c;
350 int sts;
351 wchar_t *command = NULL;
352 wchar_t *filename = NULL;
353 wchar_t *module = NULL;
354 FILE *fp = stdin;
355 char *p;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000356#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 wchar_t *wp;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 int skipfirstline = 0;
360 int stdin_is_interactive = 0;
361 int help = 0;
362 int version = 0;
363 int saw_unbuffered_flag = 0;
Victor Stinner34be8072016-03-14 12:04:26 +0100364 char *opt;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 PyCompilerFlags cf;
Nick Coghlan75345c52017-03-12 21:34:22 +1000366 PyObject *main_importer_path = NULL;
Antoine Pitrou69994412014-04-29 00:56:08 +0200367 PyObject *warning_option = NULL;
368 PyObject *warning_options = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 cf.cf_flags = 0;
Guido van Rossum393661d2001-08-31 17:40:15 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 orig_argc = argc; /* For Py_GetArgcArgv() */
373 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000374
Antoine Pitrou86838b02012-02-21 19:03:47 +0100375 /* Hash randomization needed early for all string operations
376 (including -W and -X options). */
Ezio Melottia0dd22e2012-11-23 18:48:32 +0200377 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
Antoine Pitrou86838b02012-02-21 19:03:47 +0100378 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
379 if (c == 'm' || c == 'c') {
380 /* -c / -m is the last option: following arguments are
381 not interpreter options. */
382 break;
383 }
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500384 if (c == 'E') {
Antoine Pitrou86838b02012-02-21 19:03:47 +0100385 Py_IgnoreEnvironmentFlag++;
386 break;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100387 }
388 }
Antoine Pitrou86838b02012-02-21 19:03:47 +0100389
Victor Stinner34be8072016-03-14 12:04:26 +0100390 opt = Py_GETENV("PYTHONMALLOC");
391 if (_PyMem_SetupAllocators(opt) < 0) {
392 fprintf(stderr,
393 "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", opt);
394 exit(1);
395 }
396
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500397 Py_HashRandomizationFlag = 1;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100398 _PyRandom_Init();
399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 PySys_ResetWarnOptions();
Antoine Pitrou86838b02012-02-21 19:03:47 +0100401 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
404 if (c == 'c') {
405 size_t len;
406 /* -c is the last option; following arguments
407 that look like options are left for the
408 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 len = wcslen(_PyOS_optarg) + 1 + 1;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200411 command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 if (command == NULL)
413 Py_FatalError(
414 "not enough memory to copy -c argument");
415 wcscpy(command, _PyOS_optarg);
416 command[len - 2] = '\n';
417 command[len - 1] = 0;
418 break;
419 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 if (c == 'm') {
422 /* -m is the last option; following arguments
423 that look like options are left for the
424 module to interpret. */
425 module = _PyOS_optarg;
426 break;
427 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 switch (c) {
430 case 'b':
431 Py_BytesWarningFlag++;
432 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 case 'd':
435 Py_DebugFlag++;
436 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 case 'i':
439 Py_InspectFlag++;
440 Py_InteractiveFlag++;
441 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000442
Christian Heimesad73a9c2013-08-10 16:36:18 +0200443 case 'I':
444 Py_IsolatedFlag++;
445 Py_NoUserSiteDirectory++;
446 Py_IgnoreEnvironmentFlag++;
447 break;
448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 case 'O':
452 Py_OptimizeFlag++;
453 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 case 'B':
456 Py_DontWriteBytecodeFlag++;
457 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 case 's':
460 Py_NoUserSiteDirectory++;
461 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 case 'S':
464 Py_NoSiteFlag++;
465 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 case 'E':
Antoine Pitrou86838b02012-02-21 19:03:47 +0100468 /* Already handled above */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 case 't':
472 /* ignored for backwards compatibility */
473 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 case 'u':
476 Py_UnbufferedStdioFlag = 1;
477 saw_unbuffered_flag = 1;
478 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 case 'v':
481 Py_VerboseFlag++;
482 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 case 'x':
485 skipfirstline = 1;
486 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 case 'h':
489 case '?':
490 help++;
491 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 case 'V':
494 version++;
495 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 case 'W':
Antoine Pitrou69994412014-04-29 00:56:08 +0200498 if (warning_options == NULL)
499 warning_options = PyList_New(0);
500 if (warning_options == NULL)
501 Py_FatalError("failure in handling of -W argument");
502 warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
503 if (warning_option == NULL)
504 Py_FatalError("failure in handling of -W argument");
Christian Heimes27527072016-09-09 00:08:35 +0200505 if (PyList_Append(warning_options, warning_option) == -1)
506 Py_FatalError("failure in handling of -W argument");
Antoine Pitrou69994412014-04-29 00:56:08 +0200507 Py_DECREF(warning_option);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000509
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000510 case 'X':
511 PySys_AddXOption(_PyOS_optarg);
512 break;
513
Georg Brandl9d871192010-12-04 10:47:18 +0000514 case 'q':
Georg Brandl8aa7e992010-12-28 18:30:18 +0000515 Py_QuietFlag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000516 break;
517
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100518 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500519 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100520 break;
521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 default:
525 return usage(2, argv[0]);
526 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 }
529 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (help)
532 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 if (version) {
INADA Naoki0e175a62016-11-21 20:57:14 +0900535 printf("Python %s\n", version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 return 0;
537 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 if (!Py_InspectFlag &&
540 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
541 Py_InspectFlag = 1;
542 if (!saw_unbuffered_flag &&
543 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
544 Py_UnbufferedStdioFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 if (!Py_NoUserSiteDirectory &&
547 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
548 Py_NoUserSiteDirectory = 1;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000549
Philip Jenveye53de3d2010-04-14 03:01:39 +0000550#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
552 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800553 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000554
Victor Stinner1a7425f2013-07-07 16:25:15 +0200555 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (buf == NULL)
557 Py_FatalError(
558 "not enough memory to copy PYTHONWARNINGS");
559 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800560 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800562 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 PySys_AddWarnOption(warning);
564 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200565 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000567#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
569 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000570 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 /* settle for strtok here as there's no one standard
573 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200574 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 if (buf == NULL)
576 Py_FatalError(
577 "not enough memory to copy PYTHONWARNINGS");
578 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200579 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 setlocale(LC_ALL, "");
581 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000582#ifdef __APPLE__
583 /* Use utf-8 on Mac OS X */
584 unicode = PyUnicode_FromString(p);
585#else
Victor Stinner1b579672011-12-17 05:47:23 +0100586 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000587#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100588 if (unicode == NULL) {
589 /* ignore errors */
590 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000591 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100592 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000593 PySys_AddWarnOptionUnicode(unicode);
594 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 }
596 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200597 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200598 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000600#endif
Antoine Pitrou69994412014-04-29 00:56:08 +0200601 if (warning_options != NULL) {
602 Py_ssize_t i;
603 for (i = 0; i < PyList_GET_SIZE(warning_options); i++) {
604 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(warning_options, i));
605 }
606 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 if (command == NULL && module == NULL && _PyOS_optind < argc &&
609 wcscmp(argv[_PyOS_optind], L"-") != 0)
610 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 filename = argv[_PyOS_optind];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 }
Guido van Rossum775af911997-02-14 19:50:32 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000615
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000616#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000617 /* don't translate newlines (\r\n <=> \n) */
618 _setmode(fileno(stdin), O_BINARY);
619 _setmode(fileno(stdout), O_BINARY);
620 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000621#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000622
623 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000624#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
626 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
627 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000628#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 setbuf(stdin, (char *)NULL);
630 setbuf(stdout, (char *)NULL);
631 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000632#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 }
634 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000635#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 /* Doesn't have to have line-buffered -- use unbuffered */
637 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
638 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000639#else /* !MS_WINDOWS */
640#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
642 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000643#endif /* HAVE_SETVBUF */
644#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Leave stderr alone - it should be unbuffered anyway. */
646 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000647
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000648#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 /* On MacOS X, when the Python interpreter is embedded in an
650 application bundle, it gets executed by a bootstrapping script
651 that does os.execve() with an argv[0] that's different from the
652 actual Python executable. This is needed to keep the Finder happy,
653 or rather, to work around Apple's overly strict requirements of
654 the process name. However, we still need a usable sys.executable,
655 so the actual executable path is passed in an environment variable.
656 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
657 script. */
658 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
659 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200660 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000661
Victor Stinner1a7425f2013-07-07 16:25:15 +0200662 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 if (buffer == NULL) {
664 Py_FatalError(
665 "not enough memory to copy PYTHONEXECUTABLE");
666 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000667
Brett Cannonb94767f2011-02-22 20:15:44 +0000668 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 Py_SetProgramName(buffer);
670 /* buffer is now handed off - do not free */
671 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100672#ifdef WITH_NEXT_FRAMEWORK
673 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
674
675 if (pyvenv_launcher && *pyvenv_launcher) {
676 /* Used by Mac/Tools/pythonw.c to forward
677 * the argv0 of the stub executable
678 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200679 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100680
681 if (wbuf == NULL) {
682 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
683 }
684 Py_SetProgramName(wbuf);
685
686 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000687 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100688 */
689 } else {
690 Py_SetProgramName(argv[0]);
691 }
692#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000696#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 Py_Initialize();
Antoine Pitrou69994412014-04-29 00:56:08 +0200700 Py_XDECREF(warning_options);
Guido van Rossumed52aac1997-07-19 19:20:32 +0000701
Georg Brandl8aa7e992010-12-28 18:30:18 +0000702 if (!Py_QuietFlag && (Py_VerboseFlag ||
Georg Brandl9d871192010-12-04 10:47:18 +0000703 (command == NULL && filename == NULL &&
704 module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 fprintf(stderr, "Python %s on %s\n",
706 Py_GetVersion(), Py_GetPlatform());
707 if (!Py_NoSiteFlag)
708 fprintf(stderr, "%s\n", COPYRIGHT);
709 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 if (command != NULL) {
712 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
713 _PyOS_optind--;
714 argv[_PyOS_optind] = L"-c";
715 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 if (module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000718 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000720 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000722
Nick Coghlan75345c52017-03-12 21:34:22 +1000723 if (filename != NULL) {
724 main_importer_path = AsImportPathEntry(filename);
725 }
726
727 if (main_importer_path != NULL) {
728 /* Let RunMainFromImporter adjust sys.path[0] later */
729 PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0);
730 } else {
731 /* Use config settings to decide whether or not to update sys.path[0] */
732 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
733 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Steve Dower313523c2016-09-17 12:22:41 -0700736 isatty(fileno(stdin)) &&
737 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 PyObject *v;
739 v = PyImport_ImportModule("readline");
740 if (v == NULL)
741 PyErr_Clear();
742 else
743 Py_DECREF(v);
744 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 if (command) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000747 sts = run_command(command, &cf);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200748 PyMem_RawFree(command);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 } else if (module) {
Senthil Kumaranf01a3372012-07-04 19:28:16 -0700750 sts = (RunModule(module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 }
752 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 if (filename == NULL && stdin_is_interactive) {
755 Py_InspectFlag = 0; /* do exit on SystemExit */
756 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200757 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 }
759 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000762
Nick Coghlan75345c52017-03-12 21:34:22 +1000763 if (main_importer_path != NULL) {
764 sts = RunMainFromImporter(main_importer_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000766
Nick Coghlan75345c52017-03-12 21:34:22 +1000767 if (sts==-1 && filename != NULL) {
Victor Stinner9a6692f2010-10-14 10:51:24 +0000768 fp = _Py_wfopen(filename, L"r");
769 if (fp == NULL) {
770 char *cfilename_buffer;
771 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100772 int err = errno;
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200773 cfilename_buffer = Py_EncodeLocale(filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000774 if (cfilename_buffer != NULL)
775 cfilename = cfilename_buffer;
776 else
777 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100779 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000780 if (cfilename_buffer)
781 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 return 2;
783 }
784 else if (skipfirstline) {
785 int ch;
786 /* Push back first newline so line numbers
787 remain the same */
788 while ((ch = getc(fp)) != EOF) {
789 if (ch == '\n') {
790 (void)ungetc(ch, fp);
791 break;
792 }
793 }
794 }
795 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800796 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200797 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200799 fprintf(stderr,
800 "%ls: '%ls' is a directory, cannot continue\n",
801 argv[0], filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 fclose(fp);
803 return 1;
804 }
805 }
806 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000807
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000808 if (sts == -1)
809 sts = run_file(fp, filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 /* Check this environment variable at the end, to give programs the
813 * opportunity to set it from Python.
814 */
815 if (!Py_InspectFlag &&
816 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
817 {
818 Py_InspectFlag = 1;
819 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 if (Py_InspectFlag && stdin_is_interactive &&
822 (filename != NULL || command != NULL || module != NULL)) {
823 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200824 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 /* XXX */
826 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
827 }
828
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000829 if (Py_FinalizeEx() < 0) {
830 /* Value unlikely to be confused with a non-error exit status or
831 other special meaning */
832 sts = 120;
833 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000834
835#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 /* Insure++ is a memory analysis tool that aids in discovering
837 * memory leaks and other memory problems. On Python exit, the
838 * interned string dictionaries are flagged as being in use at exit
839 * (which it is). Under normal circumstances, this is fine because
840 * the memory will be automatically reclaimed by the system. Under
841 * memory debugging, it's a huge source of useless noise, so we
842 * trade off slower shutdown for less distraction in the memory
843 * reports. -baw
844 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000846#endif /* __INSURE__ */
847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000849}
850
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000851/* this is gonna seem *real weird*, but if you put some other code between
852 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
853 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000854
Guido van Rossum667d7041995-08-04 04:20:48 +0000855/* Make the *original* argc/argv available to other modules.
856 This is rare, but it is needed by the secureware extension. */
857
858void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000859Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 *argc = orig_argc;
862 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000863}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000864
865#ifdef __cplusplus
866}
867#endif