blob: 633e7576910b840178145505eca29f863518f679 [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 {
Victor Stinnera5ed5f02016-12-06 18:45:50 +0100163 result = _PyObject_CallNoArg(hook);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200164 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
Victor Stinner4726e402010-10-06 23:24:57 +0000228static int
229RunMainFromImporter(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000230{
Steve Dower6d46ae72017-02-04 15:39:21 -0800231 PyObject *argv0 = NULL, *importer, *sys_path, *sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000232 int sts;
Christian Heimes9cd17752007-11-18 19:35:23 +0000233
Victor Stinner4726e402010-10-06 23:24:57 +0000234 argv0 = PyUnicode_FromWideChar(filename, wcslen(filename));
235 if (argv0 == NULL)
236 goto error;
237
238 importer = PyImport_GetImporter(argv0);
239 if (importer == NULL)
240 goto error;
241
Brett Cannonaa936422012-04-27 15:30:58 -0400242 if (importer == Py_None) {
Victor Stinner4726e402010-10-06 23:24:57 +0000243 Py_DECREF(argv0);
244 Py_DECREF(importer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 return -1;
246 }
Victor Stinner4726e402010-10-06 23:24:57 +0000247 Py_DECREF(importer);
248
249 /* argv0 is usable as an import source, so put it in sys.path[0]
250 and import __main__ */
Victor Stinnerbd303c12013-11-07 23:07:29 +0100251 sys_path = PySys_GetObject("path");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200252 if (sys_path == NULL) {
253 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
Victor Stinner4726e402010-10-06 23:24:57 +0000254 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200255 }
Steve Dower6d46ae72017-02-04 15:39:21 -0800256 sys_path0 = PyList_GetItem(sys_path, 0);
257 sts = 0;
258 if (!sys_path0) {
259 PyErr_Clear();
260 sts = PyList_Append(sys_path, argv0);
261 } else if (PyObject_IsTrue(sys_path0)) {
262 sts = PyList_Insert(sys_path, 0, argv0);
263 } else {
264 sts = PyList_SetItem(sys_path, 0, argv0);
265 }
266 if (sts) {
Victor Stinner4726e402010-10-06 23:24:57 +0000267 argv0 = NULL;
268 goto error;
269 }
270 Py_INCREF(argv0);
271
272 sts = RunModule(L"__main__", 0);
273 return sts != 0;
274
275error:
276 Py_XDECREF(argv0);
277 PyErr_Print();
278 return 1;
Christian Heimes9cd17752007-11-18 19:35:23 +0000279}
280
Victor Stinnera62207c2010-08-07 10:57:17 +0000281static int
282run_command(wchar_t *command, PyCompilerFlags *cf)
283{
284 PyObject *unicode, *bytes;
285 int ret;
286
287 unicode = PyUnicode_FromWideChar(command, -1);
288 if (unicode == NULL)
289 goto error;
290 bytes = PyUnicode_AsUTF8String(unicode);
291 Py_DECREF(unicode);
292 if (bytes == NULL)
293 goto error;
294 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
295 Py_DECREF(bytes);
296 return ret != 0;
297
298error:
Victor Stinner398356b2010-08-18 22:23:22 +0000299 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000300 PyErr_Print();
301 return 1;
302}
303
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000304static int
305run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
306{
307 PyObject *unicode, *bytes = NULL;
308 char *filename_str;
309 int run;
310
311 /* call pending calls like signal handlers (SIGINT) */
312 if (Py_MakePendingCalls() == -1) {
313 PyErr_Print();
314 return 1;
315 }
316
317 if (filename) {
318 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
319 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000320 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000321 Py_DECREF(unicode);
322 }
323 if (bytes != NULL)
324 filename_str = PyBytes_AsString(bytes);
325 else {
326 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000327 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000328 }
329 }
330 else
331 filename_str = "<stdin>";
332
333 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
334 Py_XDECREF(bytes);
335 return run != 0;
336}
337
Christian Heimes9cd17752007-11-18 19:35:23 +0000338
Guido van Rossum667d7041995-08-04 04:20:48 +0000339/* Main program */
340
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000341int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000342Py_Main(int argc, wchar_t **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 int c;
345 int sts;
346 wchar_t *command = NULL;
347 wchar_t *filename = NULL;
348 wchar_t *module = NULL;
349 FILE *fp = stdin;
350 char *p;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000351#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 wchar_t *wp;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 int skipfirstline = 0;
355 int stdin_is_interactive = 0;
356 int help = 0;
357 int version = 0;
358 int saw_unbuffered_flag = 0;
Victor Stinner34be8072016-03-14 12:04:26 +0100359 char *opt;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 PyCompilerFlags cf;
Antoine Pitrou69994412014-04-29 00:56:08 +0200361 PyObject *warning_option = NULL;
362 PyObject *warning_options = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 cf.cf_flags = 0;
Guido van Rossum393661d2001-08-31 17:40:15 +0000365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 orig_argc = argc; /* For Py_GetArgcArgv() */
367 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000368
Antoine Pitrou86838b02012-02-21 19:03:47 +0100369 /* Hash randomization needed early for all string operations
370 (including -W and -X options). */
Ezio Melottia0dd22e2012-11-23 18:48:32 +0200371 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
Antoine Pitrou86838b02012-02-21 19:03:47 +0100372 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
373 if (c == 'm' || c == 'c') {
374 /* -c / -m is the last option: following arguments are
375 not interpreter options. */
376 break;
377 }
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500378 if (c == 'E') {
Antoine Pitrou86838b02012-02-21 19:03:47 +0100379 Py_IgnoreEnvironmentFlag++;
380 break;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100381 }
382 }
Antoine Pitrou86838b02012-02-21 19:03:47 +0100383
Victor Stinner34be8072016-03-14 12:04:26 +0100384 opt = Py_GETENV("PYTHONMALLOC");
385 if (_PyMem_SetupAllocators(opt) < 0) {
386 fprintf(stderr,
387 "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", opt);
388 exit(1);
389 }
390
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500391 Py_HashRandomizationFlag = 1;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100392 _PyRandom_Init();
393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 PySys_ResetWarnOptions();
Antoine Pitrou86838b02012-02-21 19:03:47 +0100395 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
398 if (c == 'c') {
399 size_t len;
400 /* -c is the last option; following arguments
401 that look like options are left for the
402 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 len = wcslen(_PyOS_optarg) + 1 + 1;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200405 command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 if (command == NULL)
407 Py_FatalError(
408 "not enough memory to copy -c argument");
409 wcscpy(command, _PyOS_optarg);
410 command[len - 2] = '\n';
411 command[len - 1] = 0;
412 break;
413 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 if (c == 'm') {
416 /* -m is the last option; following arguments
417 that look like options are left for the
418 module to interpret. */
419 module = _PyOS_optarg;
420 break;
421 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 switch (c) {
424 case 'b':
425 Py_BytesWarningFlag++;
426 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 case 'd':
429 Py_DebugFlag++;
430 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 case 'i':
433 Py_InspectFlag++;
434 Py_InteractiveFlag++;
435 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000436
Christian Heimesad73a9c2013-08-10 16:36:18 +0200437 case 'I':
438 Py_IsolatedFlag++;
439 Py_NoUserSiteDirectory++;
440 Py_IgnoreEnvironmentFlag++;
441 break;
442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 case 'O':
446 Py_OptimizeFlag++;
447 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 case 'B':
450 Py_DontWriteBytecodeFlag++;
451 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 case 's':
454 Py_NoUserSiteDirectory++;
455 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 case 'S':
458 Py_NoSiteFlag++;
459 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 case 'E':
Antoine Pitrou86838b02012-02-21 19:03:47 +0100462 /* Already handled above */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 case 't':
466 /* ignored for backwards compatibility */
467 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 case 'u':
470 Py_UnbufferedStdioFlag = 1;
471 saw_unbuffered_flag = 1;
472 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 case 'v':
475 Py_VerboseFlag++;
476 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 case 'x':
479 skipfirstline = 1;
480 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 case 'h':
483 case '?':
484 help++;
485 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 case 'V':
488 version++;
489 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 case 'W':
Antoine Pitrou69994412014-04-29 00:56:08 +0200492 if (warning_options == NULL)
493 warning_options = PyList_New(0);
494 if (warning_options == NULL)
495 Py_FatalError("failure in handling of -W argument");
496 warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
497 if (warning_option == NULL)
498 Py_FatalError("failure in handling of -W argument");
Christian Heimes27527072016-09-09 00:08:35 +0200499 if (PyList_Append(warning_options, warning_option) == -1)
500 Py_FatalError("failure in handling of -W argument");
Antoine Pitrou69994412014-04-29 00:56:08 +0200501 Py_DECREF(warning_option);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000503
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000504 case 'X':
505 PySys_AddXOption(_PyOS_optarg);
506 break;
507
Georg Brandl9d871192010-12-04 10:47:18 +0000508 case 'q':
Georg Brandl8aa7e992010-12-28 18:30:18 +0000509 Py_QuietFlag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000510 break;
511
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100512 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500513 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100514 break;
515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 default:
519 return usage(2, argv[0]);
520 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 }
523 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 if (help)
526 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 if (version) {
INADA Naoki0e175a62016-11-21 20:57:14 +0900529 printf("Python %s\n", version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 return 0;
531 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 if (!Py_InspectFlag &&
534 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
535 Py_InspectFlag = 1;
536 if (!saw_unbuffered_flag &&
537 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
538 Py_UnbufferedStdioFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (!Py_NoUserSiteDirectory &&
541 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
542 Py_NoUserSiteDirectory = 1;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000543
Philip Jenveye53de3d2010-04-14 03:01:39 +0000544#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
546 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800547 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000548
Victor Stinner1a7425f2013-07-07 16:25:15 +0200549 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 if (buf == NULL)
551 Py_FatalError(
552 "not enough memory to copy PYTHONWARNINGS");
553 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800554 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800556 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 PySys_AddWarnOption(warning);
558 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200559 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000561#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
563 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000564 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 /* settle for strtok here as there's no one standard
567 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200568 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 if (buf == NULL)
570 Py_FatalError(
571 "not enough memory to copy PYTHONWARNINGS");
572 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200573 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 setlocale(LC_ALL, "");
575 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000576#ifdef __APPLE__
577 /* Use utf-8 on Mac OS X */
578 unicode = PyUnicode_FromString(p);
579#else
Victor Stinner1b579672011-12-17 05:47:23 +0100580 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000581#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100582 if (unicode == NULL) {
583 /* ignore errors */
584 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000585 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100586 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000587 PySys_AddWarnOptionUnicode(unicode);
588 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 }
590 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200591 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200592 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000594#endif
Antoine Pitrou69994412014-04-29 00:56:08 +0200595 if (warning_options != NULL) {
596 Py_ssize_t i;
597 for (i = 0; i < PyList_GET_SIZE(warning_options); i++) {
598 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(warning_options, i));
599 }
600 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 if (command == NULL && module == NULL && _PyOS_optind < argc &&
603 wcscmp(argv[_PyOS_optind], L"-") != 0)
604 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 filename = argv[_PyOS_optind];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 }
Guido van Rossum775af911997-02-14 19:50:32 +0000607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000609
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000610#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000611 /* don't translate newlines (\r\n <=> \n) */
612 _setmode(fileno(stdin), O_BINARY);
613 _setmode(fileno(stdout), O_BINARY);
614 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000615#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000616
617 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000618#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
620 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
621 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000622#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 setbuf(stdin, (char *)NULL);
624 setbuf(stdout, (char *)NULL);
625 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000626#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 }
628 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000629#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* Doesn't have to have line-buffered -- use unbuffered */
631 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
632 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000633#else /* !MS_WINDOWS */
634#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
636 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000637#endif /* HAVE_SETVBUF */
638#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* Leave stderr alone - it should be unbuffered anyway. */
640 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000641
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000642#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* On MacOS X, when the Python interpreter is embedded in an
644 application bundle, it gets executed by a bootstrapping script
645 that does os.execve() with an argv[0] that's different from the
646 actual Python executable. This is needed to keep the Finder happy,
647 or rather, to work around Apple's overly strict requirements of
648 the process name. However, we still need a usable sys.executable,
649 so the actual executable path is passed in an environment variable.
650 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
651 script. */
652 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
653 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200654 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000655
Victor Stinner1a7425f2013-07-07 16:25:15 +0200656 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 if (buffer == NULL) {
658 Py_FatalError(
659 "not enough memory to copy PYTHONEXECUTABLE");
660 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000661
Brett Cannonb94767f2011-02-22 20:15:44 +0000662 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 Py_SetProgramName(buffer);
664 /* buffer is now handed off - do not free */
665 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100666#ifdef WITH_NEXT_FRAMEWORK
667 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
668
669 if (pyvenv_launcher && *pyvenv_launcher) {
670 /* Used by Mac/Tools/pythonw.c to forward
671 * the argv0 of the stub executable
672 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200673 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100674
675 if (wbuf == NULL) {
676 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
677 }
678 Py_SetProgramName(wbuf);
679
680 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000681 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100682 */
683 } else {
684 Py_SetProgramName(argv[0]);
685 }
686#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000690#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 Py_Initialize();
Antoine Pitrou69994412014-04-29 00:56:08 +0200694 Py_XDECREF(warning_options);
Guido van Rossumed52aac1997-07-19 19:20:32 +0000695
Georg Brandl8aa7e992010-12-28 18:30:18 +0000696 if (!Py_QuietFlag && (Py_VerboseFlag ||
Georg Brandl9d871192010-12-04 10:47:18 +0000697 (command == NULL && filename == NULL &&
698 module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 fprintf(stderr, "Python %s on %s\n",
700 Py_GetVersion(), Py_GetPlatform());
701 if (!Py_NoSiteFlag)
702 fprintf(stderr, "%s\n", COPYRIGHT);
703 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 if (command != NULL) {
706 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
707 _PyOS_optind--;
708 argv[_PyOS_optind] = L"-c";
709 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 if (module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000712 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000714 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Steve Dower313523c2016-09-17 12:22:41 -0700720 isatty(fileno(stdin)) &&
721 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 PyObject *v;
723 v = PyImport_ImportModule("readline");
724 if (v == NULL)
725 PyErr_Clear();
726 else
727 Py_DECREF(v);
728 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 if (command) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000731 sts = run_command(command, &cf);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200732 PyMem_RawFree(command);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 } else if (module) {
Senthil Kumaranf01a3372012-07-04 19:28:16 -0700734 sts = (RunModule(module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 }
736 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 if (filename == NULL && stdin_is_interactive) {
739 Py_InspectFlag = 0; /* do exit on SystemExit */
740 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200741 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 }
743 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 if (filename != NULL) {
748 sts = RunMainFromImporter(filename);
749 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 if (sts==-1 && filename!=NULL) {
Victor Stinner9a6692f2010-10-14 10:51:24 +0000752 fp = _Py_wfopen(filename, L"r");
753 if (fp == NULL) {
754 char *cfilename_buffer;
755 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100756 int err = errno;
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200757 cfilename_buffer = Py_EncodeLocale(filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000758 if (cfilename_buffer != NULL)
759 cfilename = cfilename_buffer;
760 else
761 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100763 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000764 if (cfilename_buffer)
765 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 return 2;
767 }
768 else if (skipfirstline) {
769 int ch;
770 /* Push back first newline so line numbers
771 remain the same */
772 while ((ch = getc(fp)) != EOF) {
773 if (ch == '\n') {
774 (void)ungetc(ch, fp);
775 break;
776 }
777 }
778 }
779 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800780 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200781 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200783 fprintf(stderr,
784 "%ls: '%ls' is a directory, cannot continue\n",
785 argv[0], filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 fclose(fp);
787 return 1;
788 }
789 }
790 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000791
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000792 if (sts == -1)
793 sts = run_file(fp, filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 /* Check this environment variable at the end, to give programs the
797 * opportunity to set it from Python.
798 */
799 if (!Py_InspectFlag &&
800 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
801 {
802 Py_InspectFlag = 1;
803 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 if (Py_InspectFlag && stdin_is_interactive &&
806 (filename != NULL || command != NULL || module != NULL)) {
807 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200808 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 /* XXX */
810 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
811 }
812
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000813 if (Py_FinalizeEx() < 0) {
814 /* Value unlikely to be confused with a non-error exit status or
815 other special meaning */
816 sts = 120;
817 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000818
819#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 /* Insure++ is a memory analysis tool that aids in discovering
821 * memory leaks and other memory problems. On Python exit, the
822 * interned string dictionaries are flagged as being in use at exit
823 * (which it is). Under normal circumstances, this is fine because
824 * the memory will be automatically reclaimed by the system. Under
825 * memory debugging, it's a huge source of useless noise, so we
826 * trade off slower shutdown for less distraction in the memory
827 * reports. -baw
828 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000830#endif /* __INSURE__ */
831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000833}
834
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000835/* this is gonna seem *real weird*, but if you put some other code between
836 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
837 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000838
Guido van Rossum667d7041995-08-04 04:20:48 +0000839/* Make the *original* argc/argv available to other modules.
840 This is rare, but it is needed by the secureware extension. */
841
842void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000843Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 *argc = orig_argc;
846 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000847}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000848
849#ifdef __cplusplus
850}
851#endif