blob: 417b3f2bf39c5b8c40813d5d5dfa9a037e3c0b3f [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"
Jeremy Hyltonec97a282005-10-21 14:58:06 +00005#include "code.h" /* For CO_FUTURE_DIVISION */
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00006#include "import.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00007
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00008#ifdef __VMS
Martin v. Löwis7a924e62003-03-05 14:15:21 +00009#include <unixlib.h>
Martin v. Löwis79acb9e2002-12-06 12:48:53 +000010#endif
11
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +000012#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwisa43190b2006-05-22 09:15:18 +000013#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000014#include <fcntl.h>
15#endif
Martin v. Löwisa43190b2006-05-22 09:15:18 +000016#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000017
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000018#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000019#define PYTHONHOMEHELP "<prefix>\\lib"
20#else
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000021#if defined(PYOS_OS2) && defined(PYCC_GCC)
22#define PYTHONHOMEHELP "<prefix>/Lib"
23#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000024#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000025#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000026#endif
Guido van Rossuma075ce11997-12-05 21:56:45 +000027
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
Anthony Baxterac6bd462006-04-13 02:06:09 +000034#ifdef __cplusplus
35extern "C" {
36#endif
37
Guido van Rossumac56b031996-07-21 02:33:38 +000038/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum667d7041995-08-04 04:20:48 +000039static char **orig_argv;
40static int orig_argc;
41
Guido van Rossumbceccf52001-04-10 22:07:43 +000042/* command line options */
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +000043#define BASE_OPTS "3c:dEhim:OQ:StuUvVW:xX?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000044
45#ifndef RISCOS
46#define PROGRAM_OPTS BASE_OPTS
47#else /*RISCOS*/
48/* extra option saying that we are running under a special task window
49 frontend; especially my_readline will behave different */
50#define PROGRAM_OPTS BASE_OPTS "w"
51/* corresponding flag */
Guido van Rossum3ed4c152001-03-02 06:18:03 +000052extern int Py_RISCOSWimpFlag;
Guido van Rossumbceccf52001-04-10 22:07:43 +000053#endif /*RISCOS*/
Guido van Rossum3ed4c152001-03-02 06:18:03 +000054
Guido van Rossum667d7041995-08-04 04:20:48 +000055/* Short usage message (with %s for argv0) */
56static char *usage_line =
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000057"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000058
59/* Long usage message, split into parts < 512 bytes */
Guido van Rossum393661d2001-08-31 17:40:15 +000060static char *usage_1 = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000061Options and arguments (and corresponding environment variables):\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000062-c cmd : program passed in as string (terminates option list)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000063-d : debug output from parser; also PYTHONDEBUG=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000064-E : ignore environment variables (such as PYTHONPATH)\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000065-h : print this help message and exit (also --help)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000066-i : inspect interactively after running script; forces a prompt even\n\
67 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000068";
69static char *usage_2 = "\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000070-m mod : run library module as a script (terminates option list)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000071-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000072-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum1832de42001-09-04 03:51:09 +000073-Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000074-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000075-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000076-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000077";
78static char *usage_3 = "\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000079 see man page for details on internal buffering relating to '-u'\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000080-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
81 can be supplied multiple times to increase verbosity\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000082-V : print the Python version number and exit (also --version)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000083-W arg : warning control; arg is action:message:category:module:lineno\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000084-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +000085-3 : warn about Python 3.x incompatibilities\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000086file : program read from script file\n\
87- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000088";
Guido van Rossum393661d2001-08-31 17:40:15 +000089static char *usage_4 = "\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000090arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000091Other environment variables:\n\
92PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000093PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000094 default module search path. The result is sys.path.\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000095PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
96 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +000097PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000098";
99
100
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000101static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000102usage(int exitcode, char* program)
103{
Guido van Rossum393661d2001-08-31 17:40:15 +0000104 FILE *f = exitcode ? stderr : stdout;
105
106 fprintf(f, usage_line, program);
107 if (exitcode)
108 fprintf(f, "Try `python -h' for more information.\n");
109 else {
110 fprintf(f, usage_1);
111 fprintf(f, usage_2);
112 fprintf(f, usage_3);
113 fprintf(f, usage_4, DELIM, DELIM, PYTHONHOMEHELP);
114 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000115#if defined(__VMS)
116 if (exitcode == 0) {
117 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000118 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000119 }
120 else {
121 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000122 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000123 }
124#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000125 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000126#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000127 /*NOTREACHED*/
128}
129
Martin v. Löwis6caea372003-11-18 19:46:25 +0000130static void RunStartupFile(PyCompilerFlags *cf)
131{
132 char *startup = Py_GETENV("PYTHONSTARTUP");
133 if (startup != NULL && startup[0] != '\0') {
134 FILE *fp = fopen(startup, "r");
135 if (fp != NULL) {
136 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
137 PyErr_Clear();
138 fclose(fp);
139 }
140 }
141}
142
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000143
144static int RunModule(char *module)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000145{
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000146 PyObject *runpy, *runmodule, *runargs, *result;
147 runpy = PyImport_ImportModule("runpy");
148 if (runpy == NULL) {
149 fprintf(stderr, "Could not import runpy module\n");
150 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000151 }
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000152 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000153 if (runmodule == NULL) {
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000154 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000155 Py_DECREF(runpy);
156 return -1;
157 }
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000158 runargs = Py_BuildValue("(s)", module);
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000159 if (runargs == NULL) {
160 fprintf(stderr,
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000161 "Could not create arguments for runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000162 Py_DECREF(runpy);
163 Py_DECREF(runmodule);
164 return -1;
165 }
166 result = PyObject_Call(runmodule, runargs, NULL);
167 if (result == NULL) {
168 PyErr_Print();
169 }
170 Py_DECREF(runpy);
171 Py_DECREF(runmodule);
172 Py_DECREF(runargs);
173 if (result == NULL) {
174 return -1;
175 }
176 Py_DECREF(result);
177 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000178}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000179
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000180/* Wait until threading._shutdown completes, provided
181 the threading module was imported in the first place.
182 The shutdown routine will wait until all non-daemon
183 "threading" threads have completed. */
184#include "abstract.h"
185static void
Brett Cannond14ef772007-01-05 21:45:09 +0000186WaitForThreadShutdown(void)
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000187{
188#ifdef WITH_THREAD
189 PyObject *result;
190 PyThreadState *tstate = PyThreadState_GET();
191 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
192 "threading");
193 if (threading == NULL) {
194 /* threading not imported */
195 PyErr_Clear();
196 return;
197 }
198 result = PyObject_CallMethod(threading, "_shutdown", "");
199 if (result == NULL)
200 PyErr_WriteUnraisable(threading);
201 else
202 Py_DECREF(result);
203 Py_DECREF(threading);
204#endif
205}
206
Guido van Rossum667d7041995-08-04 04:20:48 +0000207/* Main program */
208
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000209int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000210Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000211{
212 int c;
213 int sts;
214 char *command = NULL;
215 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000216 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000217 FILE *fp = stdin;
218 char *p;
Guido van Rossum667d7041995-08-04 04:20:48 +0000219 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000220 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000221 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000222 int help = 0;
223 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000224 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000225 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000226
Guido van Rossum393661d2001-08-31 17:40:15 +0000227 cf.cf_flags = 0;
228
Guido van Rossumac56b031996-07-21 02:33:38 +0000229 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000230 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000231
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000232#ifdef RISCOS
233 Py_RISCOSWimpFlag = 0;
234#endif
235
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000236 PySys_ResetWarnOptions();
237
Guido van Rossumbceccf52001-04-10 22:07:43 +0000238 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000239 if (c == 'c') {
240 /* -c is the last option; following arguments
241 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000242 command to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000243 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000244 if (command == NULL)
245 Py_FatalError(
246 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000247 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000248 strcat(command, "\n");
249 break;
250 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000251
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000252 if (c == 'm') {
253 /* -m is the last option; following arguments
254 that look like options are left for the
255 module to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000256 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000257 if (module == NULL)
258 Py_FatalError(
259 "not enough memory to copy -m argument");
260 strcpy(module, _PyOS_optarg);
261 break;
262 }
263
Guido van Rossum667d7041995-08-04 04:20:48 +0000264 switch (c) {
265
266 case 'd':
267 Py_DebugFlag++;
268 break;
269
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000270 case '3':
271 Py_Py3kWarningFlag++;
272 break;
273
Guido van Rossum61c345f2001-09-04 03:26:15 +0000274 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000275 if (strcmp(_PyOS_optarg, "old") == 0) {
276 Py_DivisionWarningFlag = 0;
277 break;
278 }
279 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000280 Py_DivisionWarningFlag = 1;
281 break;
282 }
283 if (strcmp(_PyOS_optarg, "warnall") == 0) {
284 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000285 break;
286 }
287 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000288 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000289 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000290 /* And this tells the eval loop to treat
291 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
292 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000293 break;
294 }
295 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000296 "-Q option should be `-Qold', "
297 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000298 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000299 /* NOTREACHED */
300
Guido van Rossum667d7041995-08-04 04:20:48 +0000301 case 'i':
Georg Brandl49aafc92007-03-07 00:34:46 +0000302 Py_InspectFlag++;
Guido van Rossum775af911997-02-14 19:50:32 +0000303 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000304 break;
305
Guido van Rossum7614da61997-03-03 19:14:45 +0000306 case 'O':
307 Py_OptimizeFlag++;
308 break;
309
Guido van Rossum7922bd71997-08-29 22:34:47 +0000310 case 'S':
311 Py_NoSiteFlag++;
312 break;
313
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000314 case 'E':
315 Py_IgnoreEnvironmentFlag++;
316 break;
317
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000318 case 't':
319 Py_TabcheckFlag++;
320 break;
321
Guido van Rossum667d7041995-08-04 04:20:48 +0000322 case 'u':
323 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000324 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000325 break;
326
327 case 'v':
328 Py_VerboseFlag++;
329 break;
330
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000331#ifdef RISCOS
332 case 'w':
333 Py_RISCOSWimpFlag = 1;
334 break;
335#endif
336
Guido van Rossuma075ce11997-12-05 21:56:45 +0000337 case 'x':
338 skipfirstline = 1;
339 break;
340
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000341 case 'U':
342 Py_UnicodeFlag++;
343 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000344 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000345 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000346 help++;
347 break;
348 case 'V':
349 version++;
350 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000351
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000352 case 'W':
353 PySys_AddWarnOption(_PyOS_optarg);
354 break;
355
Guido van Rossum667d7041995-08-04 04:20:48 +0000356 /* This space reserved for other options */
357
358 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000359 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000360 /*NOTREACHED*/
361
362 }
363 }
364
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000365 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000366 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000367
368 if (version) {
369 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000370 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000371 }
372
Georg Brandl49aafc92007-03-07 00:34:46 +0000373 if (!Py_InspectFlag &&
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000374 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
Georg Brandl49aafc92007-03-07 00:34:46 +0000375 Py_InspectFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000376 if (!saw_unbuffered_flag &&
377 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
378 unbuffered = 1;
379
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000380 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000381 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000382 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000383#ifdef __VMS
384 filename = decc$translate_vms(argv[_PyOS_optind]);
385 if (filename == (char *)0 || filename == (char *)-1)
386 filename = argv[_PyOS_optind];
387
388#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000389 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000390#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000391 if (filename != NULL) {
392 if ((fp = fopen(filename, "r")) == NULL) {
Martin v. Löwis4d4dfb72004-08-19 11:07:49 +0000393#ifdef HAVE_STRERROR
394 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
395 argv[0], filename, errno, strerror(errno));
396#else
397 fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
398 argv[0], filename, errno);
399#endif
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000400 return 2;
Guido van Rossum775af911997-02-14 19:50:32 +0000401 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000402 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000403 int ch;
404 /* Push back first newline so line numbers
405 remain the same */
406 while ((ch = getc(fp)) != EOF) {
407 if (ch == '\n') {
408 (void)ungetc(ch, fp);
409 break;
410 }
411 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000412 }
Neal Norwitz11bd1192005-10-03 00:54:56 +0000413 {
414 /* XXX: does this work on Win/Win64? (see posix_fstat) */
415 struct stat sb;
416 if (fstat(fileno(fp), &sb) == 0 &&
417 S_ISDIR(sb.st_mode)) {
Neal Norwitz72c2c062006-03-09 05:58:11 +0000418 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
Neal Norwitze545ff32007-10-12 03:03:23 +0000419 fclose(fp);
Neal Norwitz72c2c062006-03-09 05:58:11 +0000420 return 1;
Neal Norwitz11bd1192005-10-03 00:54:56 +0000421 }
422 }
Guido van Rossum775af911997-02-14 19:50:32 +0000423 }
424 }
425
426 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
427
Guido van Rossum667d7041995-08-04 04:20:48 +0000428 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000429#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000430 _setmode(fileno(stdin), O_BINARY);
431 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000432#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000433#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000434 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
435 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
436 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000437#else /* !HAVE_SETVBUF */
438 setbuf(stdin, (char *)NULL);
439 setbuf(stdout, (char *)NULL);
440 setbuf(stderr, (char *)NULL);
441#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000442 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000443 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000444#ifdef MS_WINDOWS
445 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000446 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000447 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000448#else /* !MS_WINDOWS */
449#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000450 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
451 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000452#endif /* HAVE_SETVBUF */
453#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000454 /* Leave stderr alone - it should be unbuffered anyway. */
455 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000456#ifdef __VMS
457 else {
458 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
459 }
460#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000461
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000462#ifdef __APPLE__
463 /* On MacOS X, when the Python interpreter is embedded in an
464 application bundle, it gets executed by a bootstrapping script
465 that does os.execve() with an argv[0] that's different from the
466 actual Python executable. This is needed to keep the Finder happy,
467 or rather, to work around Apple's overly strict requirements of
468 the process name. However, we still need a usable sys.executable,
469 so the actual executable path is passed in an environment variable.
470 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
471 script. */
472 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
473 Py_SetProgramName(p);
474 else
475 Py_SetProgramName(argv[0]);
476#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000477 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000478#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000479 Py_Initialize();
480
Guido van Rossum667d7041995-08-04 04:20:48 +0000481 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000482 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000483 fprintf(stderr, "Python %s on %s\n",
484 Py_GetVersion(), Py_GetPlatform());
485 if (!Py_NoSiteFlag)
486 fprintf(stderr, "%s\n", COPYRIGHT);
487 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000488
Guido van Rossum667d7041995-08-04 04:20:48 +0000489 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000490 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
491 _PyOS_optind--;
492 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000493 }
494
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000495 if (module != NULL) {
Nick Coghlan81f444b2006-06-12 10:17:11 +0000496 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
497 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000498 _PyOS_optind--;
Nick Coghlan81f444b2006-06-12 10:17:11 +0000499 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000500 }
501
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000502 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000503
Georg Brandl49aafc92007-03-07 00:34:46 +0000504 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000505 isatty(fileno(stdin))) {
506 PyObject *v;
507 v = PyImport_ImportModule("readline");
508 if (v == NULL)
509 PyErr_Clear();
510 else
511 Py_DECREF(v);
512 }
513
Guido van Rossum667d7041995-08-04 04:20:48 +0000514 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000515 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000516 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000517 } else if (module) {
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000518 sts = RunModule(module);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000519 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000520 }
521 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000522 if (filename == NULL && stdin_is_interactive) {
Georg Brandl49aafc92007-03-07 00:34:46 +0000523 Py_InspectFlag = 0; /* do exit on SystemExit */
Martin v. Löwis6caea372003-11-18 19:46:25 +0000524 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000525 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000526 /* XXX */
527 sts = PyRun_AnyFileExFlags(
Guido van Rossum775af911997-02-14 19:50:32 +0000528 fp,
Guido van Rossum0df002c2000-08-27 19:21:52 +0000529 filename == NULL ? "<stdin>" : filename,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000530 filename != NULL, &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000531 }
532
Barry Warsawd86dcd32003-06-29 17:07:06 +0000533 /* Check this environment variable at the end, to give programs the
534 * opportunity to set it from Python.
535 */
Georg Brandl49aafc92007-03-07 00:34:46 +0000536 if (!Py_InspectFlag &&
Barry Warsawd86dcd32003-06-29 17:07:06 +0000537 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
538 {
Georg Brandl49aafc92007-03-07 00:34:46 +0000539 Py_InspectFlag = 1;
Barry Warsawd86dcd32003-06-29 17:07:06 +0000540 }
541
Georg Brandl49aafc92007-03-07 00:34:46 +0000542 if (Py_InspectFlag && stdin_is_interactive &&
543 (filename != NULL || command != NULL || module != NULL)) {
544 Py_InspectFlag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000545 /* XXX */
546 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Georg Brandl49aafc92007-03-07 00:34:46 +0000547 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000548
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000549 WaitForThreadShutdown();
550
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000551 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000552#ifdef RISCOS
Fred Drake5134a542002-10-17 20:37:50 +0000553 if (Py_RISCOSWimpFlag)
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000554 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
555#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000556
557#ifdef __INSURE__
558 /* Insure++ is a memory analysis tool that aids in discovering
559 * memory leaks and other memory problems. On Python exit, the
560 * interned string dictionary is flagged as being in use at exit
561 * (which it is). Under normal circumstances, this is fine because
562 * the memory will be automatically reclaimed by the system. Under
563 * memory debugging, it's a huge source of useless noise, so we
564 * trade off slower shutdown for less distraction in the memory
565 * reports. -baw
566 */
567 _Py_ReleaseInternedStrings();
568#endif /* __INSURE__ */
569
Guido van Rossum05f7c501997-08-02 03:00:42 +0000570 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000571}
572
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000573/* this is gonna seem *real weird*, but if you put some other code between
574 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
575 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000576
Guido van Rossum667d7041995-08-04 04:20:48 +0000577/* Make the *original* argc/argv available to other modules.
578 This is rare, but it is needed by the secureware extension. */
579
580void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000581Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000582{
583 *argc = orig_argc;
584 *argv = orig_argv;
585}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000586
587#ifdef __cplusplus
588}
589#endif
590