main.c revision ab70e2ab3264c444ac70a1c98e869b0de0b22c4a
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
9b90db4caf014a390fb5d9dca12b8cdcc0ff78c81Victor Stinner#error "PEP 11: VMS is now unsupported, code will be removed in Python 3.4"
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
25ab70e2ab3264c444ac70a1c98e869b0de0b22c4aJesus Cea#if defined(MS_WINDOWS)
26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
27a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
28da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
29a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
30a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
312cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
322cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
33a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
3436002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
3536002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
36a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
3749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
3849fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
3949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
4049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
41ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
42790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t **orig_argv;
43667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
44667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
45bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
4609a7c72cad48f568e0781541167cf9ea6a3f0760Georg Brandl#define BASE_OPTS L"bBc:dEhiJm:OqRsStuvVW:xX:?"
47bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
48bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
493ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
50667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
51667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
52790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
53667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
55393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_1 = "\
56667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
572ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes-b     : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
582ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes         and comparing bytes/bytearray with str. (-bb: issue errors)\n\
59790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
60393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\
6189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d     : debug output from parser; also PYTHONDEBUG=x\n\
62790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E     : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
630e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
6461c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
6561c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\
6698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i     : inspect interactively after running script; forces a prompt even\n\
6798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
68db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\
6989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
706b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
719d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl-q     : don't print version and copyright messages on interactive startup\n\
728dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes-s     : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
737922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
74393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum";
75393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_3 = "\
7698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
77db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger         see man page for details on internal buffering relating to '-u'\n\
7889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-v     : verbose (trace import statements); also PYTHONVERBOSE=x\n\
7989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters         can be supplied multiple times to increase verbosity\n\
800e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-V     : print the Python version number and exit (also --version)\n\
8189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\
820805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey         also PYTHONWARNINGS=arg\n\
83393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
849583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou-X opt : set implementation-specific option\n\
857922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
86393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\
8798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile   : program read from script file\n\
8898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
8989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\
90667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
92a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
93667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
94790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes";
959802b39c12712e924bed699812756ce5076b77a3Victor Stinnerstatic char *usage_5 =
969802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n"
979802b39c12712e924bed699812756ce5076b77a3Victor Stinner"               The default module search path uses %s.\n"
989802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
999802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
1002fb477c0f0284439d40cb3f46eea45ef42446e53Georg Brandl"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n\
101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
1022daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandlstatic char *usage_6 = "\
10342ae472798d4be46038ea7769ee4cabbcc0e3be0Georg BrandlPYTHONHASHSEED: if this variable is set to 'random', a random value is used\n\
104c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson   to seed the hashes of str, bytes and datetime objects.  It can also be\n\
105c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson   set to an integer in the range [0,4294967295] to get hash values with a\n\
106c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson   predictable seed.\n\
1072daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl";
108667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
109852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
110790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisusage(int exitcode, wchar_t* program)
1113b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *f = exitcode ? stderr : stdout;
113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fprintf(f, usage_line, program);
115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode)
116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, "Try `python -h' for more information.\n");
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_1, f);
119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_2, f);
120f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_3, f);
121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, usage_4, DELIM);
122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
1232daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl        fputs(usage_6, f);
124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
12579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS)
126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode == 0) {
127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* suppress 'error' message */
128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* STS$M_INHIB_MSG + SS$_ABORT */
132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0x1000002c;
133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
13479acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else
135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return exitcode;
13679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /*NOTREACHED*/
1383b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1393b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1406caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1416caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *startup = Py_GETENV("PYTHONSTARTUP");
143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (startup != NULL && startup[0] != '\0') {
144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        FILE *fp = fopen(startup, "r");
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (fp != NULL) {
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        } else {
150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            int save_errno;
151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            save_errno = errno;
153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errno = save_errno;
155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetFromErrnoWithFilename(PyExc_IOError,
156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            startup);
157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Print();
158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
160f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1616caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1626caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
163db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
1645651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0)
165a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *module, *runpy, *runmodule, *runargs, *result;
167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runpy = PyImport_ImportModule("runpy");
168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runpy == NULL) {
169f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not import runpy module\n");
170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runmodule == NULL) {
174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not access runpy._run_module_as_main\n");
175f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
176f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
177f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    module = PyUnicode_FromWideChar(modname, wcslen(modname));
179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module == NULL) {
180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not convert module name to unicode\n");
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runargs = Py_BuildValue("(Oi)", module, set_argv0);
186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runargs == NULL) {
187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr,
188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "Could not create arguments for runpy._run_module_as_main\n");
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(module);
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyObject_Call(runmodule, runargs, NULL);
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runpy);
199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runmodule);
200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(module);
201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runargs);
202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(result);
206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
207db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
2083b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
2094726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnerstatic int
2104726e40e00ad9c2e333c4dfc5005f410a520834cVictor StinnerRunMainFromImporter(wchar_t *filename)
2119cd177526afc086a300b548588880329c32f607dChristian Heimes{
2124726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    PyObject *argv0 = NULL, *importer, *sys_path;
2134726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    int sts;
214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2154726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    argv0 = PyUnicode_FromWideChar(filename, wcslen(filename));
2164726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (argv0 == NULL)
2174726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2184726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2194726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    importer = PyImport_GetImporter(argv0);
2204726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (importer == NULL)
2214726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2224726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
223aa93642a35ed570ba91a80c583df2c8a383686d6Brett Cannon    if (importer == Py_None) {
2244726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        Py_DECREF(argv0);
2254726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        Py_DECREF(importer);
226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2284726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_DECREF(importer);
2294726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2304726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    /* argv0 is usable as an import source, so put it in sys.path[0]
2314726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner       and import __main__ */
2324726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    sys_path = PySys_GetObject("path");
2334726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (sys_path == NULL)
2344726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2354726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (PyList_SetItem(sys_path, 0, argv0)) {
2364726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        argv0 = NULL;
2374726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2384726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    }
2394726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_INCREF(argv0);
2404726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2414726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    sts = RunModule(L"__main__", 0);
2424726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return sts != 0;
2434726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2444726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnererror:
2454726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_XDECREF(argv0);
2464726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    PyErr_Print();
2474726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return 1;
2489cd177526afc086a300b548588880329c32f607dChristian Heimes}
2499cd177526afc086a300b548588880329c32f607dChristian Heimes
250a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerstatic int
251a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerrun_command(wchar_t *command, PyCompilerFlags *cf)
252a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner{
253a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyObject *unicode, *bytes;
254a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    int ret;
255a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
256a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    unicode = PyUnicode_FromWideChar(command, -1);
257a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (unicode == NULL)
258a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
259a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    bytes = PyUnicode_AsUTF8String(unicode);
260a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(unicode);
261a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (bytes == NULL)
262a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
263a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
264a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(bytes);
265a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return ret != 0;
266a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
267a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnererror:
268398356baaa60b1e46ce45ec7b8ae8ac28ca53091Victor Stinner    PySys_WriteStderr("Unable to decode the command from the command line:\n");
269a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyErr_Print();
270a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return 1;
271a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner}
272a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
2730a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerstatic int
2740a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerrun_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
2750a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner{
2760a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    PyObject *unicode, *bytes = NULL;
2770a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    char *filename_str;
2780a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    int run;
2790a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2800a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    /* call pending calls like signal handlers (SIGINT) */
2810a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (Py_MakePendingCalls() == -1) {
2820a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        PyErr_Print();
2830a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        return 1;
2840a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
2850a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2860a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (filename) {
2870a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
2880a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (unicode != NULL) {
289e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            bytes = PyUnicode_EncodeFSDefault(unicode);
2900a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            Py_DECREF(unicode);
2910a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
2920a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (bytes != NULL)
2930a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            filename_str = PyBytes_AsString(bytes);
2940a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        else {
2950a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            PyErr_Clear();
296e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            filename_str = "<encoding error>";
2970a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
2980a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
2990a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    else
3000a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        filename_str = "<stdin>";
3010a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3020a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
3030a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    Py_XDECREF(bytes);
3040a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    return run != 0;
3050a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner}
3060a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3079cd177526afc086a300b548588880329c32f607dChristian Heimes
308667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
309667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
310fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
311790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv)
312667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int c;
314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int sts;
315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *command = NULL;
316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *filename = NULL;
317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *module = NULL;
318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *fp = stdin;
319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *p;
320e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *wp;
322e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
323f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int skipfirstline = 0;
324f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int stdin_is_interactive = 0;
325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int help = 0;
326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int version = 0;
327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int saw_unbuffered_flag = 0;
328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags cf;
329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    cf.cf_flags = 0;
331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argc = argc;           /* For Py_GetArgcArgv() */
333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argv = argv;
334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
33586838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    /* Hash randomization needed early for all string operations
33686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou       (including -W and -X options). */
33786838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
33886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        if (c == 'm' || c == 'c') {
33986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            /* -c / -m is the last option: following arguments are
34086838b02f04a01445778584afb7acd0b05081335Antoine Pitrou               not interpreter options. */
34186838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            break;
34286838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        }
343c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson        if (c == 'E') {
34486838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            Py_IgnoreEnvironmentFlag++;
34586838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            break;
34686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        }
34786838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    }
34886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou
349c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson    Py_HashRandomizationFlag = 1;
35086838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    _PyRandom_Init();
35186838b02f04a01445778584afb7acd0b05081335Antoine Pitrou
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_ResetWarnOptions();
35386838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    _PyOS_ResetGetOpt();
354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'c') {
357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            size_t len;
358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -c is the last option; following arguments
359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               command to interpret. */
361f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
362f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            len = wcslen(_PyOS_optarg) + 1 + 1;
363f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command = (wchar_t *)malloc(sizeof(wchar_t) * len);
364f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (command == NULL)
365f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_FatalError(
366f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "not enough memory to copy -c argument");
367f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            wcscpy(command, _PyOS_optarg);
368f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 2] = '\n';
369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 1] = 0;
370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
371f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'm') {
374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -m is the last option; following arguments
375f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               module to interpret. */
377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            module = _PyOS_optarg;
378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
379f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        switch (c) {
382f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'b':
383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_BytesWarningFlag++;
384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'd':
387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DebugFlag++;
388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'i':
391f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag++;
392f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InteractiveFlag++;
393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* case 'J': reserved for Jython */
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'O':
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_OptimizeFlag++;
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'B':
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DontWriteBytecodeFlag++;
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 's':
406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoUserSiteDirectory++;
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'S':
410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoSiteFlag++;
411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'E':
41486838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            /* Already handled above */
415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 't':
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* ignored for backwards compatibility */
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'u':
422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_UnbufferedStdioFlag = 1;
423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            saw_unbuffered_flag = 1;
424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'v':
427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_VerboseFlag++;
428f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
429f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'x':
431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            skipfirstline = 1;
432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'h':
435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case '?':
436f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            help++;
437f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
439f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'V':
440f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            version++;
441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
443f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'W':
444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(_PyOS_optarg);
445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
446f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4479583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou        case 'X':
4489583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            PySys_AddXOption(_PyOS_optarg);
4499583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            break;
4509583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou
4519d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl        case 'q':
4528aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl            Py_QuietFlag++;
4539d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl            break;
4549d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl
4552daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl        case 'R':
456c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson            /* Ignored */
4572daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl            break;
4582daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl
459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* This space reserved for other options */
460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        default:
462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return usage(2, argv[0]);
463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /*NOTREACHED*/
464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
4677d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (help)
469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return usage(0, argv[0]);
470f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
471f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (version) {
472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s\n", PY_VERSION);
473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!saw_unbuffered_flag &&
480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_UnbufferedStdioFlag = 1;
482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_NoUserSiteDirectory &&
484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_NoUserSiteDirectory = 1;
4868dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes
487e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *wp != L'\0') {
490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t *buf, *warning;
491f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buf = (wchar_t *)malloc((wcslen(wp) + 1) * sizeof(wchar_t));
493f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
494f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
495f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
496f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscpy(buf, wp);
497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (warning = wcstok(buf, L",");
498f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning != NULL;
499f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning = wcstok(NULL, L",")) {
500f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(warning);
501f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
502f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(buf);
503f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
504e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#else
505f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
506f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char *buf, *oldloc;
507c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner        PyObject *unicode;
508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* settle for strtok here as there's no one standard
510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           C89 wcstok */
511f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buf = (char *)malloc(strlen(p) + 1);
512f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
513f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
514f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        strcpy(buf, p);
516f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        oldloc = strdup(setlocale(LC_ALL, NULL));
517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, "");
518f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
5195c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#ifdef __APPLE__
5205c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            /* Use utf-8 on Mac OS X */
5215c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            unicode = PyUnicode_FromString(p);
5225c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#else
5231b57967b96daeb505e9d2dbe3cd347625dcb0739Victor Stinner            unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
5245c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#endif
525af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner            if (unicode == NULL) {
526af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner                /* ignore errors */
527af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner                PyErr_Clear();
528c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner                continue;
529af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner            }
530c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            PySys_AddWarnOptionUnicode(unicode);
531c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            Py_DECREF(unicode);
532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, oldloc);
534f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(oldloc);
535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(buf);
536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
537e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
5380805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command == NULL && module == NULL && _PyOS_optind < argc &&
540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscmp(argv[_PyOS_optind], L"-") != 0)
541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
5427a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS
543f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = decc$translate_vms(argv[_PyOS_optind]);
544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == (char *)0 || filename == (char *)-1)
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            filename = argv[_PyOS_optind];
5467a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis
5477a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else
548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = argv[_PyOS_optind];
5497a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif
550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
551775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
553775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
5549cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
55589e343660623862acbd40cc617b4af262d6c799fVictor Stinner    /* don't translate newlines (\r\n <=> \n) */
55689e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdin), O_BINARY);
55789e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdout), O_BINARY);
55889e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stderr), O_BINARY);
559f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
56089e343660623862acbd40cc617b4af262d6c799fVictor Stinner
56189e343660623862acbd40cc617b4af262d6c799fVictor Stinner    if (Py_UnbufferedStdioFlag) {
56222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
565f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
56622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
567f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdin,  (char *)NULL);
568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdout, (char *)NULL);
569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stderr, (char *)NULL);
57022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (Py_InteractiveFlag) {
573b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
574f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Doesn't have to have line-buffered -- use unbuffered */
575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
57722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
57822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
58122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
58222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Leave stderr alone - it should be unbuffered anyway. */
584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
58579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
587f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
58979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */
590667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
5912ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* On MacOS X, when the Python interpreter is embedded in an
593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       application bundle, it gets executed by a bootstrapping script
594f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       that does os.execve() with an argv[0] that's different from the
595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       actual Python executable. This is needed to keep the Finder happy,
596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       or rather, to work around Apple's overly strict requirements of
597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       the process name. However, we still need a usable sys.executable,
598f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       so the actual executable path is passed in an environment variable.
599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
600f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       script. */
601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
602f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t* buffer;
603eb61f8b3a726a8cd1ae3bc3794623e7fe4dd5703Ronald Oussoren        size_t len = strlen(p) + 1;
604f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buffer = malloc(len * sizeof(wchar_t));
606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buffer == NULL) {
607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONEXECUTABLE");
609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
611b94767ff44edf5d461d7cb1c8eb5160f83886358Brett Cannon        mbstowcs(buffer, p, len);
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(buffer);
613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* buffer is now handed off - do not free */
614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
61590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#ifdef WITH_NEXT_FRAMEWORK
61690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
61790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
61890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        if (pyvenv_launcher && *pyvenv_launcher) {
61990db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            /* Used by Mac/Tools/pythonw.c to forward
62090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             * the argv0 of the stub executable
62190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             */
62290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            wchar_t* wbuf = _Py_char2wchar(pyvenv_launcher, NULL);
62390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
62490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            if (wbuf == NULL) {
62590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip                Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
62690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            }
62790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            Py_SetProgramName(wbuf);
62890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
62990db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            /* Don't free wbuf, the argument to Py_SetProgramName
63090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             * must remain valid until the Py_Finalize is called.
63190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             */
63290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        } else {
63390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            Py_SetProgramName(argv[0]);
63490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        }
63590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#else
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(argv[0]);
63790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#endif
638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
6392ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_SetProgramName(argv[0]);
641fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Initialize();
643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
6448aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl    if (!Py_QuietFlag && (Py_VerboseFlag ||
6459d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                        (command == NULL && filename == NULL &&
6469d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                         module == NULL && stdin_is_interactive))) {
647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s on %s\n",
648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_GetVersion(), Py_GetPlatform());
649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!Py_NoSiteFlag)
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "%s\n", COPYRIGHT);
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
653f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command != NULL) {
654f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
655f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
656f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        argv[_PyOS_optind] = L"-c";
657f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
658f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
659f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module != NULL) {
660d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
662d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        argv[_PyOS_optind] = L"-m";
663f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
664f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        isatty(fileno(stdin))) {
669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *v;
670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyImport_ImportModule("readline");
671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (v == NULL)
672f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(v);
675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
677f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command) {
678a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        sts = run_command(command, &cf);
679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(command);
680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else if (module) {
681f01a337950bdcd6905d12b2335ba4d8773f6b8e5Senthil Kumaran        sts = (RunModule(module, 1) != 0);
682f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
683f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
684f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
685f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == NULL && stdin_is_interactive) {
686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag = 0; /* do exit on SystemExit */
687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            RunStartupFile(&cf);
688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = -1;               /* keep track of whether we've already run __main__ */
692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename != NULL) {
694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            sts = RunMainFromImporter(filename);
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (sts==-1 && filename!=NULL) {
6989a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            fp = _Py_wfopen(filename, L"r");
6999a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            if (fp == NULL) {
7009a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                char *cfilename_buffer;
7019a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                const char *cfilename;
702c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou                int err = errno;
7032f02a511353c761bef2ab867ca4295bbb0217b96Victor Stinner                cfilename_buffer = _Py_wchar2char(filename, NULL);
7049a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer != NULL)
7059a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = cfilename_buffer;
7069a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                else
7079a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = "<unprintable file name>";
708f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
709c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou                    argv[0], cfilename, err, strerror(err));
7109a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer)
7119a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    PyMem_Free(cfilename_buffer);
712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return 2;
713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else if (skipfirstline) {
715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                int ch;
716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* Push back first newline so line numbers
717f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   remain the same */
718f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                while ((ch = getc(fp)) != EOF) {
719f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    if (ch == '\n') {
720f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        (void)ungetc(ch, fp);
721f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        break;
722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    }
723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
724f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            {
726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* XXX: does this work on Win/Win64? (see posix_fstat) */
727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                struct stat sb;
728f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (fstat(fileno(fp), &sb) == 0 &&
729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    S_ISDIR(sb.st_mode)) {
730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename);
731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fclose(fp);
732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return 1;
733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
7370a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (sts == -1)
7380a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            sts = run_file(fp, filename, &cf);
739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
740f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Check this environment variable at the end, to give programs the
742f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * opportunity to set it from Python.
743f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
745f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
746f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
747f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
748f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
750f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_InspectFlag && stdin_is_interactive &&
751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (filename != NULL || command != NULL || module != NULL)) {
752f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 0;
753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
754f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
756f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
757f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Finalize();
7583e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
7593e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Insure++ is a memory analysis tool that aids in discovering
761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory leaks and other memory problems.  On Python exit, the
762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * interned string dictionaries are flagged as being in use at exit
763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * (which it is).  Under normal circumstances, this is fine because
764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the memory will be automatically reclaimed by the system.  Under
765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory debugging, it's a huge source of useless noise, so we
766f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * trade off slower shutdown for less distraction in the memory
767f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * reports.  -baw
768f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
769f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_ReleaseInternedUnicodeStrings();
7703e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
7713e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
772f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return sts;
773667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
774667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
775786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
776786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
777786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
778667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
779667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
780667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
781667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
782667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
783790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv)
784667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argc = orig_argc;
786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argv = orig_argv;
787667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
78849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
78949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
79049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
79149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
792