blob: 7594a762e02fe936a7e8e8c90d28d9ac4d100984 [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 */
Georg Brandl9dceedb2006-07-12 15:31:17 +000043#define BASE_OPTS "c: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\
Guido van Rossum667d7041995-08-04 04:20:48 +000085file : program read from script file\n\
86- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000087";
Guido van Rossum393661d2001-08-31 17:40:15 +000088static char *usage_4 = "\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +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\
Guido van Rossuma075ce11997-12-05 21:56:45 +000092PYTHONPATH : '%c'-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\
Guido van Rossuma075ce11997-12-05 21:56:45 +000094PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
95 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +000096PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000097";
98
99
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000100static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000101usage(int exitcode, char* program)
102{
Guido van Rossum393661d2001-08-31 17:40:15 +0000103 FILE *f = exitcode ? stderr : stdout;
104
105 fprintf(f, usage_line, program);
106 if (exitcode)
107 fprintf(f, "Try `python -h' for more information.\n");
108 else {
109 fprintf(f, usage_1);
110 fprintf(f, usage_2);
111 fprintf(f, usage_3);
112 fprintf(f, usage_4, DELIM, DELIM, PYTHONHOMEHELP);
113 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000114#if defined(__VMS)
115 if (exitcode == 0) {
116 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000117 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000118 }
119 else {
120 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000121 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000122 }
123#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000124 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000125#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000126 /*NOTREACHED*/
127}
128
Martin v. Löwis6caea372003-11-18 19:46:25 +0000129static void RunStartupFile(PyCompilerFlags *cf)
130{
131 char *startup = Py_GETENV("PYTHONSTARTUP");
132 if (startup != NULL && startup[0] != '\0') {
133 FILE *fp = fopen(startup, "r");
134 if (fp != NULL) {
135 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
136 PyErr_Clear();
137 fclose(fp);
138 }
139 }
140}
141
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000142
143static int RunModule(char *module)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000144{
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000145 PyObject *runpy, *runmodule, *runargs, *result;
146 runpy = PyImport_ImportModule("runpy");
147 if (runpy == NULL) {
148 fprintf(stderr, "Could not import runpy module\n");
149 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000150 }
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000151 runmodule = PyObject_GetAttrString(runpy, "run_module");
152 if (runmodule == NULL) {
153 fprintf(stderr, "Could not access runpy.run_module\n");
154 Py_DECREF(runpy);
155 return -1;
156 }
157 runargs = Py_BuildValue("sOsO", module,
158 Py_None, "__main__", Py_True);
159 if (runargs == NULL) {
160 fprintf(stderr,
161 "Could not create arguments for runpy.run_module\n");
162 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;
219 int inspect = 0;
220 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_inspect_flag = 0;
226 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000227 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000228
Guido van Rossum393661d2001-08-31 17:40:15 +0000229 cf.cf_flags = 0;
230
Guido van Rossumac56b031996-07-21 02:33:38 +0000231 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000232 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000233
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000234#ifdef RISCOS
235 Py_RISCOSWimpFlag = 0;
236#endif
237
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000238 PySys_ResetWarnOptions();
239
Guido van Rossumbceccf52001-04-10 22:07:43 +0000240 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000241 if (c == 'c') {
242 /* -c is the last option; following arguments
243 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000244 command to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000245 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000246 if (command == NULL)
247 Py_FatalError(
248 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000249 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000250 strcat(command, "\n");
251 break;
252 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000253
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000254 if (c == 'm') {
255 /* -m is the last option; following arguments
256 that look like options are left for the
257 module to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000258 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000259 if (module == NULL)
260 Py_FatalError(
261 "not enough memory to copy -m argument");
262 strcpy(module, _PyOS_optarg);
263 break;
264 }
265
Guido van Rossum667d7041995-08-04 04:20:48 +0000266 switch (c) {
267
268 case 'd':
269 Py_DebugFlag++;
270 break;
271
Guido van Rossum61c345f2001-09-04 03:26:15 +0000272 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000273 if (strcmp(_PyOS_optarg, "old") == 0) {
274 Py_DivisionWarningFlag = 0;
275 break;
276 }
277 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000278 Py_DivisionWarningFlag = 1;
279 break;
280 }
281 if (strcmp(_PyOS_optarg, "warnall") == 0) {
282 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000283 break;
284 }
285 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000286 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000287 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000288 /* And this tells the eval loop to treat
289 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
290 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000291 break;
292 }
293 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000294 "-Q option should be `-Qold', "
295 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000296 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000297 /* NOTREACHED */
298
Guido van Rossum667d7041995-08-04 04:20:48 +0000299 case 'i':
300 inspect++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000301 saw_inspect_flag = 1;
Guido van Rossum775af911997-02-14 19:50:32 +0000302 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000303 break;
304
Guido van Rossum7614da61997-03-03 19:14:45 +0000305 case 'O':
306 Py_OptimizeFlag++;
307 break;
308
Guido van Rossum7922bd71997-08-29 22:34:47 +0000309 case 'S':
310 Py_NoSiteFlag++;
311 break;
312
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000313 case 'E':
314 Py_IgnoreEnvironmentFlag++;
315 break;
316
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000317 case 't':
318 Py_TabcheckFlag++;
319 break;
320
Guido van Rossum667d7041995-08-04 04:20:48 +0000321 case 'u':
322 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000323 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000324 break;
325
326 case 'v':
327 Py_VerboseFlag++;
328 break;
329
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000330#ifdef RISCOS
331 case 'w':
332 Py_RISCOSWimpFlag = 1;
333 break;
334#endif
335
Guido van Rossuma075ce11997-12-05 21:56:45 +0000336 case 'x':
337 skipfirstline = 1;
338 break;
339
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000340 case 'U':
341 Py_UnicodeFlag++;
342 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000343 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000344 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000345 help++;
346 break;
347 case 'V':
348 version++;
349 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000350
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000351 case 'W':
352 PySys_AddWarnOption(_PyOS_optarg);
353 break;
354
Guido van Rossum667d7041995-08-04 04:20:48 +0000355 /* This space reserved for other options */
356
357 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000358 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000359 /*NOTREACHED*/
360
361 }
362 }
363
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000364 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000365 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000366
367 if (version) {
368 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000369 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000370 }
371
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000372 if (!saw_inspect_flag &&
373 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
374 inspect = 1;
375 if (!saw_unbuffered_flag &&
376 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
377 unbuffered = 1;
378
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000379 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000380 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000381 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000382#ifdef __VMS
383 filename = decc$translate_vms(argv[_PyOS_optind]);
384 if (filename == (char *)0 || filename == (char *)-1)
385 filename = argv[_PyOS_optind];
386
387#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000388 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000389#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000390 if (filename != NULL) {
391 if ((fp = fopen(filename, "r")) == NULL) {
Martin v. Löwis4d4dfb72004-08-19 11:07:49 +0000392#ifdef HAVE_STRERROR
393 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
394 argv[0], filename, errno, strerror(errno));
395#else
396 fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
397 argv[0], filename, errno);
398#endif
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000399 return 2;
Guido van Rossum775af911997-02-14 19:50:32 +0000400 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000401 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000402 int ch;
403 /* Push back first newline so line numbers
404 remain the same */
405 while ((ch = getc(fp)) != EOF) {
406 if (ch == '\n') {
407 (void)ungetc(ch, fp);
408 break;
409 }
410 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000411 }
Neal Norwitz11bd1192005-10-03 00:54:56 +0000412 {
413 /* XXX: does this work on Win/Win64? (see posix_fstat) */
414 struct stat sb;
415 if (fstat(fileno(fp), &sb) == 0 &&
416 S_ISDIR(sb.st_mode)) {
Neal Norwitz72c2c062006-03-09 05:58:11 +0000417 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
418 return 1;
Neal Norwitz11bd1192005-10-03 00:54:56 +0000419 }
420 }
Guido van Rossum775af911997-02-14 19:50:32 +0000421 }
422 }
423
424 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
425
Guido van Rossum667d7041995-08-04 04:20:48 +0000426 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000427#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000428 _setmode(fileno(stdin), O_BINARY);
429 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000430#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000431#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000432 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
433 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
434 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000435#else /* !HAVE_SETVBUF */
436 setbuf(stdin, (char *)NULL);
437 setbuf(stdout, (char *)NULL);
438 setbuf(stderr, (char *)NULL);
439#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000440 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000441 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000442#ifdef MS_WINDOWS
443 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000444 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000445 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000446#else /* !MS_WINDOWS */
447#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000448 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
449 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000450#endif /* HAVE_SETVBUF */
451#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000452 /* Leave stderr alone - it should be unbuffered anyway. */
453 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000454#ifdef __VMS
455 else {
456 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
457 }
458#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000459
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000460#ifdef __APPLE__
461 /* On MacOS X, when the Python interpreter is embedded in an
462 application bundle, it gets executed by a bootstrapping script
463 that does os.execve() with an argv[0] that's different from the
464 actual Python executable. This is needed to keep the Finder happy,
465 or rather, to work around Apple's overly strict requirements of
466 the process name. However, we still need a usable sys.executable,
467 so the actual executable path is passed in an environment variable.
468 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
469 script. */
470 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
471 Py_SetProgramName(p);
472 else
473 Py_SetProgramName(argv[0]);
474#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000475 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000476#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000477 Py_Initialize();
478
Guido van Rossum667d7041995-08-04 04:20:48 +0000479 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000480 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000481 fprintf(stderr, "Python %s on %s\n",
482 Py_GetVersion(), Py_GetPlatform());
483 if (!Py_NoSiteFlag)
484 fprintf(stderr, "%s\n", COPYRIGHT);
485 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000486
Guido van Rossum667d7041995-08-04 04:20:48 +0000487 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000488 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
489 _PyOS_optind--;
490 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000491 }
492
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000493 if (module != NULL) {
Nick Coghlan81f444b2006-06-12 10:17:11 +0000494 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
495 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000496 _PyOS_optind--;
Nick Coghlan81f444b2006-06-12 10:17:11 +0000497 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000498 }
499
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000500 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000501
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000502 if ((inspect || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000503 isatty(fileno(stdin))) {
504 PyObject *v;
505 v = PyImport_ImportModule("readline");
506 if (v == NULL)
507 PyErr_Clear();
508 else
509 Py_DECREF(v);
510 }
511
Guido van Rossum667d7041995-08-04 04:20:48 +0000512 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000513 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000514 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000515 } else if (module) {
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000516 sts = RunModule(module);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000517 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000518 }
519 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000520 if (filename == NULL && stdin_is_interactive) {
Martin v. Löwis6caea372003-11-18 19:46:25 +0000521 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000522 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000523 /* XXX */
524 sts = PyRun_AnyFileExFlags(
Guido van Rossum775af911997-02-14 19:50:32 +0000525 fp,
Guido van Rossum0df002c2000-08-27 19:21:52 +0000526 filename == NULL ? "<stdin>" : filename,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000527 filename != NULL, &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000528 }
529
Barry Warsawd86dcd32003-06-29 17:07:06 +0000530 /* Check this environment variable at the end, to give programs the
531 * opportunity to set it from Python.
532 */
533 if (!saw_inspect_flag &&
534 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
535 {
536 inspect = 1;
537 }
538
Guido van Rossum775af911997-02-14 19:50:32 +0000539 if (inspect && stdin_is_interactive &&
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000540 (filename != NULL || command != NULL || module != NULL))
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000541 /* XXX */
542 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000543
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000544 WaitForThreadShutdown();
545
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000546 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000547#ifdef RISCOS
Fred Drake5134a542002-10-17 20:37:50 +0000548 if (Py_RISCOSWimpFlag)
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000549 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
550#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000551
552#ifdef __INSURE__
553 /* Insure++ is a memory analysis tool that aids in discovering
554 * memory leaks and other memory problems. On Python exit, the
555 * interned string dictionary is flagged as being in use at exit
556 * (which it is). Under normal circumstances, this is fine because
557 * the memory will be automatically reclaimed by the system. Under
558 * memory debugging, it's a huge source of useless noise, so we
559 * trade off slower shutdown for less distraction in the memory
560 * reports. -baw
561 */
562 _Py_ReleaseInternedStrings();
563#endif /* __INSURE__ */
564
Guido van Rossum05f7c501997-08-02 03:00:42 +0000565 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000566}
567
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000568/* this is gonna seem *real weird*, but if you put some other code between
569 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
570 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000571
Guido van Rossum667d7041995-08-04 04:20:48 +0000572/* Make the *original* argc/argv available to other modules.
573 This is rare, but it is needed by the secureware extension. */
574
575void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000576Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000577{
578 *argc = orig_argc;
579 *argv = orig_argv;
580}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000581
582#ifdef __cplusplus
583}
584#endif
585