main.c revision 0df002c45b0bf2bf23bb8c0a395e86f907a94d81
1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/***********************************************************
2fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumCopyright (c) 2000, BeOpen.com.
3fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumCopyright (c) 1995-2000, Corporation for National Research Initiatives.
4fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumCopyright (c) 1990-1995, Stichting Mathematisch Centrum.
5fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumAll rights reserved.
6667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
7fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumSee the file "Misc/COPYRIGHT" for information on usage and
8fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van Rossumredistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
9667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum******************************************************************/
10667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
11667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */
12667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
13667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h"
14a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#include "osdefs.h"
15667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1666a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#ifdef HAVE_UNISTD_H
1766a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#include <unistd.h>
1866a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#endif
19667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
203e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#ifdef MS_WINDOWS
213e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
223e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
233e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
24a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#if defined(PYOS_OS2) || defined(MS_WINDOWS)
25a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
27620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik Lundh#define PYTHONHOMEHELP "<prefix>/python2.0"
28a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
29a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
30667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Interface to getopt(): */
31667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumextern int optind;
32667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumextern char *optarg;
33667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumextern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */
34667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
35667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
36ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
37667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv;
38667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
39667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
40667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
41667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
426b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
43667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
44667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
45a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossumstatic char *usage_top = "\
46667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-d     : debug output from parser (also PYTHONDEBUG=x)\n\
48775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-i     : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
49bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum         and force prompts, even if stdin does not appear to be a terminal\n\
50e7adf3eb6df5ce8472a41876dd3d3209025aa9fcGuido van Rossum-O     : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
516b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
527922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
53bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-t     : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
547922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_mid = "\
56bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-u     : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
57c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum-U     : Unicode literals: treats '...' literals like u'...'\n\
58667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-v     : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
59a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
60775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-c cmd : program passed in as string (terminates option list)\n\
61667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile   : program read from script file\n\
62667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
637922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
647922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_bot = "\
65bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossumarg ...: arguments passed to program in sys.argv[1:]\n\
66667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
67667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
68a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
69667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
70a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
71a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum               The default module search path uses %s.\n\
72667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
73667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
74667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
75667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
76667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
779c1201fe39c21ecc238daea82460e0ae85ce11f3Guido van RossumDL_EXPORT(int)
78620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv)
79667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
80667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int c;
81667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int sts;
82667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *command = NULL;
83667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *filename = NULL;
84667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	FILE *fp = stdin;
85667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *p;
86667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int inspect = 0;
87667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int unbuffered = 0;
88a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum	int skipfirstline = 0;
89775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	int stdin_is_interactive = 0;
90667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
91ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	orig_argc = argc;	/* For Py_GetArgcArgv() */
92667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	orig_argv = argv;
93ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
94667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		inspect = 1;
96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
97667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		unbuffered = 1;
98667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
99c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum	while ((c = getopt(argc, argv, "c:diOStuUvxX")) != EOF) {
100667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (c == 'c') {
101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/* -c is the last option; following arguments
102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   that look like options are left for the
103667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   the command to interpret. */
104667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			command = malloc(strlen(optarg) + 2);
105667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (command == NULL)
106667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				Py_FatalError(
107667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				   "not enough memory to copy -c argument");
108667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcpy(command, optarg);
109667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcat(command, "\n");
110667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
111667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
112667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
113667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		switch (c) {
114667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
115667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'd':
116667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_DebugFlag++;
117667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
118667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
119667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'i':
120667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			inspect++;
121775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			Py_InteractiveFlag++;
122667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
123667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1247614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum		case 'O':
1257614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			Py_OptimizeFlag++;
1267614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			break;
1277614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum
1287922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum		case 'S':
1297922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			Py_NoSiteFlag++;
1307922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			break;
1317922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum
132bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum		case 't':
133bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			Py_TabcheckFlag++;
134bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			break;
135bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum
136667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'u':
137667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			unbuffered++;
138667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
139667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
140667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'v':
141667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_VerboseFlag++;
142667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
143667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
144a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum		case 'x':
145a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			skipfirstline = 1;
146a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			break;
147a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
148c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum		case 'U':
149c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum			Py_UnicodeFlag++;
150c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum			break;
151c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum
152667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* This space reserved for other options */
153667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
154667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		default:
155667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			fprintf(stderr, usage_line, argv[0]);
156667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			fprintf(stderr, usage_top);
1577922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			fprintf(stderr, usage_mid);
158a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			fprintf(stderr, usage_bot,
159a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum				DELIM, DELIM, PYTHONHOMEHELP);
160667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			exit(2);
161667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/*NOTREACHED*/
162667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
163667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
164667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
165667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
166775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	if (command == NULL && optind < argc &&
167775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	    strcmp(argv[optind], "-") != 0)
168775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	{
169775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		filename = argv[optind];
170775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename != NULL) {
171775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			if ((fp = fopen(filename, "r")) == NULL) {
172775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				fprintf(stderr, "%s: can't open file '%s'\n",
173775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum					argv[0], filename);
174775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				exit(2);
175775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			}
176a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			else if (skipfirstline) {
177dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				int ch;
178dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				/* Push back first newline so line numbers
179dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				   remain the same */
180dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				while ((ch = getc(fp)) != EOF) {
181dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					if (ch == '\n') {
182dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						(void)ungetc(ch, fp);
183dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						break;
184dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					}
185dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				}
186a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			}
187775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		}
188775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	}
189775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
190775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
191775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
192667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (unbuffered) {
193f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#ifdef MS_WINDOWS
1943e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdin), O_BINARY);
1953e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdout), O_BINARY);
196f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
197667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#ifndef MPW
19822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
199775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
200775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
201775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
20222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
20322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdin,  (char *)NULL);
20422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdout, (char *)NULL);
20522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stderr, (char *)NULL);
20622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
20722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* MPW */
208667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* On MPW (3.2) unbuffered seems to hang */
209775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
210667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
211667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
21222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* MPW */
213667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
2142a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum	else if (Py_InteractiveFlag) {
215b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
216b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		/* Doesn't have to have line-buffered -- use unbuffered */
21701b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum		/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
218b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
21922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
22022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
221b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
222b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
22322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
22422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
225775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		/* Leave stderr alone - it should be unbuffered anyway. */
226775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum  	}
227667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
228ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_SetProgramName(argv[0]);
229ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_Initialize();
230ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
231667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (Py_VerboseFlag ||
232129e91aa77b22db1637e9f6db9e081a4a0c9f2a1Guido van Rossum	    (command == NULL && filename == NULL && stdin_is_interactive))
233fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum		fprintf(stderr, "Python %s on %s\n%s\n",
234fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum			Py_GetVersion(), Py_GetPlatform(), Py_GetCopyright());
235667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
236667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
237667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command != NULL) {
238667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* Backup optind and force sys.argv[0] = '-c' */
239667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		optind--;
240667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		argv[optind] = "-c";
241667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
242667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
243667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	PySys_SetArgv(argc-optind, argv+optind);
244667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2453d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	if ((inspect || (command == NULL && filename == NULL)) &&
2463d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	    isatty(fileno(stdin))) {
2473d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		PyObject *v;
2483d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		v = PyImport_ImportModule("readline");
2493d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		if (v == NULL)
2503d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			PyErr_Clear();
2513d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		else
2523d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			Py_DECREF(v);
2533d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	}
2543d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum
255667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command) {
256667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_SimpleString(command) != 0;
25705f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum		free(command);
258667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
259667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	else {
260775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename == NULL && stdin_is_interactive) {
261667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			char *startup = getenv("PYTHONSTARTUP");
262667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (startup != NULL && startup[0] != '\0') {
263667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				FILE *fp = fopen(startup, "r");
264667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				if (fp != NULL) {
265667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					(void) PyRun_SimpleFile(fp, startup);
266667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					PyErr_Clear();
267667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					fclose(fp);
268667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				}
269667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			}
270667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
2710df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum		sts = PyRun_AnyFileEx(
272775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			fp,
2730df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			filename == NULL ? "<stdin>" : filename,
2740df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			filename != NULL) != 0;
275667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
276667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
277775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	if (inspect && stdin_is_interactive &&
278667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	    (filename != NULL || command != NULL))
279667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
280667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2815d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum	Py_Finalize();
28205f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum	return sts;
283667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
284667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
285667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
286667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
287667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
288667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
290620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv)
291667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
292667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argc = orig_argc;
293667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argv = orig_argv;
294667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
295