main.c revision 790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9
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__)
12945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <windows.h>
13477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H
143e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
153e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
16477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
173e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
18945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#ifdef _MSC_VER
19945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <crtdbg.h>
20945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#endif
21945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis
227bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
23a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
24a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
257bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC)
267bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#define PYTHONHOMEHELP "<prefix>/Lib"
277bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#else
28da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
29a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
307bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#endif
31a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
322cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
332cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
34a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
3536002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
3636002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
37a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
3849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
3949fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
4049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
4149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
42ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
43667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv;
44667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
45667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
46bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
47790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes#define BASE_OPTS "bBc:dEhim:OStuvVW:xX?"
48bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
49bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
503ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
51667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
52667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
53db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
55667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
56393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_1 = "\
57667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
5898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-b     : issue warnings about str(bytes_instance), str(buffer_instance)\n\
5998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         and comparing bytes/buffer with str. (-bb: issue errors)\n\
60790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\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\
63790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E     : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
640e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
6561c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
6661c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\
6798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i     : inspect interactively after running script; forces a prompt even\n\
6898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
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\
74393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum";
75393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_3 = "\
7698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
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\
837922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
84393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\
8598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile   : program read from script file\n\
8698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
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\
92790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes";
93790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimesstatic char *usage_5 = "\
94a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
95a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum               The default module search path uses %s.\n\
96793de09b21ce286bc3c6aa0419f258cceb5d029fTim PetersPYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
97667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
98667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
99667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
100852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
1013b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawusage(int exitcode, char* program)
1023b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
103393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	FILE *f = exitcode ? stderr : stdout;
104393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
105393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	fprintf(f, usage_line, program);
106393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	if (exitcode)
107393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, "Try `python -h' for more information.\n");
108393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	else {
109393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, usage_1);
110393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, usage_2);
111393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, usage_3);
112790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes		fprintf(f, usage_4, DELIM);
113790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes		fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
114393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	}
11579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS)
11679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	if (exitcode == 0) {
11779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		/* suppress 'error' message */
118852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 1;
11979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
12079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	else {
12179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		/* STS$M_INHIB_MSG + SS$_ABORT */
122852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 0x1000002c;
12379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
12479acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else
125852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis	return exitcode;
12679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
1273b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	/*NOTREACHED*/
1283b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1293b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1306caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1316caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
1326caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	char *startup = Py_GETENV("PYTHONSTARTUP");
1336caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	if (startup != NULL && startup[0] != '\0') {
1346caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		FILE *fp = fopen(startup, "r");
1356caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		if (fp != NULL) {
1366caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			(void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
1376caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			PyErr_Clear();
1386caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			fclose(fp);
139e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes		} else {
140e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			int save_errno;
141e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes
142e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			save_errno = errno;
143e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
144e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			errno = save_errno;
145e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PyErr_SetFromErrnoWithFilename(PyExc_IOError,
146e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes					startup);
147e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PyErr_Print();
148e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PyErr_Clear();
1496caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		}
1506caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	}
1516caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1526caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
153db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
1549cd177526afc086a300b548588880329c32f607dChristian Heimesstatic int RunModule(char *module, int set_argv0)
155a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
156a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	PyObject *runpy, *runmodule, *runargs, *result;
157a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	runpy = PyImport_ImportModule("runpy");
158a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runpy == NULL) {
159a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		fprintf(stderr, "Could not import runpy module\n");
160a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
161db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	}
162ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters	runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
163a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runmodule == NULL) {
164ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters		fprintf(stderr, "Could not access runpy._run_module_as_main\n");
165a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runpy);
166a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
167a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
1689cd177526afc086a300b548588880329c32f607dChristian Heimes	runargs = Py_BuildValue("(si)", module, set_argv0);
169a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runargs == NULL) {
170a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		fprintf(stderr,
171ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters			"Could not create arguments for runpy._run_module_as_main\n");
172a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runpy);
173a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runmodule);
174a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
175a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
176a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	result = PyObject_Call(runmodule, runargs, NULL);
177a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (result == NULL) {
178a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		PyErr_Print();
179a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
180a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runpy);
181a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runmodule);
182a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runargs);
183a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (result == NULL) {
184a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
185a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
186a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(result);
187a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	return 0;
188db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
1893b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1909cd177526afc086a300b548588880329c32f607dChristian Heimesstatic int RunMainFromImporter(char *filename)
1919cd177526afc086a300b548588880329c32f607dChristian Heimes{
1929cd177526afc086a300b548588880329c32f607dChristian Heimes	PyObject *argv0 = NULL, *importer = NULL;
1939cd177526afc086a300b548588880329c32f607dChristian Heimes
19474c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	if ((argv0 = PyUnicode_DecodeFSDefault(filename)) &&
19574c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	    (importer = PyImport_GetImporter(argv0)) &&
19674c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	    (importer->ob_type != &PyNullImporter_Type))
1979cd177526afc086a300b548588880329c32f607dChristian Heimes	{
1989cd177526afc086a300b548588880329c32f607dChristian Heimes		 /* argv0 is usable as an import source, so
1999cd177526afc086a300b548588880329c32f607dChristian Heimes			put it in sys.path[0] and import __main__ */
2009cd177526afc086a300b548588880329c32f607dChristian Heimes		PyObject *sys_path = NULL;
20174c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		if ((sys_path = PySys_GetObject("path")) &&
20274c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		    !PyList_SetItem(sys_path, 0, argv0))
20374c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		{
2049cd177526afc086a300b548588880329c32f607dChristian Heimes			Py_INCREF(argv0);
20574c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum			Py_DECREF(importer);
2069cd177526afc086a300b548588880329c32f607dChristian Heimes			sys_path = NULL;
2079cd177526afc086a300b548588880329c32f607dChristian Heimes			return RunModule("__main__", 0) != 0;
2089cd177526afc086a300b548588880329c32f607dChristian Heimes		}
2099cd177526afc086a300b548588880329c32f607dChristian Heimes	}
21074c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	Py_XDECREF(argv0);
21174c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	Py_XDECREF(importer);
21274c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum        if (PyErr_Occurred()) {
21374c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		PyErr_Print();
21474c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		return 1;
21574c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum        }
21674c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	else {
21774c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		return -1;
21874c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	}
2199cd177526afc086a300b548588880329c32f607dChristian Heimes}
2209cd177526afc086a300b548588880329c32f607dChristian Heimes
2219cd177526afc086a300b548588880329c32f607dChristian Heimes
222902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters/* Wait until threading._shutdown completes, provided
223902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters   the threading module was imported in the first place.
224902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters   The shutdown routine will wait until all non-daemon
225902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters   "threading" threads have completed. */
226902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#include "abstract.h"
227902d6ebddd07a6086b54ae42929293418f0852d7Thomas Woutersstatic void
228902d6ebddd07a6086b54ae42929293418f0852d7Thomas WoutersWaitForThreadShutdown(void)
229902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters{
230902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#ifdef WITH_THREAD
231902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	PyObject *result;
232902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	PyThreadState *tstate = PyThreadState_GET();
233902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
234902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters						      "threading");
235902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	if (threading == NULL) {
236902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		/* threading not imported */
237902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		PyErr_Clear();
238902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		return;
239902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	}
240902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	result = PyObject_CallMethod(threading, "_shutdown", "");
241902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	if (result == NULL)
242902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		PyErr_WriteUnraisable(threading);
243902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	else
244902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters		Py_DECREF(result);
245902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	Py_DECREF(threading);
246902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#endif
247902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters}
248902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters
249667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
250667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
251fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
252620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv)
253667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
254667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int c;
255667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int sts;
256667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *command = NULL;
257667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *filename = NULL;
258db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	char *module = NULL;
259667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	FILE *fp = stdin;
260667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *p;
261667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int unbuffered = 0;
262a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum	int skipfirstline = 0;
263775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	int stdin_is_interactive = 0;
2643b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int help = 0;
2653b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int version = 0;
2667d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	int saw_unbuffered_flag = 0;
267bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	PyCompilerFlags cf;
268667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
269393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	cf.cf_flags = 0;
270393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
271ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	orig_argc = argc;	/* For Py_GetArgcArgv() */
272667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	orig_argv = argv;
273ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
27447f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum	PySys_ResetWarnOptions();
27547f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
276bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum	while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
277667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (c == 'c') {
278667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/* -c is the last option; following arguments
279667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   that look like options are left for the
280f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter Dörwald			   command to interpret. */
28149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			command = (char *)malloc(strlen(_PyOS_optarg) + 2);
282667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (command == NULL)
283667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				Py_FatalError(
284667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				   "not enough memory to copy -c argument");
2852cffc7d4202fc1197280a05d998075551b459283Thomas Wouters			strcpy(command, _PyOS_optarg);
286667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcat(command, "\n");
287667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
288667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
289393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
290db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		if (c == 'm') {
291db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			/* -m is the last option; following arguments
292db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			   that look like options are left for the
293db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			   module to interpret. */
29449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			module = (char *)malloc(strlen(_PyOS_optarg) + 2);
295db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			if (module == NULL)
296db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger				Py_FatalError(
297db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger				   "not enough memory to copy -m argument");
298db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			strcpy(module, _PyOS_optarg);
299db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			break;
300db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		}
301db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
302667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		switch (c) {
30398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		case 'b':
30498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum			Py_BytesWarningFlag++;
30598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum			break;
306667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
307667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'd':
308667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_DebugFlag++;
309667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
310667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
311667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'i':
312d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum			Py_InspectFlag++;
313775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			Py_InteractiveFlag++;
314667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
315667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3167614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum		case 'O':
3177614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			Py_OptimizeFlag++;
3187614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			break;
3197614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum
320790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes		case 'B':
321790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes			Py_DontWriteBytecodeFlag++;
322790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes			break;
323790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes
3247922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum		case 'S':
3257922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			Py_NoSiteFlag++;
3267922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			break;
3277922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum
3287d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		case 'E':
3297d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			Py_IgnoreEnvironmentFlag++;
3307d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			break;
3317d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
332bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum		case 't':
333bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			Py_TabcheckFlag++;
334bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			break;
335bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum
336667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'u':
337667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			unbuffered++;
3387d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			saw_unbuffered_flag = 1;
339667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
340667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
341667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'v':
342667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_VerboseFlag++;
343667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
344667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
345a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum		case 'x':
346a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			skipfirstline = 1;
347a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			break;
348a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
3493b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'h':
3500e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		case '?':
3513b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			help++;
3523b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
35345aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum
3543b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'V':
3553b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			version++;
3563b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
357c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum
35847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum		case 'W':
35947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			PySys_AddWarnOption(_PyOS_optarg);
36047f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			break;
36147f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
362667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* This space reserved for other options */
363667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
364667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		default:
365852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis			return usage(2, argv[0]);
366667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/*NOTREACHED*/
367667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
368667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
369667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
370667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3713b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (help)
372852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return usage(0, argv[0]);
3733b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
3743b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (version) {
3753b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		fprintf(stderr, "Python %s\n", PY_VERSION);
376852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 0;
3773b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	}
3783b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
379d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (!Py_InspectFlag &&
3807d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
381d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 1;
3827d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if (!saw_unbuffered_flag &&
3837d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
3847d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		unbuffered = 1;
3857d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
386db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	if (command == NULL && module == NULL && _PyOS_optind < argc &&
3872cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	    strcmp(argv[_PyOS_optind], "-") != 0)
388775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	{
3897a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS
3907a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis		filename = decc$translate_vms(argv[_PyOS_optind]);
3917a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis		if (filename == (char *)0 || filename == (char *)-1)
3927a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis			filename = argv[_PyOS_optind];
3937a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis
3947a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else
3952cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		filename = argv[_PyOS_optind];
3967a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif
397775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	}
398775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
399775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
400775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
401667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (unbuffered) {
4029cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
4033e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdin), O_BINARY);
4043e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdout), O_BINARY);
405f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
40622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
407775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
408775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
409775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
41022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
41122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdin,  (char *)NULL);
41222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdout, (char *)NULL);
41322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stderr, (char *)NULL);
41422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
415667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
4162a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum	else if (Py_InteractiveFlag) {
417b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
418b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		/* Doesn't have to have line-buffered -- use unbuffered */
41901b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum		/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
420b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
42122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
42222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
423b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
424b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
42522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
42622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
427775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		/* Leave stderr alone - it should be unbuffered anyway. */
428775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum  	}
42979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
43079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	else {
43179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
43279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
43379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */
434667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
4352ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
4362ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	/* On MacOS X, when the Python interpreter is embedded in an
4372ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   application bundle, it gets executed by a bootstrapping script
4382ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   that does os.execve() with an argv[0] that's different from the
4392ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   actual Python executable. This is needed to keep the Finder happy,
4402ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   or rather, to work around Apple's overly strict requirements of
4412ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   the process name. However, we still need a usable sys.executable,
4422ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   so the actual executable path is passed in an environment variable.
4432ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
4442ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   script. */
4452ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
4462ac79ef9e3168691efabad6877e45168a00738acJust van Rossum		Py_SetProgramName(p);
4472ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	else
4482ac79ef9e3168691efabad6877e45168a00738acJust van Rossum		Py_SetProgramName(argv[0]);
4492ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
450ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_SetProgramName(argv[0]);
451fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
452ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_Initialize();
453ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
454667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (Py_VerboseFlag ||
455db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	    (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
456e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis		fprintf(stderr, "Python %s on %s\n",
457e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis			Py_GetVersion(), Py_GetPlatform());
458e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis 		if (!Py_NoSiteFlag)
459e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis 			fprintf(stderr, "%s\n", COPYRIGHT);
460e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis	}
461393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
462667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command != NULL) {
4632cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
4642cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		_PyOS_optind--;
4652cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		argv[_PyOS_optind] = "-c";
466667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
467667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
468db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	if (module != NULL) {
4690e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c'
4700e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		   so that PySys_SetArgv correctly sets sys.path[0] to ''*/
471db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		_PyOS_optind--;
4720e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		argv[_PyOS_optind] = "-c";
473db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	}
474db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
4752cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
476667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
477d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
4783d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	    isatty(fileno(stdin))) {
4793d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		PyObject *v;
4803d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		v = PyImport_ImportModule("readline");
4813d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		if (v == NULL)
4823d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			PyErr_Clear();
4833d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		else
4843d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			Py_DECREF(v);
4853d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	}
4863d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum
487667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command) {
488393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		sts = PyRun_SimpleStringFlags(command, &cf) != 0;
48905f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum		free(command);
490db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	} else if (module) {
4919cd177526afc086a300b548588880329c32f607dChristian Heimes		sts = RunModule(module, 1);
492db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		free(module);
493667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
494667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	else {
4959cd177526afc086a300b548588880329c32f607dChristian Heimes
496775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename == NULL && stdin_is_interactive) {
497d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum			Py_InspectFlag = 0; /* do exit on SystemExit */
4986caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			RunStartupFile(&cf);
499667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
500bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
5019cd177526afc086a300b548588880329c32f607dChristian Heimes
5029cd177526afc086a300b548588880329c32f607dChristian Heimes		sts = -1;	/* keep track of whether we've already run __main__ */
5039cd177526afc086a300b548588880329c32f607dChristian Heimes
5049cd177526afc086a300b548588880329c32f607dChristian Heimes		if (filename != NULL) {
5059cd177526afc086a300b548588880329c32f607dChristian Heimes			sts = RunMainFromImporter(filename);
5069cd177526afc086a300b548588880329c32f607dChristian Heimes		}
5079cd177526afc086a300b548588880329c32f607dChristian Heimes
5089cd177526afc086a300b548588880329c32f607dChristian Heimes		if (sts==-1 && filename!=NULL) {
5099cd177526afc086a300b548588880329c32f607dChristian Heimes			if ((fp = fopen(filename, "r")) == NULL) {
5109cd177526afc086a300b548588880329c32f607dChristian Heimes#ifdef HAVE_STRERROR
5119cd177526afc086a300b548588880329c32f607dChristian Heimes				fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
5129cd177526afc086a300b548588880329c32f607dChristian Heimes					argv[0], filename, errno, strerror(errno));
5139cd177526afc086a300b548588880329c32f607dChristian Heimes#else
5149cd177526afc086a300b548588880329c32f607dChristian Heimes				fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
5159cd177526afc086a300b548588880329c32f607dChristian Heimes					argv[0], filename, errno);
5169cd177526afc086a300b548588880329c32f607dChristian Heimes#endif
5179cd177526afc086a300b548588880329c32f607dChristian Heimes				return 2;
5189cd177526afc086a300b548588880329c32f607dChristian Heimes			}
5199cd177526afc086a300b548588880329c32f607dChristian Heimes			else if (skipfirstline) {
5209cd177526afc086a300b548588880329c32f607dChristian Heimes				int ch;
5219cd177526afc086a300b548588880329c32f607dChristian Heimes				/* Push back first newline so line numbers
5229cd177526afc086a300b548588880329c32f607dChristian Heimes				   remain the same */
5239cd177526afc086a300b548588880329c32f607dChristian Heimes				while ((ch = getc(fp)) != EOF) {
5249cd177526afc086a300b548588880329c32f607dChristian Heimes					if (ch == '\n') {
5259cd177526afc086a300b548588880329c32f607dChristian Heimes						(void)ungetc(ch, fp);
5269cd177526afc086a300b548588880329c32f607dChristian Heimes						break;
5279cd177526afc086a300b548588880329c32f607dChristian Heimes					}
5289cd177526afc086a300b548588880329c32f607dChristian Heimes				}
5299cd177526afc086a300b548588880329c32f607dChristian Heimes			}
5309cd177526afc086a300b548588880329c32f607dChristian Heimes			{
5319cd177526afc086a300b548588880329c32f607dChristian Heimes				/* XXX: does this work on Win/Win64? (see posix_fstat) */
5329cd177526afc086a300b548588880329c32f607dChristian Heimes				struct stat sb;
5339cd177526afc086a300b548588880329c32f607dChristian Heimes				if (fstat(fileno(fp), &sb) == 0 &&
5349cd177526afc086a300b548588880329c32f607dChristian Heimes				    S_ISDIR(sb.st_mode)) {
5359cd177526afc086a300b548588880329c32f607dChristian Heimes					fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
5369cd177526afc086a300b548588880329c32f607dChristian Heimes					return 1;
5379cd177526afc086a300b548588880329c32f607dChristian Heimes				}
5389cd177526afc086a300b548588880329c32f607dChristian Heimes			}
5399cd177526afc086a300b548588880329c32f607dChristian Heimes		}
5409cd177526afc086a300b548588880329c32f607dChristian Heimes
5419cd177526afc086a300b548588880329c32f607dChristian Heimes		if (sts==-1) {
5429cd177526afc086a300b548588880329c32f607dChristian Heimes			sts = PyRun_AnyFileExFlags(
5439cd177526afc086a300b548588880329c32f607dChristian Heimes				fp,
5449cd177526afc086a300b548588880329c32f607dChristian Heimes				filename == NULL ? "<stdin>" : filename,
5459cd177526afc086a300b548588880329c32f607dChristian Heimes				filename != NULL, &cf) != 0;
5469cd177526afc086a300b548588880329c32f607dChristian Heimes		}
5479cd177526afc086a300b548588880329c32f607dChristian Heimes
548667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
549667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
550d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	/* Check this environment variable at the end, to give programs the
551d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	 * opportunity to set it from Python.
552d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	 */
553d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (!Py_InspectFlag &&
554d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	    (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
555d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	{
556d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 1;
557d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	}
558d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw
559d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (Py_InspectFlag && stdin_is_interactive &&
560d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	    (filename != NULL || command != NULL || module != NULL)) {
561d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 0;
562bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
563bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
564d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	}
565667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
566902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters	WaitForThreadShutdown();
567902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters
5685d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum	Py_Finalize();
5693e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
5703e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
5713e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	/* Insure++ is a memory analysis tool that aids in discovering
5723e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory leaks and other memory problems.  On Python exit, the
5731680713e524016d93a94114c4a874ad71a090b95Walter Dörwald	 * interned string dictionaries are flagged as being in use at exit
5743e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * (which it is).  Under normal circumstances, this is fine because
5753e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * the memory will be automatically reclaimed by the system.  Under
5763e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory debugging, it's a huge source of useless noise, so we
5773e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * trade off slower shutdown for less distraction in the memory
5783e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * reports.  -baw
5793e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 */
5803e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	_Py_ReleaseInternedStrings();
5811680713e524016d93a94114c4a874ad71a090b95Walter Dörwald	_Py_ReleaseInternedUnicodeStrings();
5823e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
5833e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
58405f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum	return sts;
585667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
586667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
587786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
588786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
589786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
590667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
591667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
592667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
593667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
594667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
595620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv)
596667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
597667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argc = orig_argc;
598667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argv = orig_argv;
599667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
60049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
60149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
60249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
60349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
604