main.c revision 7d4bb9f179f1888a472fd5d5a30df4ec3c55fea5
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
17da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
18a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
19a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
202cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
212cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
22a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
2336002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
2436002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
25a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
26ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
27667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv;
28667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
29667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
30bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
317d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer#define BASE_OPTS "c:diOSEtuUvxXhVW:"
32bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
33bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#ifndef RISCOS
34bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
35bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#else /*RISCOS*/
36bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* extra option saying that we are running under a special task window
37bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum   frontend; especially my_readline will behave different */
38bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS "w"
39bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* corresponding flag */
403ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossumextern int Py_RISCOSWimpFlag;
41bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#endif /*RISCOS*/
423ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
43667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
44667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
456b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
46667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
48a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossumstatic char *usage_top = "\
49667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
50667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-d     : debug output from parser (also PYTHONDEBUG=x)\n\
51775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-i     : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
52bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum         and force prompts, even if stdin does not appear to be a terminal\n\
53e7adf3eb6df5ce8472a41876dd3d3209025aa9fcGuido van Rossum-O     : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
546b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
567d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer-E     : ignore environment variables (such as PYTHONPATH)\n\
57bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-t     : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
587922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
597922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_mid = "\
60bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-u     : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
61c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum-U     : Unicode literals: treats '...' literals like u'...'\n\
62667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-v     : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
63a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
643b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-h     : print this help message and exit\n\
653b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-V     : print the Python version number and exit\n\
6647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum-W arg : warning control (arg is action:message:category:module:lineno)\n\
67775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-c cmd : program passed in as string (terminates option list)\n\
68667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile   : program read from script file\n\
69667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
707922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
717922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_bot = "\
72bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossumarg ...: arguments passed to program in sys.argv[1:]\n\
73667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
74667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
75a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
76667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
77a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
78a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum               The default module search path uses %s.\n\
79793de09b21ce286bc3c6aa0419f258cceb5d029fTim PetersPYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
80667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
81667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
82667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
833b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawstatic void
843b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawusage(int exitcode, char* program)
853b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
863b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_line, program);
873b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_top);
883b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_mid);
893b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	fprintf(stderr, usage_bot, DELIM, DELIM, PYTHONHOMEHELP);
903b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	exit(exitcode);
913b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	/*NOTREACHED*/
923b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
933b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
979c1201fe39c21ecc238daea82460e0ae85ce11f3Guido van RossumDL_EXPORT(int)
98620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv)
99667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
100667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int c;
101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int sts;
102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *command = NULL;
103667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *filename = NULL;
104667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	FILE *fp = stdin;
105667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *p;
106667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int inspect = 0;
107667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int unbuffered = 0;
108a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum	int skipfirstline = 0;
109775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	int stdin_is_interactive = 0;
1103b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int help = 0;
1113b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int version = 0;
1127d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	int saw_inspect_flag = 0;
1137d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	int saw_unbuffered_flag = 0;
114bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	PyCompilerFlags cf;
115667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
116ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	orig_argc = argc;	/* For Py_GetArgcArgv() */
117667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	orig_argv = argv;
118ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
1193ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS
1203ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum	Py_RISCOSWimpFlag = 0;
1213ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif
1223ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
12347f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum	PySys_ResetWarnOptions();
12447f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
125bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum	while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
126667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (c == 'c') {
127667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/* -c is the last option; following arguments
128667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   that look like options are left for the
129667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   the command to interpret. */
1302cffc7d4202fc1197280a05d998075551b459283Thomas Wouters			command = malloc(strlen(_PyOS_optarg) + 2);
131667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (command == NULL)
132667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				Py_FatalError(
133667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				   "not enough memory to copy -c argument");
1342cffc7d4202fc1197280a05d998075551b459283Thomas Wouters			strcpy(command, _PyOS_optarg);
135667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcat(command, "\n");
136667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
137667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
138667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
139667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		switch (c) {
140667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
141667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'd':
142667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_DebugFlag++;
143667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
144667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
145667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'i':
146667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			inspect++;
1477d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			saw_inspect_flag = 1;
148775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			Py_InteractiveFlag++;
149667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
150667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1517614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum		case 'O':
1527614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			Py_OptimizeFlag++;
1537614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			break;
1547614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum
1557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum		case 'S':
1567922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			Py_NoSiteFlag++;
1577922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			break;
1587922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum
1597d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		case 'E':
1607d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			Py_IgnoreEnvironmentFlag++;
1617d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			break;
1627d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
163bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum		case 't':
164bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			Py_TabcheckFlag++;
165bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			break;
166bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum
167667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'u':
168667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			unbuffered++;
1697d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			saw_unbuffered_flag = 1;
170667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
171667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
172667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'v':
173667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_VerboseFlag++;
174667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
175667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1763ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS
1773ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum		case 'w':
1783ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum			Py_RISCOSWimpFlag = 1;
1793ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum			break;
1803ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif
1813ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
182a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum		case 'x':
183a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			skipfirstline = 1;
184a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			break;
185a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
186c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum		case 'U':
187c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum			Py_UnicodeFlag++;
188c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum			break;
1893b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'h':
1903b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			help++;
1913b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
1923b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'V':
1933b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			version++;
1943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
195c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum
19647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum		case 'W':
19747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			PySys_AddWarnOption(_PyOS_optarg);
19847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			break;
19947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
200667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* This space reserved for other options */
201667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
202667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		default:
2033b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			usage(2, argv[0]);
204667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/*NOTREACHED*/
205667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
206667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
207667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
208667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2093b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (help)
2103b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		usage(0, argv[0]);
2113b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
2123b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (version) {
2133b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		fprintf(stderr, "Python %s\n", PY_VERSION);
2143b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		exit(0);
2153b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	}
2163b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
2177d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if (!saw_inspect_flag &&
2187d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
2197d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		inspect = 1;
2207d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if (!saw_unbuffered_flag &&
2217d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
2227d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		unbuffered = 1;
2237d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
2242cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	if (command == NULL && _PyOS_optind < argc &&
2252cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	    strcmp(argv[_PyOS_optind], "-") != 0)
226775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	{
2272cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		filename = argv[_PyOS_optind];
228775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename != NULL) {
229775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			if ((fp = fopen(filename, "r")) == NULL) {
230775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				fprintf(stderr, "%s: can't open file '%s'\n",
231775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum					argv[0], filename);
232775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				exit(2);
233775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			}
234a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			else if (skipfirstline) {
235dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				int ch;
236dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				/* Push back first newline so line numbers
237dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				   remain the same */
238dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				while ((ch = getc(fp)) != EOF) {
239dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					if (ch == '\n') {
240dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						(void)ungetc(ch, fp);
241dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						break;
242dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					}
243dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				}
244a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			}
245775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		}
246775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	}
247775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
248775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
249775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
250667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (unbuffered) {
251f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#ifdef MS_WINDOWS
2523e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdin), O_BINARY);
2533e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdout), O_BINARY);
254f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
255667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#ifndef MPW
25622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
257775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
258775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
259775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
26022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
26122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdin,  (char *)NULL);
26222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdout, (char *)NULL);
26322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stderr, (char *)NULL);
26422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
26522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* MPW */
266667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* On MPW (3.2) unbuffered seems to hang */
267775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
268667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
269667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
27022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* MPW */
271667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
2722a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum	else if (Py_InteractiveFlag) {
273b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
274b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		/* Doesn't have to have line-buffered -- use unbuffered */
27501b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum		/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
276b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
27722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
27822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
279b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
280b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
28122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
28222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
283775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		/* Leave stderr alone - it should be unbuffered anyway. */
284775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum  	}
285667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
286ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_SetProgramName(argv[0]);
287ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_Initialize();
288ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (Py_VerboseFlag ||
290129e91aa77b22db1637e9f6db9e081a4a0c9f2a1Guido van Rossum	    (command == NULL && filename == NULL && stdin_is_interactive))
291fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum		fprintf(stderr, "Python %s on %s\n%s\n",
292a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum			Py_GetVersion(), Py_GetPlatform(), COPYRIGHT);
293667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
294667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
295667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command != NULL) {
2962cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
2972cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		_PyOS_optind--;
2982cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		argv[_PyOS_optind] = "-c";
299667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
300667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3012cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
302667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3033d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	if ((inspect || (command == NULL && filename == NULL)) &&
3043d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	    isatty(fileno(stdin))) {
3053d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		PyObject *v;
3063d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		v = PyImport_ImportModule("readline");
3073d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		if (v == NULL)
3083d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			PyErr_Clear();
3093d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		else
3103d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			Py_DECREF(v);
3113d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	}
3123d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum
3135ba58662817b708a453020f0425fe4747ea6d5cbTim Peters	cf.cf_flags = 0;
314bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton
315667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command) {
316667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_SimpleString(command) != 0;
31705f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum		free(command);
318667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
319667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	else {
320775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename == NULL && stdin_is_interactive) {
3217d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			char *startup = Py_GETENV("PYTHONSTARTUP");
322667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (startup != NULL && startup[0] != '\0') {
323667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				FILE *fp = fopen(startup, "r");
324667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				if (fp != NULL) {
325667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					(void) PyRun_SimpleFile(fp, startup);
326667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					PyErr_Clear();
327667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					fclose(fp);
328667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				}
329667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			}
330667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
331bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
332bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		sts = PyRun_AnyFileExFlags(
333775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			fp,
3340df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			filename == NULL ? "<stdin>" : filename,
335bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton			filename != NULL, &cf) != 0;
336667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
337667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
338775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	if (inspect && stdin_is_interactive &&
339667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	    (filename != NULL || command != NULL))
340bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
341bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
342667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3435d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum	Py_Finalize();
3443ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS
3453ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum	if(Py_RISCOSWimpFlag)
3463ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum                fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
3473ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif
3483e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
3493e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
3503e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	/* Insure++ is a memory analysis tool that aids in discovering
3513e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory leaks and other memory problems.  On Python exit, the
3523e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * interned string dictionary is flagged as being in use at exit
3533e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * (which it is).  Under normal circumstances, this is fine because
3543e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * the memory will be automatically reclaimed by the system.  Under
3553e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory debugging, it's a huge source of useless noise, so we
3563e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * trade off slower shutdown for less distraction in the memory
3573e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * reports.  -baw
3583e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 */
3593e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	_Py_ReleaseInternedStrings();
3603e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
3613e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
36205f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum	return sts;
363667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
364667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
365667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
366667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
367667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
368667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
369667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
370620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv)
371667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
372667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argc = orig_argc;
373667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argv = orig_argv;
374667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
375