main.c revision e53de3dc4a9021b5edabd44fd495df7770b6249c
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
75651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou#include <locale.h>
85651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou
979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
107a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#include <unixlib.h>
1179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
1279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis
139cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
14945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <windows.h>
15477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H
163e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
17790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#define PATH_MAX MAXPATHLEN
183e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
19477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
203e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
21945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#ifdef _MSC_VER
22945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <crtdbg.h>
23945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#endif
24945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis
257bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
27a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
287bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC)
297bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#define PYTHONHOMEHELP "<prefix>/Lib"
307bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#else
31da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
32a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
337bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#endif
34a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
352cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
362cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
37a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
3836002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
3936002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
40a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
4149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
4249fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
4349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
4449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
45ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
46790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t **orig_argv;
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
48667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
49bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
508dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes#define BASE_OPTS L"bBc:dEhiJm:OsStuvVW:xX?"
51bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
52bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
533ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
55667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
56790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis"usage: %ls [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\
612ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes-b     : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
622ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes         and comparing bytes/bytearray with str. (-bb: issue errors)\n\
63790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
64393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\
6589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d     : debug output from parser; also PYTHONDEBUG=x\n\
66790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E     : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
670e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
6861c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
6961c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\
7098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i     : inspect interactively after running script; forces a prompt even\n\
7198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
72db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\
7389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
746b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
758dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes-s     : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
767922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
77393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum";
78393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_3 = "\
7998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
80db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger         see man page for details on internal buffering relating to '-u'\n\
8189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-v     : verbose (trace import statements); also PYTHONVERBOSE=x\n\
8289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters         can be supplied multiple times to increase verbosity\n\
830e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-V     : print the Python version number and exit (also --version)\n\
8489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\
850805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey         also PYTHONWARNINGS=arg\n\
86393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
877922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
88393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\
8998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile   : program read from script file\n\
9098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
9189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\
92667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
93667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
94a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
96790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes";
97790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimesstatic char *usage_5 = "\
98a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
99a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum               The default module search path uses %s.\n\
100793de09b21ce286bc3c6aa0419f258cceb5d029fTim PetersPYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
1010f5998911c0a39400a42bad781e84eba822fed38Martin v. LöwisPYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
103667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
104790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#ifndef MS_WINDOWS
105790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic FILE*
106790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis_wfopen(const wchar_t *path, const wchar_t *mode)
107790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis{
108790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	char cpath[PATH_MAX];
109790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	char cmode[10];
110790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	size_t r;
111790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	r = wcstombs(cpath, path, PATH_MAX);
112790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	if (r == (size_t)-1 || r >= PATH_MAX) {
113790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis		errno = EINVAL;
114790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis		return NULL;
115790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	}
116790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	r = wcstombs(cmode, mode, 10);
117790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	if (r == (size_t)-1 || r >= 10) {
118790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis		errno = EINVAL;
119790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis		return NULL;
120790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	}
121790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	return fopen(cpath, cmode);
122790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis}
123790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#endif
124790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis
125667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
126852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
127790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisusage(int exitcode, wchar_t* program)
1283b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
129393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	FILE *f = exitcode ? stderr : stdout;
130393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
131393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	fprintf(f, usage_line, program);
132393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	if (exitcode)
133393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum		fprintf(f, "Try `python -h' for more information.\n");
134393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	else {
135cf7128ccbcf2b68eff6c5b47f6334b01882c818bAlexandre Vassalotti		fputs(usage_1, f);
136cf7128ccbcf2b68eff6c5b47f6334b01882c818bAlexandre Vassalotti		fputs(usage_2, f);
137cf7128ccbcf2b68eff6c5b47f6334b01882c818bAlexandre Vassalotti		fputs(usage_3, f);
138790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes		fprintf(f, usage_4, DELIM);
139790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes		fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
140393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	}
14179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS)
14279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	if (exitcode == 0) {
14379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		/* suppress 'error' message */
144852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 1;
14579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
14679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	else {
14779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		/* STS$M_INHIB_MSG + SS$_ABORT */
148852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 0x1000002c;
14979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
15079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else
151852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis	return exitcode;
15279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
1533b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	/*NOTREACHED*/
1543b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1553b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1566caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1576caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
1586caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	char *startup = Py_GETENV("PYTHONSTARTUP");
1596caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	if (startup != NULL && startup[0] != '\0') {
1606caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		FILE *fp = fopen(startup, "r");
1616caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		if (fp != NULL) {
1626caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			(void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
1636caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			PyErr_Clear();
1646caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			fclose(fp);
165e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes		} else {
166e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			int save_errno;
167e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes
168e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			save_errno = errno;
169e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
170e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			errno = save_errno;
171e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PyErr_SetFromErrnoWithFilename(PyExc_IOError,
172e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes					startup);
173e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PyErr_Print();
174e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes			PyErr_Clear();
1756caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis		}
1766caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis	}
1776caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1786caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
179db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
1805651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0)
181a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
1825651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou	PyObject *module, *runpy, *runmodule, *runargs, *result;
183a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	runpy = PyImport_ImportModule("runpy");
184a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runpy == NULL) {
185a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		fprintf(stderr, "Could not import runpy module\n");
186a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
187db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	}
188ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters	runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
189a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runmodule == NULL) {
190ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters		fprintf(stderr, "Could not access runpy._run_module_as_main\n");
191a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runpy);
192a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
193a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
1945651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou	module = PyUnicode_FromWideChar(modname, wcslen(modname));
1955651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou	if (module == NULL) {
1965651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou		fprintf(stderr, "Could not convert module name to unicode\n");
1975651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou		Py_DECREF(runpy);
1985651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou		Py_DECREF(runmodule);
1995651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou		return -1;
2005651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou	}
2015651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou	runargs = Py_BuildValue("(Oi)", module, set_argv0);
202a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (runargs == NULL) {
203a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		fprintf(stderr,
204ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters			"Could not create arguments for runpy._run_module_as_main\n");
205a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runpy);
206a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		Py_DECREF(runmodule);
2075651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou		Py_DECREF(module);
208a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
209a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
210a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	result = PyObject_Call(runmodule, runargs, NULL);
211a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (result == NULL) {
212a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		PyErr_Print();
213a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
214a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runpy);
215a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runmodule);
2165651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou	Py_DECREF(module);
217a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(runargs);
218a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	if (result == NULL) {
219a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters		return -1;
220a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	}
221a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	Py_DECREF(result);
222a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters	return 0;
223db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
2243b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
225790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic int RunMainFromImporter(wchar_t *filename)
2269cd177526afc086a300b548588880329c32f607dChristian Heimes{
2279cd177526afc086a300b548588880329c32f607dChristian Heimes	PyObject *argv0 = NULL, *importer = NULL;
2289cd177526afc086a300b548588880329c32f607dChristian Heimes
229790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	if ((argv0 = PyUnicode_FromWideChar(filename,wcslen(filename))) &&
23074c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	    (importer = PyImport_GetImporter(argv0)) &&
23174c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	    (importer->ob_type != &PyNullImporter_Type))
2329cd177526afc086a300b548588880329c32f607dChristian Heimes	{
2339cd177526afc086a300b548588880329c32f607dChristian Heimes		 /* argv0 is usable as an import source, so
2349cd177526afc086a300b548588880329c32f607dChristian Heimes			put it in sys.path[0] and import __main__ */
2359cd177526afc086a300b548588880329c32f607dChristian Heimes		PyObject *sys_path = NULL;
23674c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		if ((sys_path = PySys_GetObject("path")) &&
23774c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		    !PyList_SetItem(sys_path, 0, argv0))
23874c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		{
2399cd177526afc086a300b548588880329c32f607dChristian Heimes			Py_INCREF(argv0);
24074c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum			Py_DECREF(importer);
2419cd177526afc086a300b548588880329c32f607dChristian Heimes			sys_path = NULL;
2425651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou			return RunModule(L"__main__", 0) != 0;
2439cd177526afc086a300b548588880329c32f607dChristian Heimes		}
2449cd177526afc086a300b548588880329c32f607dChristian Heimes	}
24574c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	Py_XDECREF(argv0);
24674c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	Py_XDECREF(importer);
24774c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum        if (PyErr_Occurred()) {
24874c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		PyErr_Print();
24974c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		return 1;
25074c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum        }
25174c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	else {
25274c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum		return -1;
25374c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum	}
2549cd177526afc086a300b548588880329c32f607dChristian Heimes}
2559cd177526afc086a300b548588880329c32f607dChristian Heimes
2569cd177526afc086a300b548588880329c32f607dChristian Heimes
257667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
258667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
259fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
260790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv)
261667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
262667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int c;
263667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int sts;
2649a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc	wchar_t *command = NULL;
265790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	wchar_t *filename = NULL;
2665651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou	wchar_t *module = NULL;
267667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	FILE *fp = stdin;
268667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *p;
269e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
270e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey	wchar_t *wp;
271e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
272a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum	int skipfirstline = 0;
273775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	int stdin_is_interactive = 0;
2743b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int help = 0;
2753b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	int version = 0;
2767d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	int saw_unbuffered_flag = 0;
277bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	PyCompilerFlags cf;
278667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
279393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	cf.cf_flags = 0;
280393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
281ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	orig_argc = argc;	/* For Py_GetArgcArgv() */
282667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	orig_argv = argv;
283ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
28447f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum	PySys_ResetWarnOptions();
28547f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
286bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum	while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
287667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (c == 'c') {
2889a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			size_t len;
289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/* -c is the last option; following arguments
290667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   that look like options are left for the
291f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter Dörwald			   command to interpret. */
2929a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc
2939a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			len = wcslen(_PyOS_optarg) + 1 + 1;
2949a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			command = (wchar_t *)malloc(sizeof(wchar_t) * len);
295667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (command == NULL)
296667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				Py_FatalError(
297667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				   "not enough memory to copy -c argument");
2989a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			wcscpy(command, _PyOS_optarg);
2999a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			command[len - 2] = '\n';
3009a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			command[len - 1] = 0;
301667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
302667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
303393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
304db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		if (c == 'm') {
305db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			/* -m is the last option; following arguments
306db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			   that look like options are left for the
307db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			   module to interpret. */
3085651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou			module = _PyOS_optarg;
309db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger			break;
310db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		}
311db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
312667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		switch (c) {
31398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		case 'b':
31498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum			Py_BytesWarningFlag++;
31598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum			break;
316667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
317667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'd':
318667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_DebugFlag++;
319667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
320667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
321667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'i':
322d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum			Py_InspectFlag++;
323775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			Py_InteractiveFlag++;
324667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
325667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
32633fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimes		/* case 'J': reserved for Jython */
32733fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimes
3287614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum		case 'O':
3297614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			Py_OptimizeFlag++;
3307614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			break;
3317614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum
332790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes		case 'B':
333790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes			Py_DontWriteBytecodeFlag++;
334790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes			break;
335790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes
3368dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes		case 's':
3378dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes			Py_NoUserSiteDirectory++;
3388dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes			break;
3398dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes
3407922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum		case 'S':
3417922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			Py_NoSiteFlag++;
3427922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum			break;
3437922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum
3447d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		case 'E':
3457d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			Py_IgnoreEnvironmentFlag++;
3467d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			break;
3477d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
348bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum		case 't':
349e1b5ac640841e4233bcd0204efcd50fe9b50a6d0Georg Brandl			/* ignored for backwards compatibility */
350bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum			break;
351bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum
352667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'u':
3530560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrou			Py_UnbufferedStdioFlag = 1;
3547d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer			saw_unbuffered_flag = 1;
355667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
356667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
357667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'v':
358667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_VerboseFlag++;
359667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
360667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
361a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum		case 'x':
362a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			skipfirstline = 1;
363a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum			break;
364a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
36532dde22186efbbfcfb275ac9542b3e62a9b5cf1bNeal Norwitz		/* case 'X': reserved for implementation-specific arguments */
36633fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimes
3673b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'h':
3680e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		case '?':
3693b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			help++;
3703b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
37145aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum
3723b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		case 'V':
3733b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			version++;
3743b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw			break;
375c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum
376790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis		case 'W':
37747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			PySys_AddWarnOption(_PyOS_optarg);
37847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum			break;
37947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum
380667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* This space reserved for other options */
381667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
382667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		default:
383852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis			return usage(2, argv[0]);
384667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/*NOTREACHED*/
385667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
386667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
387667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
388667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3893b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (help)
390852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return usage(0, argv[0]);
3913b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
3923b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	if (version) {
3933b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw		fprintf(stderr, "Python %s\n", PY_VERSION);
394852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis		return 0;
3953b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw	}
3963b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
397d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (!Py_InspectFlag &&
3987d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
399d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 1;
4007d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if (!saw_unbuffered_flag &&
4017d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	    (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
4020560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrou		Py_UnbufferedStdioFlag = 1;
4037d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
4048dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes	if (!Py_NoUserSiteDirectory &&
4058dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes	    (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
4068dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes		Py_NoUserSiteDirectory = 1;
4078dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes
408e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
409e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey	if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
410e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey	    *wp != L'\0') {
411e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		wchar_t *buf, *warning;
412e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey
413e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		buf = (wchar_t *)malloc((wcslen(wp) + 1) * sizeof(wchar_t));
414e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		if (buf == NULL)
415e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey			Py_FatalError(
416e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey			   "not enough memory to copy PYTHONWARNINGS");
417e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		wcscpy(buf, wp);
418e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		for (warning = wcstok(buf, L",");
419e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		     warning != NULL;
420e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		     warning = wcstok(NULL, L",")) {
421e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey			PySys_AddWarnOption(warning);
422e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		}
423e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		free(buf);
424e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey	}
425e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#else
4260805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey	if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
427e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		char *buf, *oldloc;
428e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		wchar_t *warning;
429ad6139acc79271fd954d1f138235584a7d66c119Benjamin Peterson
430e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		/* settle for strtok here as there's no one standard
431e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		   C89 wcstok */
432ad6139acc79271fd954d1f138235584a7d66c119Benjamin Peterson		buf = (char *)malloc(strlen(p) + 1);
433ad6139acc79271fd954d1f138235584a7d66c119Benjamin Peterson		if (buf == NULL)
434ad6139acc79271fd954d1f138235584a7d66c119Benjamin Peterson			Py_FatalError(
435ad6139acc79271fd954d1f138235584a7d66c119Benjamin Peterson			   "not enough memory to copy PYTHONWARNINGS");
436ad6139acc79271fd954d1f138235584a7d66c119Benjamin Peterson		strcpy(buf, p);
437e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		oldloc = strdup(setlocale(LC_ALL, NULL));
438e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		setlocale(LC_ALL, "");
439e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
440e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey			if ((warning = _Py_char2wchar(p)) != NULL) {
441e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey				PySys_AddWarnOption(warning);
442e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey				free(warning);
443e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey			}
4440805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey		}
445e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		setlocale(LC_ALL, oldloc);
446e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey		free(oldloc);
447ad6139acc79271fd954d1f138235584a7d66c119Benjamin Peterson		free(buf);
4480805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey	}
449e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
4500805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey
451db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	if (command == NULL && module == NULL && _PyOS_optind < argc &&
452790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis	    wcscmp(argv[_PyOS_optind], L"-") != 0)
453775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	{
4547a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS
4557a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis		filename = decc$translate_vms(argv[_PyOS_optind]);
4567a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis		if (filename == (char *)0 || filename == (char *)-1)
4577a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis			filename = argv[_PyOS_optind];
4587a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis
4597a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else
4602cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		filename = argv[_PyOS_optind];
4617a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif
462775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	}
463775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
464775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
465775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
4660560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrou	if (Py_UnbufferedStdioFlag) {
4679cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
4683e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdin), O_BINARY);
4693e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdout), O_BINARY);
470f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
47122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
472775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
473775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
474775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
47522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
47622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdin,  (char *)NULL);
47722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stdout, (char *)NULL);
47822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum		setbuf(stderr, (char *)NULL);
47922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
480667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
4812a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum	else if (Py_InteractiveFlag) {
482b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
483b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		/* Doesn't have to have line-buffered -- use unbuffered */
48401b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum		/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
485b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
48622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
48722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
488b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
489b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
49022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
49122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
492775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		/* Leave stderr alone - it should be unbuffered anyway. */
493775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum  	}
49479acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
49579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	else {
49679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis		setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
49779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis	}
49879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */
499667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
5002ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
5012ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	/* On MacOS X, when the Python interpreter is embedded in an
5022ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   application bundle, it gets executed by a bootstrapping script
5032ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   that does os.execve() with an argv[0] that's different from the
5042ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   actual Python executable. This is needed to keep the Finder happy,
5052ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   or rather, to work around Apple's overly strict requirements of
5062ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   the process name. However, we still need a usable sys.executable,
5072ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   so the actual executable path is passed in an environment variable.
5082ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
5092ac79ef9e3168691efabad6877e45168a00738acJust van Rossum	   script. */
5103e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren	if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
5113e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		wchar_t* buffer;
5123e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		size_t len = strlen(p);
5133e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		size_t r;
5143e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren
5153e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		buffer = malloc(len * sizeof(wchar_t));
5163e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		if (buffer == NULL) {
5173e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren			Py_FatalError(
5183e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren			   "not enough memory to copy PYTHONEXECUTABLE");
5193e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		}
5203e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren
5213e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		r = mbstowcs(buffer, p, len);
5223e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		Py_SetProgramName(buffer);
5233e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren		/* buffer is now handed off - do not free */
5243e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren	} else {
5252ac79ef9e3168691efabad6877e45168a00738acJust van Rossum		Py_SetProgramName(argv[0]);
5263e264e13ede4c3c067dd30052aa0f1e7298342d2Ronald Oussoren	}
5272ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
528ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_SetProgramName(argv[0]);
529fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
530ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum	Py_Initialize();
531ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum
532667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (Py_VerboseFlag ||
533db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	    (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
534e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis		fprintf(stderr, "Python %s on %s\n",
535e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis			Py_GetVersion(), Py_GetPlatform());
536e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis 		if (!Py_NoSiteFlag)
537e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis 			fprintf(stderr, "%s\n", COPYRIGHT);
538e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis	}
539393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum
540667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command != NULL) {
5412cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c' */
5422cffc7d4202fc1197280a05d998075551b459283Thomas Wouters		_PyOS_optind--;
543790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis		argv[_PyOS_optind] = L"-c";
544667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
545667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
546db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	if (module != NULL) {
5470e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		/* Backup _PyOS_optind and force sys.argv[0] = '-c'
5480e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		   so that PySys_SetArgv correctly sets sys.path[0] to ''*/
549db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger		_PyOS_optind--;
550790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis		argv[_PyOS_optind] = L"-c";
551db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	}
552db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
5532cffc7d4202fc1197280a05d998075551b459283Thomas Wouters	PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
554667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
555d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
5563d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	    isatty(fileno(stdin))) {
5573d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		PyObject *v;
5583d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		v = PyImport_ImportModule("readline");
5593d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		if (v == NULL)
5603d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			PyErr_Clear();
5613d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum		else
5623d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum			Py_DECREF(v);
5633d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum	}
5643d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum
565667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command) {
5669a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc		PyObject *commandObj = PyUnicode_FromWideChar(
5679a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc		    command, wcslen(command));
56805f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum		free(command);
5699a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc		if (commandObj != NULL) {
5709a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			sts = PyRun_SimpleStringFlags(
5719a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc				_PyUnicode_AsString(commandObj), &cf) != 0;
5729a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc		}
5739a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc		else {
5749a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			PyErr_Print();
5759a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc			sts = 1;
5769a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc		}
5779a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc		Py_DECREF(commandObj);
578db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger	} else if (module) {
5799cd177526afc086a300b548588880329c32f607dChristian Heimes		sts = RunModule(module, 1);
580667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
581667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	else {
5829cd177526afc086a300b548588880329c32f607dChristian Heimes
583775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename == NULL && stdin_is_interactive) {
584d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum			Py_InspectFlag = 0; /* do exit on SystemExit */
5856caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis			RunStartupFile(&cf);
586667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
587bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
5889cd177526afc086a300b548588880329c32f607dChristian Heimes
5899cd177526afc086a300b548588880329c32f607dChristian Heimes		sts = -1;	/* keep track of whether we've already run __main__ */
5909cd177526afc086a300b548588880329c32f607dChristian Heimes
5919cd177526afc086a300b548588880329c32f607dChristian Heimes		if (filename != NULL) {
5929cd177526afc086a300b548588880329c32f607dChristian Heimes			sts = RunMainFromImporter(filename);
5939cd177526afc086a300b548588880329c32f607dChristian Heimes		}
5949cd177526afc086a300b548588880329c32f607dChristian Heimes
5959cd177526afc086a300b548588880329c32f607dChristian Heimes		if (sts==-1 && filename!=NULL) {
596790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis			if ((fp = _wfopen(filename, L"r")) == NULL) {
597dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc				char cfilename[PATH_MAX];
598dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc				size_t r = wcstombs(cfilename, filename, PATH_MAX);
599dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc				if (r == PATH_MAX)
600dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc					/* cfilename is not null-terminated;
601dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc					 * forcefully null-terminating it
602dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc					 * might break the shift state */
603dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc					strcpy(cfilename, "<file name too long>");
604dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc				if (r == ((size_t)-1))
605dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc					strcpy(cfilename, "<unprintable file name>");
606dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc				fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
607dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc					argv[0], cfilename, errno, strerror(errno));
608ada8c3b046aa6f3684cbc32a4a140a38c204c050Christian Heimes
6099cd177526afc086a300b548588880329c32f607dChristian Heimes				return 2;
6109cd177526afc086a300b548588880329c32f607dChristian Heimes			}
6119cd177526afc086a300b548588880329c32f607dChristian Heimes			else if (skipfirstline) {
6129cd177526afc086a300b548588880329c32f607dChristian Heimes				int ch;
6139cd177526afc086a300b548588880329c32f607dChristian Heimes				/* Push back first newline so line numbers
6149cd177526afc086a300b548588880329c32f607dChristian Heimes				   remain the same */
6159cd177526afc086a300b548588880329c32f607dChristian Heimes				while ((ch = getc(fp)) != EOF) {
6169cd177526afc086a300b548588880329c32f607dChristian Heimes					if (ch == '\n') {
6179cd177526afc086a300b548588880329c32f607dChristian Heimes						(void)ungetc(ch, fp);
6189cd177526afc086a300b548588880329c32f607dChristian Heimes						break;
6199cd177526afc086a300b548588880329c32f607dChristian Heimes					}
6209cd177526afc086a300b548588880329c32f607dChristian Heimes				}
6219cd177526afc086a300b548588880329c32f607dChristian Heimes			}
6229cd177526afc086a300b548588880329c32f607dChristian Heimes			{
6239cd177526afc086a300b548588880329c32f607dChristian Heimes				/* XXX: does this work on Win/Win64? (see posix_fstat) */
6249cd177526afc086a300b548588880329c32f607dChristian Heimes				struct stat sb;
6259cd177526afc086a300b548588880329c32f607dChristian Heimes				if (fstat(fileno(fp), &sb) == 0 &&
6269cd177526afc086a300b548588880329c32f607dChristian Heimes				    S_ISDIR(sb.st_mode)) {
627790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis					fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename);
628679db4aa99352abc3c9d93dcfc30e772760a43daChristian Heimes					fclose(fp);
6299cd177526afc086a300b548588880329c32f607dChristian Heimes					return 1;
6309cd177526afc086a300b548588880329c32f607dChristian Heimes				}
6319cd177526afc086a300b548588880329c32f607dChristian Heimes			}
6329cd177526afc086a300b548588880329c32f607dChristian Heimes		}
6339cd177526afc086a300b548588880329c32f607dChristian Heimes
6349cd177526afc086a300b548588880329c32f607dChristian Heimes		if (sts==-1) {
635374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc			PyObject *filenameObj = NULL;
636790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis			char *p_cfilename = "<stdin>";
637790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis			if (filename) {
638374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc				filenameObj = PyUnicode_FromWideChar(
639374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc					filename, wcslen(filename));
640374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc				if (filenameObj != NULL)
641374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc					p_cfilename = _PyUnicode_AsString(filenameObj);
642374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc				else
643790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis					p_cfilename = "<decoding error>";
644790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis			}
64552f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner			/* call pending calls like signal handlers (SIGINT) */
64652f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner			if (Py_MakePendingCalls() == -1) {
64752f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner				PyErr_Print();
64852f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner				sts = 1;
64952f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner			} else {
65052f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner				sts = PyRun_AnyFileExFlags(
65152f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner					fp,
65252f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner					p_cfilename,
65352f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner					filename != NULL, &cf) != 0;
65452f6dd7a3dd9d672a23d7f654a46f126cfc74968Victor Stinner			}
655374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc			Py_XDECREF(filenameObj);
6569cd177526afc086a300b548588880329c32f607dChristian Heimes		}
6579cd177526afc086a300b548588880329c32f607dChristian Heimes
658667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
659667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
660d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	/* Check this environment variable at the end, to give programs the
661d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	 * opportunity to set it from Python.
662d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	 */
663d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (!Py_InspectFlag &&
664d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	    (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
665d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	{
666d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 1;
667d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw	}
668d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw
669d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	if (Py_InspectFlag && stdin_is_interactive &&
670d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	    (filename != NULL || command != NULL || module != NULL)) {
671d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum		Py_InspectFlag = 0;
672bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		/* XXX */
673bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
674d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum	}
675667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
6765d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum	Py_Finalize();
6773e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
6783e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
6793e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	/* Insure++ is a memory analysis tool that aids in discovering
6803e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory leaks and other memory problems.  On Python exit, the
6811680713e524016d93a94114c4a874ad71a090b95Walter Dörwald	 * interned string dictionaries are flagged as being in use at exit
6823e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * (which it is).  Under normal circumstances, this is fine because
6833e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * the memory will be automatically reclaimed by the system.  Under
6843e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * memory debugging, it's a huge source of useless noise, so we
6853e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * trade off slower shutdown for less distraction in the memory
6863e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 * reports.  -baw
6873e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	 */
6883e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw	_Py_ReleaseInternedStrings();
6891680713e524016d93a94114c4a874ad71a090b95Walter Dörwald	_Py_ReleaseInternedUnicodeStrings();
6903e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
6913e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
69205f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum	return sts;
693667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
694667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
695786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
696786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
697786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
698667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
699667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
700667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
701667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
702667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
703790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv)
704667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
705667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argc = orig_argc;
706667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argv = orig_argv;
707667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
70849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
70949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
71049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
71149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
712