main.c revision d8faa3654c2887eaa146dcdb553a9f9793bd2e5a
1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */
2667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h"
4a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#include "osdefs.h"
5db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger#include "import.h"
6667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
87a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#include <unixlib.h>
979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
1079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis
119cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
12477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H
133e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
143e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
15477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
163e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
177bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
18a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
19a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
207bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC)
217bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#define PYTHONHOMEHELP "<prefix>/Lib"
227bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#else
23da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
24a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
257bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#endif
26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
272cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
282cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
29a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
3036002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
3136002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
32a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
3349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
3449fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
3549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
3649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
37ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
38667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv;
39667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
40667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
41bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
420e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#define BASE_OPTS "c:dEhim:OStuvVW:xX?"
43bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
44bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#ifndef RISCOS
45bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
46bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#else /*RISCOS*/
47bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* extra option saying that we are running under a special task window
48bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum   frontend; especially my_readline will behave different */
49bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS "w"
50bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* corresponding flag */
513ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossumextern int Py_RISCOSWimpFlag;
52bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#endif /*RISCOS*/
533ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
55667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
56db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
57667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
58667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
59393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_1 = "\
60667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
61393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\
6289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d     : debug output from parser; also PYTHONDEBUG=x\n\
63393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-E     : ignore environment variables (such as PYTHONPATH)\n\
640e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
6589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-i     : inspect interactively after running script; forces a prompt even\n\
6689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
6761c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
6861c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\
69db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\
7089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
716b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
727922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
73bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-t     : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
7489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
75393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum";
76393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_3 = "\
77db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger         see man page for details on internal buffering relating to '-u'\n\
7889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-v     : verbose (trace import statements); also PYTHONVERBOSE=x\n\
7989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters         can be supplied multiple times to increase verbosity\n\
800e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-V     : print the Python version number and exit (also --version)\n\
8189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\
82393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
83667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile   : program read from script file\n\
84667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
857922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
86393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\
8789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\
88667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
89667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
90a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
92a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
93a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum               The default module search path uses %s.\n\
94793de09b21ce286bc3c6aa0419f258cceb5d029fTim PetersPYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
97667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
98852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
993b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawusage(int exitcode, char* program)
1003b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
101393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	FILE *f = exitcode ? stderr : stdout;
102393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
103393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	fprintf(f, usage_line, program);
104393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	if (exitcode)
105393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, "Try `python -h' for more information.\n");
106393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	else {
107393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, usage_1);
108393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, usage_2);
109393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, usage_3);
110393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, usage_4, DELIM, DELIM, PYTHONHOMEHELP);
111393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	}
11279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS)
11379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	if (exitcode == 0) {
11479acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		/* suppress 'error' message */
115852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 1;
11679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
11779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	else {
11879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		/* STS$M_INHIB_MSG + SS$_ABORT */
119852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 0x1000002c;
12079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
12179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else
122852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis	return exitcode;
12379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
1243b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	/*NOTREACHED*/
1253b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1263b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1276caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1286caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
1296caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	char *startup = Py_GETENV("PYTHONSTARTUP");
1306caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	if (startup != NULL && startup[0] != '\0') {
1316caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		FILE *fp = fopen(startup, "r");
1326caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		if (fp != NULL) {
1336caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			(void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
1346caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			PyErr_Clear();
1356caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			fclose(fp);
1366caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		}
1376caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	}
1386caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1396caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
140db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
141a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Woutersstatic int RunModule(char *module)
142a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
143a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	PyObject *runpy, *runmodule, *runargs, *result;
144a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	runpy = PyImport_ImportModule("runpy");
145a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runpy == NULL) {
146a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		fprintf(stderr, "Could not import runpy module\n");
147a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
148db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	}
149a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	runmodule = PyObject_GetAttrString(runpy, "run_module");
150a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runmodule == NULL) {
151a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		fprintf(stderr, "Could not access runpy.run_module\n");
152a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runpy);
153a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
154a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
155a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	runargs = Py_BuildValue("sOsO", module,
156a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters							Py_None, "__main__", Py_True);
157a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runargs == NULL) {
158a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		fprintf(stderr,
159a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters				"Could not create arguments for runpy.run_module\n");
160a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runpy);
161a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runmodule);
162a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
163a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
164a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	result = PyObject_Call(runmodule, runargs, NULL);
165a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (result == NULL) {
166a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		PyErr_Print();
167a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
168a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runpy);
169a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runmodule);
170a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runargs);
171a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (result == NULL) {
172a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
173a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
174a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(result);
175a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	return 0;
176db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
1773b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
178902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters/* Wait until threading._shutdown completes, provided
179902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters   the threading module was imported in the first place.
180902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters   The shutdown routine will wait until all non-daemon
181902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters   "threading" threads have completed. */
182902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#include "abstract.h"
183902d6ebddd07a6086b54ae42929293418f0852d7Thomas Woutersstatic void
184902d6ebddd07a6086b54ae42929293418f0852d7Thomas WoutersWaitForThreadShutdown(void)
185902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters{
186902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#ifdef WITH_THREAD
187902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	PyObject *result;
188902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	PyThreadState *tstate = PyThreadState_GET();
189902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
190902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters						      "threading");
191902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	if (threading == NULL) {
192902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		/* threading not imported */
193902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		PyErr_Clear();
194902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		return;
195902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	}
196902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	result = PyObject_CallMethod(threading, "_shutdown", "");
197902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	if (result == NULL)
198902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		PyErr_WriteUnraisable(threading);
199902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	else
200902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		Py_DECREF(result);
201902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	Py_DECREF(threading);
202902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#endif
203902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters}
204902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters
205667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
206667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
207fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
208620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv)
209667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
210667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int c;
211667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int sts;
212667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *command = NULL;
213667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *filename = NULL;
214db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	char *module = NULL;
215667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	FILE *fp = stdin;
216667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *p;
217667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int unbuffered = 0;
218a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum	int skipfirstline = 0;
219775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	int stdin_is_interactive = 0;
2203b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int help = 0;
2213b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int version = 0;
2227d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	int saw_unbuffered_flag = 0;
223bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	PyCompilerFlags cf;
224667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
225393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	cf.cf_flags = 0;
226393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
227ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	orig_argc = argc;	/* For Py_GetArgcArgv() */
228667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	orig_argv = argv;
229ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
2303ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS
2313ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum	Py_RISCOSWimpFlag = 0;
2323ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif
2333ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
23447f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum	PySys_ResetWarnOptions();
23547f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
236bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum	while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
237667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (c == 'c') {
238667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/* -c is the last option; following arguments
239667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   that look like options are left for the
240f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter Dörwald			   command to interpret. */
24149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			command = (char *)malloc(strlen(_PyOS_optarg) + 2);
242667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (command == NULL)
243667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				Py_FatalError(
244667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				   "not enough memory to copy -c argument");
2452cffc7d4202fc1197280a05d998075551b459283Thomas Wouters			strcpy(command, _PyOS_optarg);
246667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcat(command, "\n");
247667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
248667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
249393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
250db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		if (c == 'm') {
251db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			/* -m is the last option; following arguments
252db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			   that look like options are left for the
253db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			   module to interpret. */
25449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			module = (char *)malloc(strlen(_PyOS_optarg) + 2);
255db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			if (module == NULL)
256db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger				Py_FatalError(
257db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger				   "not enough memory to copy -m argument");
258db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			strcpy(module, _PyOS_optarg);
259db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			break;
260db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		}
261db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
262667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		switch (c) {
263667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
264667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'd':
265667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_DebugFlag++;
266667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
267667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
268667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'i':
269d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum			Py_InspectFlag++;
270775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			Py_InteractiveFlag++;
271667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
272667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2737614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum		case 'O':
2747614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			Py_OptimizeFlag++;
2757614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			break;
2767614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum
2777922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum		case 'S':
2787922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			Py_NoSiteFlag++;
2797922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			break;
2807922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum
2817d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		case 'E':
2827d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			Py_IgnoreEnvironmentFlag++;
2837d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			break;
2847d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
285bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum		case 't':
286bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			Py_TabcheckFlag++;
287bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			break;
288bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum
289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'u':
290667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			unbuffered++;
2917d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			saw_unbuffered_flag = 1;
292667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
293667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
294667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'v':
295667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_VerboseFlag++;
296667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
297667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2983ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS
2993ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum		case 'w':
3003ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum			Py_RISCOSWimpFlag = 1;
3013ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum			break;
3023ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif
3033ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
304a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum		case 'x':
305a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			skipfirstline = 1;
306a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			break;
307a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
3083b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'h':
3090e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		case '?':
3103b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			help++;
3113b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
31245aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum
3133b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'V':
3143b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			version++;
3153b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
316c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum
31747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum		case 'W':
31847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			PySys_AddWarnOption(_PyOS_optarg);
31947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			break;
32047f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
321667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* This space reserved for other options */
322667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
323667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		default:
324852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis			return usage(2, argv[0]);
325667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/*NOTREACHED*/
326667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
327667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
328667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
329667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3303b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (help)
331852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return usage(0, argv[0]);
3323b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
3333b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (version) {
3343b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		fprintf(stderr, "Python %s\n", PY_VERSION);
335852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 0;
3363b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	}
3373b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
338d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (!Py_InspectFlag &&
3397d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
340d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 1;
3417d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if (!saw_unbuffered_flag &&
3427d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
3437d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		unbuffered = 1;
3447d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
345db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	if (command == NULL && module == NULL && _PyOS_optind < argc &&
3462cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	    strcmp(argv[_PyOS_optind], "-") != 0)
347775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	{
3487a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS
3497a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis		filename = decc$translate_vms(argv[_PyOS_optind]);
3507a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis		if (filename == (char *)0 || filename == (char *)-1)
3517a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis			filename = argv[_PyOS_optind];
3527a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis
3537a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else
3542cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		filename = argv[_PyOS_optind];
3557a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif
356775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename != NULL) {
357775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			if ((fp = fopen(filename, "r")) == NULL) {
3584d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis#ifdef HAVE_STRERROR
3594d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis				fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
3604d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis					argv[0], filename, errno, strerror(errno));
3614d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis#else
3624d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis				fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
3634d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis					argv[0], filename, errno);
3644d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis#endif
365852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis				return 2;
366775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			}
367a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			else if (skipfirstline) {
368dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				int ch;
369dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				/* Push back first newline so line numbers
370dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				   remain the same */
371dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				while ((ch = getc(fp)) != EOF) {
372dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					if (ch == '\n') {
373dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						(void)ungetc(ch, fp);
374dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum						break;
375dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum					}
376dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum				}
377a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			}
37811bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz			{
37911bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz				/* XXX: does this work on Win/Win64? (see posix_fstat) */
38011bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz				struct stat sb;
38111bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz				if (fstat(fileno(fp), &sb) == 0 &&
38211bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz				    S_ISDIR(sb.st_mode)) {
38372c2c062d71c499863ff6e260525faaea4a53dbbNeal Norwitz					fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
38472c2c062d71c499863ff6e260525faaea4a53dbbNeal Norwitz					return 1;
38511bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz				}
38611bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz			}
387775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		}
388775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	}
389775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
390775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
391775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
392667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (unbuffered) {
3939cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
3943e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdin), O_BINARY);
3953e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdout), O_BINARY);
396f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
39722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
398775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
399775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
400775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
40122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
40222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdin,  (char *)NULL);
40322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdout, (char *)NULL);
40422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stderr, (char *)NULL);
40522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
406667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
4072a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum	else if (Py_InteractiveFlag) {
408b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
409b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		/* Doesn't have to have line-buffered -- use unbuffered */
41001b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum		/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
411b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
41222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
41322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
414b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
415b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
41622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
41722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
418775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		/* Leave stderr alone - it should be unbuffered anyway. */
419775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum  	}
42079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
42179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	else {
42279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
42379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
42479acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */
425667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
4262ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
4272ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	/* On MacOS X, when the Python interpreter is embedded in an
4282ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   application bundle, it gets executed by a bootstrapping script
4292ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   that does os.execve() with an argv[0] that's different from the
4302ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   actual Python executable. This is needed to keep the Finder happy,
4312ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   or rather, to work around Apple's overly strict requirements of
4322ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   the process name. However, we still need a usable sys.executable,
4332ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   so the actual executable path is passed in an environment variable.
4342ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
4352ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   script. */
4362ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
4372ac79ef9e3168691efabad6877e45168a00738acJust van Rossum		Py_SetProgramName(p);
4382ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	else
4392ac79ef9e3168691efabad6877e45168a00738acJust van Rossum		Py_SetProgramName(argv[0]);
4402ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
441ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_SetProgramName(argv[0]);
442fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
443ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_Initialize();
444ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
445667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (Py_VerboseFlag ||
446db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	    (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
447e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis		fprintf(stderr, "Python %s on %s\n",
448e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis			Py_GetVersion(), Py_GetPlatform());
449e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis 		if (!Py_NoSiteFlag)
450e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis 			fprintf(stderr, "%s\n", COPYRIGHT);
451e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis	}
452393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
453667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command != NULL) {
4542cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
4552cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		_PyOS_optind--;
4562cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		argv[_PyOS_optind] = "-c";
457667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
458667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
459db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	if (module != NULL) {
4600e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c'
4610e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		   so that PySys_SetArgv correctly sets sys.path[0] to ''*/
462db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		_PyOS_optind--;
4630e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		argv[_PyOS_optind] = "-c";
464db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	}
465db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
4662cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
467667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
468d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
4693d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	    isatty(fileno(stdin))) {
4703d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		PyObject *v;
4713d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		v = PyImport_ImportModule("readline");
4723d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		if (v == NULL)
4733d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			PyErr_Clear();
4743d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		else
4753d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			Py_DECREF(v);
4763d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	}
4773d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum
478667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command) {
479393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		sts = PyRun_SimpleStringFlags(command, &cf) != 0;
48005f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum		free(command);
481db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	} else if (module) {
482a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		sts = RunModule(module);
483db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		free(module);
484667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
485667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	else {
486775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename == NULL && stdin_is_interactive) {
487d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum			Py_InspectFlag = 0; /* do exit on SystemExit */
4886caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			RunStartupFile(&cf);
489667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
490bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
491bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		sts = PyRun_AnyFileExFlags(
492775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			fp,
4930df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			filename == NULL ? "<stdin>" : filename,
494bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton			filename != NULL, &cf) != 0;
495667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
496667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
497d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	/* Check this environment variable at the end, to give programs the
498d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	 * opportunity to set it from Python.
499d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	 */
500d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (!Py_InspectFlag &&
501d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	    (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
502d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	{
503d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 1;
504d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	}
505d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw
506d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (Py_InspectFlag && stdin_is_interactive &&
507d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	    (filename != NULL || command != NULL || module != NULL)) {
508d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 0;
509bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
510bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
511d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	}
512667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
513902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	WaitForThreadShutdown();
514902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters
5155d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum	Py_Finalize();
5163ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS
5175134a54df995baa404d0334c7eb8c8218f30d9bfFred Drake	if (Py_RISCOSWimpFlag)
5183ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum                fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
5193ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif
5203e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
5213e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
5223e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	/* Insure++ is a memory analysis tool that aids in discovering
5233e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory leaks and other memory problems.  On Python exit, the
5243e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * interned string dictionary is flagged as being in use at exit
5253e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * (which it is).  Under normal circumstances, this is fine because
5263e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * the memory will be automatically reclaimed by the system.  Under
5273e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory debugging, it's a huge source of useless noise, so we
5283e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * trade off slower shutdown for less distraction in the memory
5293e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * reports.  -baw
5303e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 */
5313e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	_Py_ReleaseInternedStrings();
5323e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
5333e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
53405f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum	return sts;
535667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
536667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
537786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
538786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
539786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
540667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
541667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
542667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
543667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
544667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
545620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv)
546667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
547667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argc = orig_argc;
548667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argv = orig_argv;
549667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
55049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
55149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
55249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
55349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
55449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
555