blob: 4cbe37697582544c34779aabc6d2919a72fcd853 [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
Victor Stinner4726e402010-10-06 23:24:57 +0000228static int
229RunMainFromImporter(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000230{
Victor Stinner4726e402010-10-06 23:24:57 +0000231 PyObject *argv0 = NULL, *importer, *sys_path;
232 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 }
Victor Stinner4726e402010-10-06 23:24:57 +0000256 if (PyList_SetItem(sys_path, 0, argv0)) {
257 argv0 = NULL;
258 goto error;
259 }
260 Py_INCREF(argv0);
261
262 sts = RunModule(L"__main__", 0);
263 return sts != 0;
264
265error:
266 Py_XDECREF(argv0);
267 PyErr_Print();
268 return 1;
Christian Heimes9cd17752007-11-18 19:35:23 +0000269}
270
Victor Stinnera62207c2010-08-07 10:57:17 +0000271static int
272run_command(wchar_t *command, PyCompilerFlags *cf)
273{
274 PyObject *unicode, *bytes;
275 int ret;
276
277 unicode = PyUnicode_FromWideChar(command, -1);
278 if (unicode == NULL)
279 goto error;
280 bytes = PyUnicode_AsUTF8String(unicode);
281 Py_DECREF(unicode);
282 if (bytes == NULL)
283 goto error;
284 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
285 Py_DECREF(bytes);
286 return ret != 0;
287
288error:
Victor Stinner398356b2010-08-18 22:23:22 +0000289 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000290 PyErr_Print();
291 return 1;
292}
293
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000294static int
295run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
296{
297 PyObject *unicode, *bytes = NULL;
298 char *filename_str;
299 int run;
300
301 /* call pending calls like signal handlers (SIGINT) */
302 if (Py_MakePendingCalls() == -1) {
303 PyErr_Print();
304 return 1;
305 }
306
307 if (filename) {
308 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
309 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000310 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000311 Py_DECREF(unicode);
312 }
313 if (bytes != NULL)
314 filename_str = PyBytes_AsString(bytes);
315 else {
316 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000317 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000318 }
319 }
320 else
321 filename_str = "<stdin>";
322
323 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
324 Py_XDECREF(bytes);
325 return run != 0;
326}
327
Christian Heimes9cd17752007-11-18 19:35:23 +0000328
Guido van Rossum667d7041995-08-04 04:20:48 +0000329/* Main program */
330
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000331int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000332Py_Main(int argc, wchar_t **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 int c;
335 int sts;
336 wchar_t *command = NULL;
337 wchar_t *filename = NULL;
338 wchar_t *module = NULL;
339 FILE *fp = stdin;
340 char *p;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000341#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 wchar_t *wp;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 int skipfirstline = 0;
345 int stdin_is_interactive = 0;
346 int help = 0;
347 int version = 0;
348 int saw_unbuffered_flag = 0;
Victor Stinner34be8072016-03-14 12:04:26 +0100349 char *opt;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 PyCompilerFlags cf;
Antoine Pitrou69994412014-04-29 00:56:08 +0200351 PyObject *warning_option = NULL;
352 PyObject *warning_options = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 cf.cf_flags = 0;
Guido van Rossum393661d2001-08-31 17:40:15 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 orig_argc = argc; /* For Py_GetArgcArgv() */
357 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000358
Antoine Pitrou86838b02012-02-21 19:03:47 +0100359 /* Hash randomization needed early for all string operations
360 (including -W and -X options). */
Ezio Melottia0dd22e2012-11-23 18:48:32 +0200361 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
Antoine Pitrou86838b02012-02-21 19:03:47 +0100362 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
363 if (c == 'm' || c == 'c') {
364 /* -c / -m is the last option: following arguments are
365 not interpreter options. */
366 break;
367 }
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500368 if (c == 'E') {
Antoine Pitrou86838b02012-02-21 19:03:47 +0100369 Py_IgnoreEnvironmentFlag++;
370 break;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100371 }
372 }
Antoine Pitrou86838b02012-02-21 19:03:47 +0100373
Victor Stinner34be8072016-03-14 12:04:26 +0100374 opt = Py_GETENV("PYTHONMALLOC");
375 if (_PyMem_SetupAllocators(opt) < 0) {
376 fprintf(stderr,
377 "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", opt);
378 exit(1);
379 }
380
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500381 Py_HashRandomizationFlag = 1;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100382 _PyRandom_Init();
383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 PySys_ResetWarnOptions();
Antoine Pitrou86838b02012-02-21 19:03:47 +0100385 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
388 if (c == 'c') {
389 size_t len;
390 /* -c is the last option; following arguments
391 that look like options are left for the
392 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 len = wcslen(_PyOS_optarg) + 1 + 1;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200395 command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 if (command == NULL)
397 Py_FatalError(
398 "not enough memory to copy -c argument");
399 wcscpy(command, _PyOS_optarg);
400 command[len - 2] = '\n';
401 command[len - 1] = 0;
402 break;
403 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 if (c == 'm') {
406 /* -m is the last option; following arguments
407 that look like options are left for the
408 module to interpret. */
409 module = _PyOS_optarg;
410 break;
411 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 switch (c) {
414 case 'b':
415 Py_BytesWarningFlag++;
416 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 case 'd':
419 Py_DebugFlag++;
420 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 case 'i':
423 Py_InspectFlag++;
424 Py_InteractiveFlag++;
425 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000426
Christian Heimesad73a9c2013-08-10 16:36:18 +0200427 case 'I':
428 Py_IsolatedFlag++;
429 Py_NoUserSiteDirectory++;
430 Py_IgnoreEnvironmentFlag++;
431 break;
432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 case 'O':
436 Py_OptimizeFlag++;
437 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 case 'B':
440 Py_DontWriteBytecodeFlag++;
441 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 case 's':
444 Py_NoUserSiteDirectory++;
445 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 case 'S':
448 Py_NoSiteFlag++;
449 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 case 'E':
Antoine Pitrou86838b02012-02-21 19:03:47 +0100452 /* Already handled above */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 case 't':
456 /* ignored for backwards compatibility */
457 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 case 'u':
460 Py_UnbufferedStdioFlag = 1;
461 saw_unbuffered_flag = 1;
462 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 case 'v':
465 Py_VerboseFlag++;
466 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 case 'x':
469 skipfirstline = 1;
470 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 case 'h':
473 case '?':
474 help++;
475 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 case 'V':
478 version++;
479 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 case 'W':
Antoine Pitrou69994412014-04-29 00:56:08 +0200482 if (warning_options == NULL)
483 warning_options = PyList_New(0);
484 if (warning_options == NULL)
485 Py_FatalError("failure in handling of -W argument");
486 warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
487 if (warning_option == NULL)
488 Py_FatalError("failure in handling of -W argument");
Christian Heimes27527072016-09-09 00:08:35 +0200489 if (PyList_Append(warning_options, warning_option) == -1)
490 Py_FatalError("failure in handling of -W argument");
Antoine Pitrou69994412014-04-29 00:56:08 +0200491 Py_DECREF(warning_option);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000493
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000494 case 'X':
495 PySys_AddXOption(_PyOS_optarg);
496 break;
497
Georg Brandl9d871192010-12-04 10:47:18 +0000498 case 'q':
Georg Brandl8aa7e992010-12-28 18:30:18 +0000499 Py_QuietFlag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000500 break;
501
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100502 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500503 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100504 break;
505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 default:
509 return usage(2, argv[0]);
510 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 }
513 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 if (help)
516 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 if (version) {
INADA Naoki0e175a62016-11-21 20:57:14 +0900519 printf("Python %s\n", version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 return 0;
521 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 if (!Py_InspectFlag &&
524 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
525 Py_InspectFlag = 1;
526 if (!saw_unbuffered_flag &&
527 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
528 Py_UnbufferedStdioFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 if (!Py_NoUserSiteDirectory &&
531 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
532 Py_NoUserSiteDirectory = 1;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000533
Philip Jenveye53de3d2010-04-14 03:01:39 +0000534#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
536 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800537 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000538
Victor Stinner1a7425f2013-07-07 16:25:15 +0200539 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (buf == NULL)
541 Py_FatalError(
542 "not enough memory to copy PYTHONWARNINGS");
543 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800544 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800546 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 PySys_AddWarnOption(warning);
548 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200549 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000551#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
553 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000554 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* settle for strtok here as there's no one standard
557 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200558 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 if (buf == NULL)
560 Py_FatalError(
561 "not enough memory to copy PYTHONWARNINGS");
562 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200563 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 setlocale(LC_ALL, "");
565 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000566#ifdef __APPLE__
567 /* Use utf-8 on Mac OS X */
568 unicode = PyUnicode_FromString(p);
569#else
Victor Stinner1b579672011-12-17 05:47:23 +0100570 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000571#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100572 if (unicode == NULL) {
573 /* ignore errors */
574 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000575 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100576 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000577 PySys_AddWarnOptionUnicode(unicode);
578 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 }
580 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200581 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200582 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000584#endif
Antoine Pitrou69994412014-04-29 00:56:08 +0200585 if (warning_options != NULL) {
586 Py_ssize_t i;
587 for (i = 0; i < PyList_GET_SIZE(warning_options); i++) {
588 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(warning_options, i));
589 }
590 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 if (command == NULL && module == NULL && _PyOS_optind < argc &&
593 wcscmp(argv[_PyOS_optind], L"-") != 0)
594 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 filename = argv[_PyOS_optind];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 }
Guido van Rossum775af911997-02-14 19:50:32 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000599
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000600#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000601 /* don't translate newlines (\r\n <=> \n) */
602 _setmode(fileno(stdin), O_BINARY);
603 _setmode(fileno(stdout), O_BINARY);
604 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000605#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000606
607 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000608#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
610 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
611 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000612#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 setbuf(stdin, (char *)NULL);
614 setbuf(stdout, (char *)NULL);
615 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000616#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 }
618 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000619#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 /* Doesn't have to have line-buffered -- use unbuffered */
621 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
622 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000623#else /* !MS_WINDOWS */
624#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
626 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000627#endif /* HAVE_SETVBUF */
628#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 /* Leave stderr alone - it should be unbuffered anyway. */
630 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000631
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000632#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 /* On MacOS X, when the Python interpreter is embedded in an
634 application bundle, it gets executed by a bootstrapping script
635 that does os.execve() with an argv[0] that's different from the
636 actual Python executable. This is needed to keep the Finder happy,
637 or rather, to work around Apple's overly strict requirements of
638 the process name. However, we still need a usable sys.executable,
639 so the actual executable path is passed in an environment variable.
640 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
641 script. */
642 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
643 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200644 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000645
Victor Stinner1a7425f2013-07-07 16:25:15 +0200646 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 if (buffer == NULL) {
648 Py_FatalError(
649 "not enough memory to copy PYTHONEXECUTABLE");
650 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000651
Brett Cannonb94767f2011-02-22 20:15:44 +0000652 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_SetProgramName(buffer);
654 /* buffer is now handed off - do not free */
655 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100656#ifdef WITH_NEXT_FRAMEWORK
657 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
658
659 if (pyvenv_launcher && *pyvenv_launcher) {
660 /* Used by Mac/Tools/pythonw.c to forward
661 * the argv0 of the stub executable
662 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200663 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100664
665 if (wbuf == NULL) {
666 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
667 }
668 Py_SetProgramName(wbuf);
669
670 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000671 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100672 */
673 } else {
674 Py_SetProgramName(argv[0]);
675 }
676#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000680#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 Py_Initialize();
Antoine Pitrou69994412014-04-29 00:56:08 +0200684 Py_XDECREF(warning_options);
Guido van Rossumed52aac1997-07-19 19:20:32 +0000685
Georg Brandl8aa7e992010-12-28 18:30:18 +0000686 if (!Py_QuietFlag && (Py_VerboseFlag ||
Georg Brandl9d871192010-12-04 10:47:18 +0000687 (command == NULL && filename == NULL &&
688 module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 fprintf(stderr, "Python %s on %s\n",
690 Py_GetVersion(), Py_GetPlatform());
691 if (!Py_NoSiteFlag)
692 fprintf(stderr, "%s\n", COPYRIGHT);
693 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 if (command != NULL) {
696 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
697 _PyOS_optind--;
698 argv[_PyOS_optind] = L"-c";
699 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 if (module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000702 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000704 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Steve Dower313523c2016-09-17 12:22:41 -0700710 isatty(fileno(stdin)) &&
711 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 PyObject *v;
713 v = PyImport_ImportModule("readline");
714 if (v == NULL)
715 PyErr_Clear();
716 else
717 Py_DECREF(v);
718 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 if (command) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000721 sts = run_command(command, &cf);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200722 PyMem_RawFree(command);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 } else if (module) {
Senthil Kumaranf01a3372012-07-04 19:28:16 -0700724 sts = (RunModule(module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 }
726 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 if (filename == NULL && stdin_is_interactive) {
729 Py_InspectFlag = 0; /* do exit on SystemExit */
730 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200731 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 }
733 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 if (filename != NULL) {
738 sts = RunMainFromImporter(filename);
739 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 if (sts==-1 && filename!=NULL) {
Victor Stinner9a6692f2010-10-14 10:51:24 +0000742 fp = _Py_wfopen(filename, L"r");
743 if (fp == NULL) {
744 char *cfilename_buffer;
745 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100746 int err = errno;
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200747 cfilename_buffer = Py_EncodeLocale(filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000748 if (cfilename_buffer != NULL)
749 cfilename = cfilename_buffer;
750 else
751 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100753 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000754 if (cfilename_buffer)
755 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 return 2;
757 }
758 else if (skipfirstline) {
759 int ch;
760 /* Push back first newline so line numbers
761 remain the same */
762 while ((ch = getc(fp)) != EOF) {
763 if (ch == '\n') {
764 (void)ungetc(ch, fp);
765 break;
766 }
767 }
768 }
769 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800770 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200771 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200773 fprintf(stderr,
774 "%ls: '%ls' is a directory, cannot continue\n",
775 argv[0], filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 fclose(fp);
777 return 1;
778 }
779 }
780 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000781
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000782 if (sts == -1)
783 sts = run_file(fp, filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 /* Check this environment variable at the end, to give programs the
787 * opportunity to set it from Python.
788 */
789 if (!Py_InspectFlag &&
790 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
791 {
792 Py_InspectFlag = 1;
793 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 if (Py_InspectFlag && stdin_is_interactive &&
796 (filename != NULL || command != NULL || module != NULL)) {
797 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200798 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 /* XXX */
800 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
801 }
802
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000803 if (Py_FinalizeEx() < 0) {
804 /* Value unlikely to be confused with a non-error exit status or
805 other special meaning */
806 sts = 120;
807 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000808
809#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 /* Insure++ is a memory analysis tool that aids in discovering
811 * memory leaks and other memory problems. On Python exit, the
812 * interned string dictionaries are flagged as being in use at exit
813 * (which it is). Under normal circumstances, this is fine because
814 * the memory will be automatically reclaimed by the system. Under
815 * memory debugging, it's a huge source of useless noise, so we
816 * trade off slower shutdown for less distraction in the memory
817 * reports. -baw
818 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000820#endif /* __INSURE__ */
821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000823}
824
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000825/* this is gonna seem *real weird*, but if you put some other code between
826 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
827 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000828
Guido van Rossum667d7041995-08-04 04:20:48 +0000829/* Make the *original* argc/argv available to other modules.
830 This is rare, but it is needed by the secureware extension. */
831
832void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000833Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 *argc = orig_argc;
836 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000837}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000838
839#ifdef __cplusplus
840}
841#endif