blob: 80c0c04c3102cfe2f521a3a03503254966c25833 [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\
Guido van Rossum667d7041995-08-04 04:20:48 +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\
Guido van Rossum775af911997-02-14 19:50:32 +000066-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000067 and force prompts, even if stdin does not appear to be a terminal\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\
Guido van Rossume7adf3e1998-10-07 14:50:06 +000071-O : optimize generated bytecode (a tad; 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\
Guido van Rossumbba92ca1998-04-10 19:39:15 +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\
Guido van Rossum7922bd71997-08-29 22:34:47 +000080-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000081-V : print the Python version number and exit (also --version)\n\
Guido van Rossum47f5fdc2000-12-15 22:00:54 +000082-W arg : warning control (arg is action:message:category:module:lineno)\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\
Guido van Rossum667d7041995-08-04 04:20:48 +000084file : program read from script file\n\
85- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000086";
Guido van Rossum393661d2001-08-31 17:40:15 +000087static char *usage_4 = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000088arg ...: arguments passed to program in sys.argv[1:]\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000089Other environment variables:\n\
90PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000091PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000092 default module search path. The result is sys.path.\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000093PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
94 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +000095PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000096";
97
98
Martin v. Löwis852ba7e2003-03-30 17:09:58 +000099static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000100usage(int exitcode, char* program)
101{
Guido van Rossum393661d2001-08-31 17:40:15 +0000102 FILE *f = exitcode ? stderr : stdout;
103
104 fprintf(f, usage_line, program);
105 if (exitcode)
106 fprintf(f, "Try `python -h' for more information.\n");
107 else {
108 fprintf(f, usage_1);
109 fprintf(f, usage_2);
110 fprintf(f, usage_3);
111 fprintf(f, usage_4, DELIM, DELIM, PYTHONHOMEHELP);
112 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000113#if defined(__VMS)
114 if (exitcode == 0) {
115 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000116 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000117 }
118 else {
119 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000120 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000121 }
122#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000123 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000124#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000125 /*NOTREACHED*/
126}
127
Martin v. Löwis6caea372003-11-18 19:46:25 +0000128static void RunStartupFile(PyCompilerFlags *cf)
129{
130 char *startup = Py_GETENV("PYTHONSTARTUP");
131 if (startup != NULL && startup[0] != '\0') {
132 FILE *fp = fopen(startup, "r");
133 if (fp != NULL) {
134 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
135 PyErr_Clear();
136 fclose(fp);
137 }
138 }
139}
140
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000141
142static int RunModule(char *module)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000143{
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000144 PyObject *runpy, *runmodule, *runargs, *result;
145 runpy = PyImport_ImportModule("runpy");
146 if (runpy == NULL) {
147 fprintf(stderr, "Could not import runpy module\n");
148 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000149 }
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000150 runmodule = PyObject_GetAttrString(runpy, "run_module");
151 if (runmodule == NULL) {
152 fprintf(stderr, "Could not access runpy.run_module\n");
153 Py_DECREF(runpy);
154 return -1;
155 }
156 runargs = Py_BuildValue("sOsO", module,
157 Py_None, "__main__", Py_True);
158 if (runargs == NULL) {
159 fprintf(stderr,
160 "Could not create arguments for runpy.run_module\n");
161 Py_DECREF(runpy);
162 Py_DECREF(runmodule);
163 return -1;
164 }
165 result = PyObject_Call(runmodule, runargs, NULL);
166 if (result == NULL) {
167 PyErr_Print();
168 }
169 Py_DECREF(runpy);
170 Py_DECREF(runmodule);
171 Py_DECREF(runargs);
172 if (result == NULL) {
173 return -1;
174 }
175 Py_DECREF(result);
176 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000177}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000178
Martin v. Löwisbea1c702007-01-04 21:06:57 +0000179/* Wait until threading._shutdown completes, provided
180 the threading module was imported in the first place.
181 The shutdown routine will wait until all non-daemon
182 "threading" threads have completed. */
183#include "abstract.h"
184static void
Brett Cannon8012e9c2007-10-12 17:41:08 +0000185WaitForThreadShutdown(void)
Martin v. Löwisbea1c702007-01-04 21:06:57 +0000186{
187#ifdef WITH_THREAD
188 PyObject *result;
189 PyThreadState *tstate = PyThreadState_GET();
190 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
191 "threading");
192 if (threading == NULL) {
193 /* threading not imported */
194 PyErr_Clear();
195 return;
196 }
197 result = PyObject_CallMethod(threading, "_shutdown", "");
198 if (result == NULL)
199 PyErr_WriteUnraisable(threading);
200 else
201 Py_DECREF(result);
202 Py_DECREF(threading);
203#endif
204}
205
Guido van Rossum667d7041995-08-04 04:20:48 +0000206/* Main program */
207
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000208int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000209Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000210{
211 int c;
212 int sts;
213 char *command = NULL;
214 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000215 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000216 FILE *fp = stdin;
217 char *p;
218 int inspect = 0;
219 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_inspect_flag = 0;
225 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
Guido van Rossum61c345f2001-09-04 03:26:15 +0000271 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000272 if (strcmp(_PyOS_optarg, "old") == 0) {
273 Py_DivisionWarningFlag = 0;
274 break;
275 }
276 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000277 Py_DivisionWarningFlag = 1;
278 break;
279 }
280 if (strcmp(_PyOS_optarg, "warnall") == 0) {
281 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000282 break;
283 }
284 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000285 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000286 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000287 /* And this tells the eval loop to treat
288 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
289 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000290 break;
291 }
292 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000293 "-Q option should be `-Qold', "
294 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000295 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000296 /* NOTREACHED */
297
Guido van Rossum667d7041995-08-04 04:20:48 +0000298 case 'i':
299 inspect++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000300 saw_inspect_flag = 1;
Guido van Rossum775af911997-02-14 19:50:32 +0000301 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000302 break;
303
Guido van Rossum7614da61997-03-03 19:14:45 +0000304 case 'O':
305 Py_OptimizeFlag++;
306 break;
307
Guido van Rossum7922bd71997-08-29 22:34:47 +0000308 case 'S':
309 Py_NoSiteFlag++;
310 break;
311
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000312 case 'E':
313 Py_IgnoreEnvironmentFlag++;
314 break;
315
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000316 case 't':
317 Py_TabcheckFlag++;
318 break;
319
Guido van Rossum667d7041995-08-04 04:20:48 +0000320 case 'u':
321 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000322 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000323 break;
324
325 case 'v':
326 Py_VerboseFlag++;
327 break;
328
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000329#ifdef RISCOS
330 case 'w':
331 Py_RISCOSWimpFlag = 1;
332 break;
333#endif
334
Guido van Rossuma075ce11997-12-05 21:56:45 +0000335 case 'x':
336 skipfirstline = 1;
337 break;
338
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000339 case 'U':
340 Py_UnicodeFlag++;
341 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000342 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000343 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000344 help++;
345 break;
346 case 'V':
347 version++;
348 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000349
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000350 case 'W':
351 PySys_AddWarnOption(_PyOS_optarg);
352 break;
353
Guido van Rossum667d7041995-08-04 04:20:48 +0000354 /* This space reserved for other options */
355
356 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000357 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000358 /*NOTREACHED*/
359
360 }
361 }
362
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000363 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000364 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000365
366 if (version) {
367 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000368 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000369 }
370
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000371 if (!saw_inspect_flag &&
372 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
373 inspect = 1;
374 if (!saw_unbuffered_flag &&
375 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
376 unbuffered = 1;
377
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000378 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000379 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000380 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000381#ifdef __VMS
382 filename = decc$translate_vms(argv[_PyOS_optind]);
383 if (filename == (char *)0 || filename == (char *)-1)
384 filename = argv[_PyOS_optind];
385
386#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000387 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000388#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000389 if (filename != NULL) {
390 if ((fp = fopen(filename, "r")) == NULL) {
Martin v. Löwis4d4dfb72004-08-19 11:07:49 +0000391#ifdef HAVE_STRERROR
392 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
393 argv[0], filename, errno, strerror(errno));
394#else
395 fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
396 argv[0], filename, errno);
397#endif
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000398 return 2;
Guido van Rossum775af911997-02-14 19:50:32 +0000399 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000400 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000401 int ch;
402 /* Push back first newline so line numbers
403 remain the same */
404 while ((ch = getc(fp)) != EOF) {
405 if (ch == '\n') {
406 (void)ungetc(ch, fp);
407 break;
408 }
409 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000410 }
Neal Norwitz11bd1192005-10-03 00:54:56 +0000411 {
412 /* XXX: does this work on Win/Win64? (see posix_fstat) */
413 struct stat sb;
414 if (fstat(fileno(fp), &sb) == 0 &&
415 S_ISDIR(sb.st_mode)) {
Neal Norwitz72c2c062006-03-09 05:58:11 +0000416 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
417 return 1;
Neal Norwitz11bd1192005-10-03 00:54:56 +0000418 }
419 }
Guido van Rossum775af911997-02-14 19:50:32 +0000420 }
421 }
422
423 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
424
Guido van Rossum667d7041995-08-04 04:20:48 +0000425 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000426#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000427 _setmode(fileno(stdin), O_BINARY);
428 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000429#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000430#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000431 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
432 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
433 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000434#else /* !HAVE_SETVBUF */
435 setbuf(stdin, (char *)NULL);
436 setbuf(stdout, (char *)NULL);
437 setbuf(stderr, (char *)NULL);
438#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000439 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000440 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000441#ifdef MS_WINDOWS
442 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000443 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000444 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000445#else /* !MS_WINDOWS */
446#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000447 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
448 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000449#endif /* HAVE_SETVBUF */
450#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000451 /* Leave stderr alone - it should be unbuffered anyway. */
452 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000453#ifdef __VMS
454 else {
455 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
456 }
457#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000458
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000459#ifdef __APPLE__
460 /* On MacOS X, when the Python interpreter is embedded in an
461 application bundle, it gets executed by a bootstrapping script
462 that does os.execve() with an argv[0] that's different from the
463 actual Python executable. This is needed to keep the Finder happy,
464 or rather, to work around Apple's overly strict requirements of
465 the process name. However, we still need a usable sys.executable,
466 so the actual executable path is passed in an environment variable.
467 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
468 script. */
469 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
470 Py_SetProgramName(p);
471 else
472 Py_SetProgramName(argv[0]);
473#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000474 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000475#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000476 Py_Initialize();
477
Guido van Rossum667d7041995-08-04 04:20:48 +0000478 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000479 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000480 fprintf(stderr, "Python %s on %s\n",
481 Py_GetVersion(), Py_GetPlatform());
482 if (!Py_NoSiteFlag)
483 fprintf(stderr, "%s\n", COPYRIGHT);
484 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000485
Guido van Rossum667d7041995-08-04 04:20:48 +0000486 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000487 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
488 _PyOS_optind--;
489 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000490 }
491
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000492 if (module != NULL) {
Nick Coghlan81f444b2006-06-12 10:17:11 +0000493 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
494 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000495 _PyOS_optind--;
Nick Coghlan81f444b2006-06-12 10:17:11 +0000496 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000497 }
498
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000499 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000500
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000501 if ((inspect || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000502 isatty(fileno(stdin))) {
503 PyObject *v;
504 v = PyImport_ImportModule("readline");
505 if (v == NULL)
506 PyErr_Clear();
507 else
508 Py_DECREF(v);
509 }
510
Guido van Rossum667d7041995-08-04 04:20:48 +0000511 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000512 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000513 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000514 } else if (module) {
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000515 sts = RunModule(module);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000516 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000517 }
518 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000519 if (filename == NULL && stdin_is_interactive) {
Martin v. Löwis6caea372003-11-18 19:46:25 +0000520 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000521 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000522 /* XXX */
523 sts = PyRun_AnyFileExFlags(
Guido van Rossum775af911997-02-14 19:50:32 +0000524 fp,
Guido van Rossum0df002c2000-08-27 19:21:52 +0000525 filename == NULL ? "<stdin>" : filename,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000526 filename != NULL, &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000527 }
528
Barry Warsawd86dcd32003-06-29 17:07:06 +0000529 /* Check this environment variable at the end, to give programs the
530 * opportunity to set it from Python.
531 */
532 if (!saw_inspect_flag &&
533 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
534 {
535 inspect = 1;
536 }
537
Guido van Rossum775af911997-02-14 19:50:32 +0000538 if (inspect && stdin_is_interactive &&
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000539 (filename != NULL || command != NULL || module != NULL))
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000540 /* XXX */
541 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000542
Martin v. Löwisbea1c702007-01-04 21:06:57 +0000543 WaitForThreadShutdown();
544
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000545 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000546#ifdef RISCOS
Fred Drake5134a542002-10-17 20:37:50 +0000547 if (Py_RISCOSWimpFlag)
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000548 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
549#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000550
551#ifdef __INSURE__
552 /* Insure++ is a memory analysis tool that aids in discovering
553 * memory leaks and other memory problems. On Python exit, the
554 * interned string dictionary is flagged as being in use at exit
555 * (which it is). Under normal circumstances, this is fine because
556 * the memory will be automatically reclaimed by the system. Under
557 * memory debugging, it's a huge source of useless noise, so we
558 * trade off slower shutdown for less distraction in the memory
559 * reports. -baw
560 */
561 _Py_ReleaseInternedStrings();
562#endif /* __INSURE__ */
563
Guido van Rossum05f7c501997-08-02 03:00:42 +0000564 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000565}
566
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000567/* this is gonna seem *real weird*, but if you put some other code between
568 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
569 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000570
Guido van Rossum667d7041995-08-04 04:20:48 +0000571/* Make the *original* argc/argv available to other modules.
572 This is rare, but it is needed by the secureware extension. */
573
574void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000575Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000576{
577 *argc = orig_argc;
578 *argv = orig_argv;
579}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000580
581#ifdef __cplusplus
582}
583#endif
584