blob: 7777db1a9610b178edeb8b19f83990a6f3fa2206 [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 Coghlane2ebb2d2006-03-15 11:00:26 +0000152 runmodule = PyObject_GetAttrString(runpy, "run_module");
153 if (runmodule == NULL) {
154 fprintf(stderr, "Could not access runpy.run_module\n");
155 Py_DECREF(runpy);
156 return -1;
157 }
158 runargs = Py_BuildValue("sOsO", module,
159 Py_None, "__main__", Py_True);
160 if (runargs == NULL) {
161 fprintf(stderr,
162 "Could not create arguments for runpy.run_module\n");
163 Py_DECREF(runpy);
164 Py_DECREF(runmodule);
165 return -1;
166 }
167 result = PyObject_Call(runmodule, runargs, NULL);
168 if (result == NULL) {
169 PyErr_Print();
170 }
171 Py_DECREF(runpy);
172 Py_DECREF(runmodule);
173 Py_DECREF(runargs);
174 if (result == NULL) {
175 return -1;
176 }
177 Py_DECREF(result);
178 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000179}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000180
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000181/* Wait until threading._shutdown completes, provided
182 the threading module was imported in the first place.
183 The shutdown routine will wait until all non-daemon
184 "threading" threads have completed. */
185#include "abstract.h"
186static void
Brett Cannond14ef772007-01-05 21:45:09 +0000187WaitForThreadShutdown(void)
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000188{
189#ifdef WITH_THREAD
190 PyObject *result;
191 PyThreadState *tstate = PyThreadState_GET();
192 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
193 "threading");
194 if (threading == NULL) {
195 /* threading not imported */
196 PyErr_Clear();
197 return;
198 }
199 result = PyObject_CallMethod(threading, "_shutdown", "");
200 if (result == NULL)
201 PyErr_WriteUnraisable(threading);
202 else
203 Py_DECREF(result);
204 Py_DECREF(threading);
205#endif
206}
207
Guido van Rossum667d7041995-08-04 04:20:48 +0000208/* Main program */
209
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000210int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000211Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000212{
213 int c;
214 int sts;
215 char *command = NULL;
216 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000217 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000218 FILE *fp = stdin;
219 char *p;
Guido van Rossum667d7041995-08-04 04:20:48 +0000220 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000221 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000222 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000223 int help = 0;
224 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000225 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000226 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000227
Guido van Rossum393661d2001-08-31 17:40:15 +0000228 cf.cf_flags = 0;
229
Guido van Rossumac56b031996-07-21 02:33:38 +0000230 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000231 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000232
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000233#ifdef RISCOS
234 Py_RISCOSWimpFlag = 0;
235#endif
236
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000237 PySys_ResetWarnOptions();
238
Guido van Rossumbceccf52001-04-10 22:07:43 +0000239 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000240 if (c == 'c') {
241 /* -c is the last option; following arguments
242 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000243 command to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000244 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000245 if (command == NULL)
246 Py_FatalError(
247 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000248 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000249 strcat(command, "\n");
250 break;
251 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000252
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000253 if (c == 'm') {
254 /* -m is the last option; following arguments
255 that look like options are left for the
256 module to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000257 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000258 if (module == NULL)
259 Py_FatalError(
260 "not enough memory to copy -m argument");
261 strcpy(module, _PyOS_optarg);
262 break;
263 }
264
Guido van Rossum667d7041995-08-04 04:20:48 +0000265 switch (c) {
266
267 case 'd':
268 Py_DebugFlag++;
269 break;
270
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000271 case '3':
272 Py_Py3kWarningFlag++;
273 break;
274
Guido van Rossum61c345f2001-09-04 03:26:15 +0000275 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000276 if (strcmp(_PyOS_optarg, "old") == 0) {
277 Py_DivisionWarningFlag = 0;
278 break;
279 }
280 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000281 Py_DivisionWarningFlag = 1;
282 break;
283 }
284 if (strcmp(_PyOS_optarg, "warnall") == 0) {
285 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000286 break;
287 }
288 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000289 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000290 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000291 /* And this tells the eval loop to treat
292 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
293 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000294 break;
295 }
296 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000297 "-Q option should be `-Qold', "
298 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000299 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000300 /* NOTREACHED */
301
Guido van Rossum667d7041995-08-04 04:20:48 +0000302 case 'i':
Georg Brandl49aafc92007-03-07 00:34:46 +0000303 Py_InspectFlag++;
Guido van Rossum775af911997-02-14 19:50:32 +0000304 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000305 break;
306
Guido van Rossum7614da61997-03-03 19:14:45 +0000307 case 'O':
308 Py_OptimizeFlag++;
309 break;
310
Guido van Rossum7922bd71997-08-29 22:34:47 +0000311 case 'S':
312 Py_NoSiteFlag++;
313 break;
314
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000315 case 'E':
316 Py_IgnoreEnvironmentFlag++;
317 break;
318
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000319 case 't':
320 Py_TabcheckFlag++;
321 break;
322
Guido van Rossum667d7041995-08-04 04:20:48 +0000323 case 'u':
324 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000325 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000326 break;
327
328 case 'v':
329 Py_VerboseFlag++;
330 break;
331
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000332#ifdef RISCOS
333 case 'w':
334 Py_RISCOSWimpFlag = 1;
335 break;
336#endif
337
Guido van Rossuma075ce11997-12-05 21:56:45 +0000338 case 'x':
339 skipfirstline = 1;
340 break;
341
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000342 case 'U':
343 Py_UnicodeFlag++;
344 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000345 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000346 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000347 help++;
348 break;
349 case 'V':
350 version++;
351 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000352
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000353 case 'W':
354 PySys_AddWarnOption(_PyOS_optarg);
355 break;
356
Guido van Rossum667d7041995-08-04 04:20:48 +0000357 /* This space reserved for other options */
358
359 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000360 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000361 /*NOTREACHED*/
362
363 }
364 }
365
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000366 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000367 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000368
369 if (version) {
370 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000371 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000372 }
373
Georg Brandl49aafc92007-03-07 00:34:46 +0000374 if (!Py_InspectFlag &&
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000375 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
Georg Brandl49aafc92007-03-07 00:34:46 +0000376 Py_InspectFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000377 if (!saw_unbuffered_flag &&
378 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
379 unbuffered = 1;
380
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000381 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000382 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000383 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000384#ifdef __VMS
385 filename = decc$translate_vms(argv[_PyOS_optind]);
386 if (filename == (char *)0 || filename == (char *)-1)
387 filename = argv[_PyOS_optind];
388
389#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000390 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000391#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000392 if (filename != NULL) {
393 if ((fp = fopen(filename, "r")) == NULL) {
Martin v. Löwis4d4dfb72004-08-19 11:07:49 +0000394#ifdef HAVE_STRERROR
395 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
396 argv[0], filename, errno, strerror(errno));
397#else
398 fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
399 argv[0], filename, errno);
400#endif
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000401 return 2;
Guido van Rossum775af911997-02-14 19:50:32 +0000402 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000403 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000404 int ch;
405 /* Push back first newline so line numbers
406 remain the same */
407 while ((ch = getc(fp)) != EOF) {
408 if (ch == '\n') {
409 (void)ungetc(ch, fp);
410 break;
411 }
412 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000413 }
Neal Norwitz11bd1192005-10-03 00:54:56 +0000414 {
415 /* XXX: does this work on Win/Win64? (see posix_fstat) */
416 struct stat sb;
417 if (fstat(fileno(fp), &sb) == 0 &&
418 S_ISDIR(sb.st_mode)) {
Neal Norwitz72c2c062006-03-09 05:58:11 +0000419 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
420 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