main.c revision b94767ff44edf5d461d7cb1c8eb5160f83886358
1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */
2667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h"
4a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#include "osdefs.h"
5667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
65651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou#include <locale.h>
75651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou
879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
97a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#include <unixlib.h>
1079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
1179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis
129cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
13945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <windows.h>
14477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H
153e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
16790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#define PATH_MAX MAXPATHLEN
173e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
18477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
193e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
20945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#ifdef _MSC_VER
21945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <crtdbg.h>
22945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#endif
23945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis
247bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
25a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
277bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC)
287bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#define PYTHONHOMEHELP "<prefix>/Lib"
297bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#else
30da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
31a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
327bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#endif
33a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
342cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
352cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
36a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
3736002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
3836002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
39a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
4049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
4149fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
4249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
4349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
44ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
45790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t **orig_argv;
46667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
48bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
499d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl#define BASE_OPTS L"bBc:dEhiJm:OqsStuvVW:xX:?"
50bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
51bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
523ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
53667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
55790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
56667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
57667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
58393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_1 = "\
59667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
602ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes-b     : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
612ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes         and comparing bytes/bytearray with str. (-bb: issue errors)\n\
62790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
63393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\
6489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d     : debug output from parser; also PYTHONDEBUG=x\n\
65790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E     : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
660e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
6761c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
6861c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\
6998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i     : inspect interactively after running script; forces a prompt even\n\
7098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
71db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\
7289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
736b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
749d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl-q     : don't print version and copyright messages on interactive startup\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\
879583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou-X opt : set implementation-specific option\n\
887922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
89393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\
9098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile   : program read from script file\n\
9198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
9289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\
93667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
94667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
95a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
97790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes";
989802b39c12712e924bed699812756ce5076b77a3Victor Stinnerstatic char *usage_5 =
999802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n"
1009802b39c12712e924bed699812756ce5076b77a3Victor Stinner"               The default module search path uses %s.\n"
1019802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
1029802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
1039802b39c12712e924bed699812756ce5076b77a3Victor Stinner;
104667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
105852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
106790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisusage(int exitcode, wchar_t* program)
1073b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *f = exitcode ? stderr : stdout;
109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fprintf(f, usage_line, program);
111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode)
112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, "Try `python -h' for more information.\n");
113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_1, f);
115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_2, f);
116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_3, f);
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, usage_4, DELIM);
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
12079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS)
121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode == 0) {
122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* suppress 'error' message */
123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* STS$M_INHIB_MSG + SS$_ABORT */
127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0x1000002c;
128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
12979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else
130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return exitcode;
13179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /*NOTREACHED*/
1333b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1343b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1356caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1366caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *startup = Py_GETENV("PYTHONSTARTUP");
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (startup != NULL && startup[0] != '\0') {
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        FILE *fp = fopen(startup, "r");
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (fp != NULL) {
141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        } else {
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            int save_errno;
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            save_errno = errno;
148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errno = save_errno;
150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetFromErrnoWithFilename(PyExc_IOError,
151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            startup);
152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Print();
153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1566caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1576caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
158db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
1595651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0)
160a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
161f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *module, *runpy, *runmodule, *runargs, *result;
162f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runpy = PyImport_ImportModule("runpy");
163f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runpy == NULL) {
164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not import runpy module\n");
165f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runmodule == NULL) {
169f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not access runpy._run_module_as_main\n");
170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    module = PyUnicode_FromWideChar(modname, wcslen(modname));
174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module == NULL) {
175f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not convert module name to unicode\n");
176f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
177f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runargs = Py_BuildValue("(Oi)", module, set_argv0);
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runargs == NULL) {
182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr,
183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "Could not create arguments for runpy._run_module_as_main\n");
184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(module);
187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyObject_Call(runmodule, runargs, NULL);
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runpy);
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runmodule);
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(module);
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runargs);
197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(result);
201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
202db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
2033b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
2044726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnerstatic int
2054726e40e00ad9c2e333c4dfc5005f410a520834cVictor StinnerRunMainFromImporter(wchar_t *filename)
2069cd177526afc086a300b548588880329c32f607dChristian Heimes{
2074726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    PyObject *argv0 = NULL, *importer, *sys_path;
2084726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    int sts;
209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2104726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    argv0 = PyUnicode_FromWideChar(filename, wcslen(filename));
2114726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (argv0 == NULL)
2124726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2134726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2144726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    importer = PyImport_GetImporter(argv0);
2154726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (importer == NULL)
2164726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2174726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2184726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (importer->ob_type == &PyNullImporter_Type) {
2194726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        Py_DECREF(argv0);
2204726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        Py_DECREF(importer);
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2234726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_DECREF(importer);
2244726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2254726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    /* argv0 is usable as an import source, so put it in sys.path[0]
2264726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner       and import __main__ */
2274726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    sys_path = PySys_GetObject("path");
2284726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (sys_path == NULL)
2294726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2304726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (PyList_SetItem(sys_path, 0, argv0)) {
2314726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        argv0 = NULL;
2324726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2334726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    }
2344726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_INCREF(argv0);
2354726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2364726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    sts = RunModule(L"__main__", 0);
2374726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return sts != 0;
2384726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2394726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnererror:
2404726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_XDECREF(argv0);
2414726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    PyErr_Print();
2424726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return 1;
2439cd177526afc086a300b548588880329c32f607dChristian Heimes}
2449cd177526afc086a300b548588880329c32f607dChristian Heimes
245a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerstatic int
246a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerrun_command(wchar_t *command, PyCompilerFlags *cf)
247a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner{
248a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyObject *unicode, *bytes;
249a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    int ret;
250a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
251a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    unicode = PyUnicode_FromWideChar(command, -1);
252a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (unicode == NULL)
253a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
254a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    bytes = PyUnicode_AsUTF8String(unicode);
255a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(unicode);
256a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (bytes == NULL)
257a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
258a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
259a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(bytes);
260a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return ret != 0;
261a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
262a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnererror:
263398356baaa60b1e46ce45ec7b8ae8ac28ca53091Victor Stinner    PySys_WriteStderr("Unable to decode the command from the command line:\n");
264a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyErr_Print();
265a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return 1;
266a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner}
267a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
2680a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerstatic int
2690a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerrun_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
2700a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner{
2710a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    PyObject *unicode, *bytes = NULL;
2720a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    char *filename_str;
2730a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    int run;
2740a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2750a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    /* call pending calls like signal handlers (SIGINT) */
2760a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (Py_MakePendingCalls() == -1) {
2770a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        PyErr_Print();
2780a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        return 1;
2790a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
2800a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2810a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (filename) {
2820a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
2830a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (unicode != NULL) {
284e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            bytes = PyUnicode_EncodeFSDefault(unicode);
2850a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            Py_DECREF(unicode);
2860a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
2870a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (bytes != NULL)
2880a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            filename_str = PyBytes_AsString(bytes);
2890a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        else {
2900a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            PyErr_Clear();
291e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            filename_str = "<encoding error>";
2920a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
2930a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
2940a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    else
2950a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        filename_str = "<stdin>";
2960a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2970a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
2980a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    Py_XDECREF(bytes);
2990a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    return run != 0;
3000a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner}
3010a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3029cd177526afc086a300b548588880329c32f607dChristian Heimes
303667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
304667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
305fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
306790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv)
307667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int c;
309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int sts;
310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *command = NULL;
311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *filename = NULL;
312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *module = NULL;
313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *fp = stdin;
314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *p;
315e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *wp;
317e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int skipfirstline = 0;
319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int stdin_is_interactive = 0;
320f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int help = 0;
321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int version = 0;
322f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int saw_unbuffered_flag = 0;
323f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags cf;
324f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    cf.cf_flags = 0;
326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argc = argc;           /* For Py_GetArgcArgv() */
328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argv = argv;
329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_ResetWarnOptions();
331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'c') {
334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            size_t len;
335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -c is the last option; following arguments
336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               command to interpret. */
338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            len = wcslen(_PyOS_optarg) + 1 + 1;
340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command = (wchar_t *)malloc(sizeof(wchar_t) * len);
341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (command == NULL)
342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_FatalError(
343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "not enough memory to copy -c argument");
344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            wcscpy(command, _PyOS_optarg);
345f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 2] = '\n';
346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 1] = 0;
347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
348f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'm') {
351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -m is the last option; following arguments
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               module to interpret. */
354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            module = _PyOS_optarg;
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        switch (c) {
359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'b':
360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_BytesWarningFlag++;
361f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
362f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
363f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'd':
364f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DebugFlag++;
365f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
366f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
367f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'i':
368f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag++;
369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InteractiveFlag++;
370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
371f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* case 'J': reserved for Jython */
373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'O':
375f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_OptimizeFlag++;
376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'B':
379f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DontWriteBytecodeFlag++;
380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
382f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 's':
383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoUserSiteDirectory++;
384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'S':
387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoSiteFlag++;
388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'E':
391f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_IgnoreEnvironmentFlag++;
392f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 't':
395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* ignored for backwards compatibility */
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'u':
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_UnbufferedStdioFlag = 1;
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            saw_unbuffered_flag = 1;
401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'v':
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_VerboseFlag++;
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'x':
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            skipfirstline = 1;
409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'h':
412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case '?':
413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            help++;
414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'V':
417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            version++;
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'W':
421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(_PyOS_optarg);
422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4249583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou        case 'X':
4259583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            PySys_AddXOption(_PyOS_optarg);
4269583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            break;
4279583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou
4289d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl        case 'q':
4298aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl            Py_QuietFlag++;
4309d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl            break;
4319d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl
432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* This space reserved for other options */
433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        default:
435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return usage(2, argv[0]);
436f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /*NOTREACHED*/
437f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
439f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
4407d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (help)
442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return usage(0, argv[0]);
443f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (version) {
445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s\n", PY_VERSION);
446f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
447f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!saw_unbuffered_flag &&
453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
454f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_UnbufferedStdioFlag = 1;
455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
456f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_NoUserSiteDirectory &&
457f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_NoUserSiteDirectory = 1;
4598dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes
460e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *wp != L'\0') {
463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t *buf, *warning;
464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buf = (wchar_t *)malloc((wcslen(wp) + 1) * sizeof(wchar_t));
466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
467f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscpy(buf, wp);
470f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (warning = wcstok(buf, L",");
471f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning != NULL;
472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning = wcstok(NULL, L",")) {
473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(warning);
474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(buf);
476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
477e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#else
478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char *buf, *oldloc;
480c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner        PyObject *unicode;
481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* settle for strtok here as there's no one standard
483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           C89 wcstok */
484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buf = (char *)malloc(strlen(p) + 1);
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
487f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        strcpy(buf, p);
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        oldloc = strdup(setlocale(LC_ALL, NULL));
490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, "");
491f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
4925c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#ifdef __APPLE__
4935c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            /* Use utf-8 on Mac OS X */
4945c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            unicode = PyUnicode_FromString(p);
4955c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#else
496168e117e0a8825bc3ae0c08f0b08a33ac351a14fVictor Stinner            wchar_t *wchar;
497168e117e0a8825bc3ae0c08f0b08a33ac351a14fVictor Stinner            size_t len;
498168e117e0a8825bc3ae0c08f0b08a33ac351a14fVictor Stinner            wchar = _Py_char2wchar(p, &len);
499c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            if (wchar == NULL)
500c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner                continue;
501168e117e0a8825bc3ae0c08f0b08a33ac351a14fVictor Stinner            unicode = PyUnicode_FromWideChar(wchar, len);
502c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            PyMem_Free(wchar);
5035c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#endif
504c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            if (unicode == NULL)
505c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner                continue;
506c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            PySys_AddWarnOptionUnicode(unicode);
507c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            Py_DECREF(unicode);
508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, oldloc);
510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(oldloc);
511f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(buf);
512f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
513e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
5140805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey
515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command == NULL && module == NULL && _PyOS_optind < argc &&
516f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscmp(argv[_PyOS_optind], L"-") != 0)
517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
5187a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS
519f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = decc$translate_vms(argv[_PyOS_optind]);
520f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == (char *)0 || filename == (char *)-1)
521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            filename = argv[_PyOS_optind];
5227a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis
5237a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else
524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = argv[_PyOS_optind];
5257a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif
526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
527775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
529775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
5309cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
53189e343660623862acbd40cc617b4af262d6c799fVictor Stinner    /* don't translate newlines (\r\n <=> \n) */
53289e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdin), O_BINARY);
53389e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdout), O_BINARY);
53489e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stderr), O_BINARY);
535f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
53689e343660623862acbd40cc617b4af262d6c799fVictor Stinner
53789e343660623862acbd40cc617b4af262d6c799fVictor Stinner    if (Py_UnbufferedStdioFlag) {
53822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
54222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
543f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdin,  (char *)NULL);
544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdout, (char *)NULL);
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stderr, (char *)NULL);
54622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (Py_InteractiveFlag) {
549b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Doesn't have to have line-buffered -- use unbuffered */
551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
55322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
55422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
55722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
55822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Leave stderr alone - it should be unbuffered anyway. */
560f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
56179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
56579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */
566667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
5672ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* On MacOS X, when the Python interpreter is embedded in an
569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       application bundle, it gets executed by a bootstrapping script
570f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       that does os.execve() with an argv[0] that's different from the
571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       actual Python executable. This is needed to keep the Finder happy,
572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       or rather, to work around Apple's overly strict requirements of
573f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       the process name. However, we still need a usable sys.executable,
574f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       so the actual executable path is passed in an environment variable.
575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       script. */
577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t* buffer;
579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        size_t len = strlen(p);
580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
581f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buffer = malloc(len * sizeof(wchar_t));
582f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buffer == NULL) {
583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONEXECUTABLE");
585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
587b94767ff44edf5d461d7cb1c8eb5160f83886358Brett Cannon        mbstowcs(buffer, p, len);
588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(buffer);
589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* buffer is now handed off - do not free */
590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(argv[0]);
592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
5932ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
594f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_SetProgramName(argv[0]);
595fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Initialize();
597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
5988aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl    if (!Py_QuietFlag && (Py_VerboseFlag ||
5999d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                        (command == NULL && filename == NULL &&
6009d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                         module == NULL && stdin_is_interactive))) {
601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s on %s\n",
602f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_GetVersion(), Py_GetPlatform());
603f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!Py_NoSiteFlag)
604f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "%s\n", COPYRIGHT);
605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command != NULL) {
608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        argv[_PyOS_optind] = L"-c";
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module != NULL) {
614d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
616d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        argv[_PyOS_optind] = L"-m";
617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
622f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        isatty(fileno(stdin))) {
623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *v;
624f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyImport_ImportModule("readline");
625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (v == NULL)
626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
628f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(v);
629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
631f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command) {
632a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        sts = run_command(command, &cf);
633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(command);
634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else if (module) {
635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = RunModule(module, 1);
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
639f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == NULL && stdin_is_interactive) {
640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag = 0; /* do exit on SystemExit */
641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            RunStartupFile(&cf);
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = -1;               /* keep track of whether we've already run __main__ */
646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename != NULL) {
648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            sts = RunMainFromImporter(filename);
649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (sts==-1 && filename!=NULL) {
6529a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            fp = _Py_wfopen(filename, L"r");
6539a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            if (fp == NULL) {
6549a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                char *cfilename_buffer;
6559a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                const char *cfilename;
6562f02a511353c761bef2ab867ca4295bbb0217b96Victor Stinner                cfilename_buffer = _Py_wchar2char(filename, NULL);
6579a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer != NULL)
6589a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = cfilename_buffer;
6599a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                else
6609a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = "<unprintable file name>";
661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
662f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    argv[0], cfilename, errno, strerror(errno));
6639a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer)
6649a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    PyMem_Free(cfilename_buffer);
665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return 2;
666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else if (skipfirstline) {
668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                int ch;
669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* Push back first newline so line numbers
670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   remain the same */
671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                while ((ch = getc(fp)) != EOF) {
672f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    if (ch == '\n') {
673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        (void)ungetc(ch, fp);
674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        break;
675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    }
676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
677f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
678f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            {
679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* XXX: does this work on Win/Win64? (see posix_fstat) */
680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                struct stat sb;
681f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (fstat(fileno(fp), &sb) == 0 &&
682f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    S_ISDIR(sb.st_mode)) {
683f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename);
684f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fclose(fp);
685f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return 1;
686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
6900a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (sts == -1)
6910a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            sts = run_file(fp, filename, &cf);
692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Check this environment variable at the end, to give programs the
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * opportunity to set it from Python.
696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_InspectFlag && stdin_is_interactive &&
704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (filename != NULL || command != NULL || module != NULL)) {
705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 0;
706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
708f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Finalize();
7113e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
7123e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Insure++ is a memory analysis tool that aids in discovering
714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory leaks and other memory problems.  On Python exit, the
715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * interned string dictionaries are flagged as being in use at exit
716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * (which it is).  Under normal circumstances, this is fine because
717f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the memory will be automatically reclaimed by the system.  Under
718f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory debugging, it's a huge source of useless noise, so we
719f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * trade off slower shutdown for less distraction in the memory
720f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * reports.  -baw
721f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_ReleaseInternedUnicodeStrings();
7233e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
7243e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return sts;
726667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
727667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
728786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
729786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
730786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
731667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
732667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
733667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
734667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
735667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
736790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv)
737667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
738f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argc = orig_argc;
739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argv = orig_argv;
740667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
74149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
74249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
74349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
74449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
745