main.c revision 47f5fdc1144e6f88c09ce790c8d5b9653c7a6d65
1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */
2667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h"
4a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#include "osdefs.h"
5667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
666a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#ifdef HAVE_UNISTD_H
766a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#include <unistd.h>
866a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#endif
9667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
103e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#ifdef MS_WINDOWS
113e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
123e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
133e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
14a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#if defined(PYOS_OS2) || defined(MS_WINDOWS)
15a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
16a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
17620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik Lundh#define PYTHONHOMEHELP "<prefix>/python2.0"
18a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
19a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
202cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
212cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
22a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
23a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum    "Type \"copyright\", \"credits\" or \"license\" for more information."
24a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
25ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
26667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv;
27667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
28667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
29667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
30667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
316b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
32667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
33667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
34a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossumstatic char *usage_top = "\
35667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
36667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-d     : debug output from parser (also PYTHONDEBUG=x)\n\
37775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-i     : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
38bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum         and force prompts, even if stdin does not appear to be a terminal\n\
39e7adf3eb6df5ce8472a41876dd3d3209025aa9fcGuido van Rossum-O     : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
406b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
417922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
42bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-t     : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
437922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
447922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_mid = "\
45bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-u     : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
46c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum-U     : Unicode literals: treats '...' literals like u'...'\n\
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-v     : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
48a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
493b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-h     : print this help message and exit\n\
503b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-V     : print the Python version number and exit\n\
5147f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum-W arg : warning control (arg is action:message:category:module:lineno)\n\
52775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-c cmd : program passed in as string (terminates option list)\n\
53667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile   : program read from script file\n\
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
567922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_bot = "\
57bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossumarg ...: arguments passed to program in sys.argv[1:]\n\
58667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
59667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
60a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
61667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
62a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
63a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum               The default module search path uses %s.\n\
64667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
65667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
66667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
673b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawstatic void
683b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawusage(int exitcode, char* program)
693b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
703b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_line, program);
713b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_top);
723b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_mid);
733b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_bot, DELIM, DELIM, PYTHONHOMEHELP);
743b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	exit(exitcode);
753b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	/*NOTREACHED*/
763b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
773b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
783b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
79667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
80667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
819c1201fe39c21ecc238daea82460e0ae85ce11f3Guido van RossumDL_EXPORT(int)
82620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv)
83667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
84667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int c;
85667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int sts;
86667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *command = NULL;
87667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *filename = NULL;
88667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	FILE *fp = stdin;
89667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *p;
90667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int inspect = 0;
91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int unbuffered = 0;
92a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum	int skipfirstline = 0;
93775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	int stdin_is_interactive = 0;
943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int help = 0;
953b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int version = 0;
96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
97ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	orig_argc = argc;	/* For Py_GetArgcArgv() */
98667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	orig_argv = argv;
99ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
100667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		inspect = 1;
102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
103667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		unbuffered = 1;
104667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
10547f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum	PySys_ResetWarnOptions();
10647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
10747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum	while ((c = _PyOS_GetOpt(argc, argv, "c:diOStuUvxXhVW:")) != EOF) {
108667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (c == 'c') {
109667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/* -c is the last option; following arguments
110667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   that look like options are left for the
111667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   the command to interpret. */
1122cffc7d4202fc1197280a05d998075551b459283Thomas Wouters			command = malloc(strlen(_PyOS_optarg) + 2);
113667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (command == NULL)
114667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				Py_FatalError(
115667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				   "not enough memory to copy -c argument");
1162cffc7d4202fc1197280a05d998075551b459283Thomas Wouters			strcpy(command, _PyOS_optarg);
117667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcat(command, "\n");
118667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
119667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
120667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
121667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		switch (c) {
122667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
123667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'd':
124667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_DebugFlag++;
125667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
126667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
127667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'i':
128667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			inspect++;
129775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			Py_InteractiveFlag++;
130667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
131667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1327614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum		case 'O':
1337614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			Py_OptimizeFlag++;
1347614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			break;
1357614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum
1367922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum		case 'S':
1377922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			Py_NoSiteFlag++;
1387922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			break;
1397922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum
140bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum		case 't':
141bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			Py_TabcheckFlag++;
142bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			break;
143bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum
144667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'u':
145667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			unbuffered++;
146667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
147667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
148667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'v':
149667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_VerboseFlag++;
150667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
151667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
152a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum		case 'x':
153a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			skipfirstline = 1;
154a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			break;
155a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
156c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum		case 'U':
157c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum			Py_UnicodeFlag++;
158c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum			break;
1593b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'h':
1603b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			help++;
1613b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
1623b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'V':
1633b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			version++;
1643b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
165c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum
16647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum		case 'W':
16747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			PySys_AddWarnOption(_PyOS_optarg);
16847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			break;
16947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
170667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* This space reserved for other options */
171667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
172667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		default:
1733b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			usage(2, argv[0]);
174667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/*NOTREACHED*/
175667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
176667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
177667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
178667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1793b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (help)
1803b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		usage(0, argv[0]);
1813b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1823b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (version) {
1833b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		fprintf(stderr, "Python %s\n", PY_VERSION);
1843b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		exit(0);
1853b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	}
1863b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1872cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	if (command == NULL && _PyOS_optind < argc &&
1882cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	    strcmp(argv[_PyOS_optind], "-") != 0)
189775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	{
1902cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		filename = argv[_PyOS_optind];
191775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename != NULL) {
192775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			if ((fp = fopen(filename, "r")) == NULL) {
193775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				fprintf(stderr, "%s: can't open file '%s'\n",
194775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum					argv[0], filename);
195775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				exit(2);
196775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			}
197a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			else if (skipfirstline) {
198dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				int ch;
199dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				/* Push back first newline so line numbers
200dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				   remain the same */
201dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				while ((ch = getc(fp)) != EOF) {
202dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					if (ch == '\n') {
203dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						(void)ungetc(ch, fp);
204dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						break;
205dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					}
206dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				}
207a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			}
208775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		}
209775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	}
210775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
211775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
212775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
213667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (unbuffered) {
214f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#ifdef MS_WINDOWS
2153e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdin), O_BINARY);
2163e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdout), O_BINARY);
217f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
218667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#ifndef MPW
21922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
220775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
221775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
222775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
22322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
22422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdin,  (char *)NULL);
22522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdout, (char *)NULL);
22622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stderr, (char *)NULL);
22722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
22822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* MPW */
229667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* On MPW (3.2) unbuffered seems to hang */
230775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
231667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
232667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
23322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* MPW */
234667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
2352a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum	else if (Py_InteractiveFlag) {
236b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
237b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		/* Doesn't have to have line-buffered -- use unbuffered */
23801b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum		/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
239b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
24022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
24122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
242b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
243b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
24422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
24522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
246775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		/* Leave stderr alone - it should be unbuffered anyway. */
247775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum  	}
248667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
249ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_SetProgramName(argv[0]);
250ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_Initialize();
251ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
252667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (Py_VerboseFlag ||
253129e91aa77b22db1637e9f6db9e081a4a0c9f2a1Guido van Rossum	    (command == NULL && filename == NULL && stdin_is_interactive))
254fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum		fprintf(stderr, "Python %s on %s\n%s\n",
255a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum			Py_GetVersion(), Py_GetPlatform(), COPYRIGHT);
256667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
257667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
258667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command != NULL) {
2592cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
2602cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		_PyOS_optind--;
2612cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		argv[_PyOS_optind] = "-c";
262667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
263667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2642cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
265667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2663d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	if ((inspect || (command == NULL && filename == NULL)) &&
2673d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	    isatty(fileno(stdin))) {
2683d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		PyObject *v;
2693d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		v = PyImport_ImportModule("readline");
2703d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		if (v == NULL)
2713d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			PyErr_Clear();
2723d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		else
2733d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			Py_DECREF(v);
2743d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	}
2753d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum
276667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command) {
277667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_SimpleString(command) != 0;
27805f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum		free(command);
279667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
280667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	else {
281775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename == NULL && stdin_is_interactive) {
282667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			char *startup = getenv("PYTHONSTARTUP");
283667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (startup != NULL && startup[0] != '\0') {
284667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				FILE *fp = fopen(startup, "r");
285667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				if (fp != NULL) {
286667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					(void) PyRun_SimpleFile(fp, startup);
287667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					PyErr_Clear();
288667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					fclose(fp);
289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				}
290667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			}
291667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
2920df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum		sts = PyRun_AnyFileEx(
293775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			fp,
2940df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			filename == NULL ? "<stdin>" : filename,
2950df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			filename != NULL) != 0;
296667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
297667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
298775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	if (inspect && stdin_is_interactive &&
299667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	    (filename != NULL || command != NULL))
300667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
301667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3025d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum	Py_Finalize();
30305f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum	return sts;
304667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
305667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
306667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
307667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
308667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
309667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
310667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
311620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv)
312667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
313667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argc = orig_argc;
314667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argv = orig_argv;
315667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
316