main.c revision 0e175a6e762676fca6bfd656912bb862e29fbdd5
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
89cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
9945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <windows.h>
10477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H
113e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
123e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
13477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
143e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
15945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#ifdef _MSC_VER
16945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <crtdbg.h>
17945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#endif
18945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis
19ab70e2ab3264c444ac70a1c98e869b0de0b22c4aJesus Cea#if defined(MS_WINDOWS)
20a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
21a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
22da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
23a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
24a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
252cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
262cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
27a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
2836002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
2936002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
30a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
3149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
3249fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
3349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
3449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
35ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
36790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t **orig_argv;
37667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
38667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
39bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
40ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
41bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
42bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
433ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
44667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
452d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_line[] =
46790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
48667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
492d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_1[] = "\
50667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
512ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes-b     : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
522ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes         and comparing bytes/bytearray with str. (-bb: issue errors)\n\
53790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
54393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\
5589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d     : debug output from parser; also PYTHONDEBUG=x\n\
56790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E     : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
570e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
5861c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
592d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_2[] = "\
6098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i     : inspect interactively after running script; forces a prompt even\n\
6198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
62ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes-I     : isolate Python from the user's environment (implies -E and -s)\n\
63db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\
6489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
656b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
669d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl-q     : don't print version and copyright messages on interactive startup\n\
678dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes-s     : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
687922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
69393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum";
702d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_3[] = "\
7161b0c672b5e9ba1cf564947ecb38d175fd70ea7eEzio Melotti-u     : unbuffered binary stdout and stderr, stdin always buffered;\n\
7261b0c672b5e9ba1cf564947ecb38d175fd70ea7eEzio Melotti         also PYTHONUNBUFFERED=x\n\
73db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger         see man page for details on internal buffering relating to '-u'\n\
7489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-v     : verbose (trace import statements); also PYTHONVERBOSE=x\n\
7589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters         can be supplied multiple times to increase verbosity\n\
760e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-V     : print the Python version number and exit (also --version)\n\
770e175a6e762676fca6bfd656912bb862e29fbdd5INADA Naoki         when given twice, print more information about the build\n\
7889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\
790805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey         also PYTHONWARNINGS=arg\n\
80393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
819583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou-X opt : set implementation-specific option\n\
827922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
832d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_4[] = "\
8498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile   : program read from script file\n\
8598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
8689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\
87667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
88667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
891ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy StorchakaPYTHONPATH   : '%lc'-separated list of directories prefixed to the\n\
90667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
91790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes";
922d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_5[] =
931ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka"PYTHONHOME   : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
949802b39c12712e924bed699812756ce5076b77a3Victor Stinner"               The default module search path uses %s.\n"
959802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
969802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
9734be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
9834be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinnerstatic const char usage_6[] =
9934be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
10034be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   to seed the hashes of str, bytes and datetime objects.  It can also be\n"
10134be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   set to an integer in the range [0,4294967295] to get hash values with a\n"
10234be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   predictable seed.\n"
10334be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
10434be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
10534be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   hooks.\n";
106667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
107852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
108ef1585eb9a488ae8ce3ff057f43a7048b941cc1cSerhiy Storchakausage(int exitcode, const wchar_t* program)
1093b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *f = exitcode ? stderr : stdout;
111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fprintf(f, usage_line, program);
113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode)
114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, "Try `python -h' for more information.\n");
115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_1, f);
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_2, f);
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_3, f);
1191ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka        fprintf(f, usage_4, (wint_t)DELIM);
1201ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka        fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
1212daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl        fputs(usage_6, f);
122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return exitcode;
1243b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1253b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1266caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1276caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *startup = Py_GETENV("PYTHONSTARTUP");
129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (startup != NULL && startup[0] != '\0') {
130daf455554bc21b6b5df0a016ab5fa639d36cc595Victor Stinner        FILE *fp = _Py_fopen(startup, "r");
131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (fp != NULL) {
132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        } else {
136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            int save_errno;
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            save_errno = errno;
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errno = save_errno;
141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetFromErrnoWithFilename(PyExc_IOError,
142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            startup);
143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Print();
144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1476caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1486caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
1491a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitroustatic void RunInteractiveHook(void)
1501a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou{
1511a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PyObject *sys, *hook, *result;
1521a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    sys = PyImport_ImportModule("sys");
1531a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    if (sys == NULL)
1541a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        goto error;
1551a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    hook = PyObject_GetAttrString(sys, "__interactivehook__");
1561a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    Py_DECREF(sys);
1571a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    if (hook == NULL)
1581a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        PyErr_Clear();
1591a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    else {
1601a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        result = PyObject_CallObject(hook, NULL);
1611a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        Py_DECREF(hook);
1621a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        if (result == NULL)
1631a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou            goto error;
1641a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        else
1651a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou            Py_DECREF(result);
1661a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    }
1671a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    return;
1681a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou
1691a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrouerror:
1701a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
1711a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PyErr_Print();
1721a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PyErr_Clear();
1731a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou}
1741a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou
175db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
1765651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0)
177a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *module, *runpy, *runmodule, *runargs, *result;
179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runpy = PyImport_ImportModule("runpy");
180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runpy == NULL) {
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not import runpy module\n");
1827d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runmodule == NULL) {
187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not access runpy._run_module_as_main\n");
1887d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    module = PyUnicode_FromWideChar(modname, wcslen(modname));
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module == NULL) {
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not convert module name to unicode\n");
1957d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runargs = Py_BuildValue("(Oi)", module, set_argv0);
201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runargs == NULL) {
202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr,
203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "Could not create arguments for runpy._run_module_as_main\n");
2047d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(module);
208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyObject_Call(runmodule, runargs, NULL);
211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runpy);
215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runmodule);
216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(module);
217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runargs);
218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(result);
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
223db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
2243b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
2254726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnerstatic int
2264726e40e00ad9c2e333c4dfc5005f410a520834cVictor StinnerRunMainFromImporter(wchar_t *filename)
2279cd177526afc086a300b548588880329c32f607dChristian Heimes{
2284726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    PyObject *argv0 = NULL, *importer, *sys_path;
2294726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    int sts;
230f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2314726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    argv0 = PyUnicode_FromWideChar(filename, wcslen(filename));
2324726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (argv0 == NULL)
2334726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2344726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2354726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    importer = PyImport_GetImporter(argv0);
2364726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (importer == NULL)
2374726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2384726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
239aa93642a35ed570ba91a80c583df2c8a383686d6Brett Cannon    if (importer == Py_None) {
2404726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        Py_DECREF(argv0);
2414726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        Py_DECREF(importer);
242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2444726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_DECREF(importer);
2454726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2464726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    /* argv0 is usable as an import source, so put it in sys.path[0]
2474726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner       and import __main__ */
248bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner    sys_path = PySys_GetObject("path");
2491e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner    if (sys_path == NULL) {
2501e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner        PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
2514726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2521e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner    }
2534726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (PyList_SetItem(sys_path, 0, argv0)) {
2544726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        argv0 = NULL;
2554726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2564726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    }
2574726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_INCREF(argv0);
2584726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2594726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    sts = RunModule(L"__main__", 0);
2604726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return sts != 0;
2614726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2624726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnererror:
2634726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_XDECREF(argv0);
2644726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    PyErr_Print();
2654726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return 1;
2669cd177526afc086a300b548588880329c32f607dChristian Heimes}
2679cd177526afc086a300b548588880329c32f607dChristian Heimes
268a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerstatic int
269a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerrun_command(wchar_t *command, PyCompilerFlags *cf)
270a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner{
271a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyObject *unicode, *bytes;
272a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    int ret;
273a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
274a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    unicode = PyUnicode_FromWideChar(command, -1);
275a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (unicode == NULL)
276a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
277a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    bytes = PyUnicode_AsUTF8String(unicode);
278a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(unicode);
279a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (bytes == NULL)
280a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
281a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
282a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(bytes);
283a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return ret != 0;
284a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
285a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnererror:
286398356baaa60b1e46ce45ec7b8ae8ac28ca53091Victor Stinner    PySys_WriteStderr("Unable to decode the command from the command line:\n");
287a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyErr_Print();
288a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return 1;
289a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner}
290a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
2910a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerstatic int
2920a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerrun_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
2930a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner{
2940a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    PyObject *unicode, *bytes = NULL;
2950a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    char *filename_str;
2960a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    int run;
2970a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2980a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    /* call pending calls like signal handlers (SIGINT) */
2990a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (Py_MakePendingCalls() == -1) {
3000a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        PyErr_Print();
3010a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        return 1;
3020a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
3030a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3040a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (filename) {
3050a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
3060a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (unicode != NULL) {
307e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            bytes = PyUnicode_EncodeFSDefault(unicode);
3080a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            Py_DECREF(unicode);
3090a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
3100a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (bytes != NULL)
3110a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            filename_str = PyBytes_AsString(bytes);
3120a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        else {
3130a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            PyErr_Clear();
314e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            filename_str = "<encoding error>";
3150a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
3160a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
3170a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    else
3180a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        filename_str = "<stdin>";
3190a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3200a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
3210a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    Py_XDECREF(bytes);
3220a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    return run != 0;
3230a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner}
3240a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3259cd177526afc086a300b548588880329c32f607dChristian Heimes
326667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
327667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
328fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
329790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv)
330667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int c;
332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int sts;
333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *command = NULL;
334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *filename = NULL;
335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *module = NULL;
336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *fp = stdin;
337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *p;
338e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *wp;
340e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int skipfirstline = 0;
342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int stdin_is_interactive = 0;
343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int help = 0;
344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int version = 0;
345f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int saw_unbuffered_flag = 0;
34634be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    char *opt;
347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags cf;
3486999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    PyObject *warning_option = NULL;
3496999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    PyObject *warning_options = NULL;
350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    cf.cf_flags = 0;
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argc = argc;           /* For Py_GetArgcArgv() */
354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argv = argv;
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
35686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    /* Hash randomization needed early for all string operations
35786838b02f04a01445778584afb7acd0b05081335Antoine Pitrou       (including -W and -X options). */
358a0dd22e5e824195e322cb417ebb34c66475e952dEzio Melotti    _PyOS_opterr = 0;  /* prevent printing the error in 1st pass */
35986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
36086838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        if (c == 'm' || c == 'c') {
36186838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            /* -c / -m is the last option: following arguments are
36286838b02f04a01445778584afb7acd0b05081335Antoine Pitrou               not interpreter options. */
36386838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            break;
36486838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        }
365c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson        if (c == 'E') {
36686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            Py_IgnoreEnvironmentFlag++;
36786838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            break;
36886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        }
36986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    }
37086838b02f04a01445778584afb7acd0b05081335Antoine Pitrou
37134be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    opt = Py_GETENV("PYTHONMALLOC");
37234be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    if (_PyMem_SetupAllocators(opt) < 0) {
37334be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner        fprintf(stderr,
37434be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner                "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", opt);
37534be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner        exit(1);
37634be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    }
37734be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner
378c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson    Py_HashRandomizationFlag = 1;
37986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    _PyRandom_Init();
38086838b02f04a01445778584afb7acd0b05081335Antoine Pitrou
381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_ResetWarnOptions();
38286838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    _PyOS_ResetGetOpt();
383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'c') {
386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            size_t len;
387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -c is the last option; following arguments
388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               command to interpret. */
390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
391f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            len = wcslen(_PyOS_optarg) + 1 + 1;
3921a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner            command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (command == NULL)
394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_FatalError(
395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "not enough memory to copy -c argument");
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            wcscpy(command, _PyOS_optarg);
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 2] = '\n';
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 1] = 0;
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'm') {
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -m is the last option; following arguments
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               module to interpret. */
406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            module = _PyOS_optarg;
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        switch (c) {
411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'b':
412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_BytesWarningFlag++;
413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'd':
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DebugFlag++;
417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'i':
420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag++;
421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InteractiveFlag++;
422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
424ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes        case 'I':
425ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            Py_IsolatedFlag++;
426ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            Py_NoUserSiteDirectory++;
427ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            Py_IgnoreEnvironmentFlag++;
428ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            break;
429ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes
430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* case 'J': reserved for Jython */
431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'O':
433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_OptimizeFlag++;
434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
436f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'B':
437f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DontWriteBytecodeFlag++;
438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
439f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
440f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 's':
441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoUserSiteDirectory++;
442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
443f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'S':
445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoSiteFlag++;
446f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
447f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'E':
44986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            /* Already handled above */
450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 't':
453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* ignored for backwards compatibility */
454f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
456f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'u':
457f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_UnbufferedStdioFlag = 1;
458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            saw_unbuffered_flag = 1;
459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'v':
462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_VerboseFlag++;
463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'x':
466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            skipfirstline = 1;
467f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'h':
470f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case '?':
471f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            help++;
472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'V':
475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            version++;
476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'W':
4796999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            if (warning_options == NULL)
4806999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou                warning_options = PyList_New(0);
4816999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            if (warning_options == NULL)
4826999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou                Py_FatalError("failure in handling of -W argument");
4836999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
4846999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            if (warning_option == NULL)
4856999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou                Py_FatalError("failure in handling of -W argument");
486275270772e6b733beb5bf0e24f6d33663975cc63Christian Heimes            if (PyList_Append(warning_options, warning_option) == -1)
487275270772e6b733beb5bf0e24f6d33663975cc63Christian Heimes                Py_FatalError("failure in handling of -W argument");
4886999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            Py_DECREF(warning_option);
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4919583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou        case 'X':
4929583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            PySys_AddXOption(_PyOS_optarg);
4939583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            break;
4949583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou
4959d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl        case 'q':
4968aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl            Py_QuietFlag++;
4979d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl            break;
4989d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl
4992daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl        case 'R':
500c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson            /* Ignored */
5012daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl            break;
5022daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl
503f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* This space reserved for other options */
504f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
505f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        default:
506f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return usage(2, argv[0]);
507f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /*NOTREACHED*/
508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
5117d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
512f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (help)
513f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return usage(0, argv[0]);
514f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (version) {
5160e175a6e762676fca6bfd656912bb862e29fbdd5INADA Naoki        printf("Python %s\n", version >= 2 ? Py_GetVersion() : PY_VERSION);
517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
518f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
519f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
520f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
522f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
523f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!saw_unbuffered_flag &&
524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_UnbufferedStdioFlag = 1;
526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_NoUserSiteDirectory &&
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_NoUserSiteDirectory = 1;
5308dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes
531e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *wp != L'\0') {
534f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower        wchar_t *buf, *warning, *context = NULL;
535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
5361a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscpy(buf, wp);
541f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower        for (warning = wcstok_s(buf, L",", &context);
542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning != NULL;
543f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower             warning = wcstok_s(NULL, L",", &context)) {
544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(warning);
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
5461a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        PyMem_RawFree(buf);
547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
548e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#else
549f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char *buf, *oldloc;
551c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner        PyObject *unicode;
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* settle for strtok here as there's no one standard
554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           C89 wcstok */
5551a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        strcpy(buf, p);
56049fc8ece8172162510890f42127d2aa4e13f878bVictor Stinner        oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, "");
562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
5635c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#ifdef __APPLE__
5645c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            /* Use utf-8 on Mac OS X */
5655c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            unicode = PyUnicode_FromString(p);
5665c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#else
5671b57967b96daeb505e9d2dbe3cd347625dcb0739Victor Stinner            unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
5685c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#endif
569af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner            if (unicode == NULL) {
570af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner                /* ignore errors */
571af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner                PyErr_Clear();
572c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner                continue;
573af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner            }
574c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            PySys_AddWarnOptionUnicode(unicode);
575c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            Py_DECREF(unicode);
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, oldloc);
57849fc8ece8172162510890f42127d2aa4e13f878bVictor Stinner        PyMem_RawFree(oldloc);
5791a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        PyMem_RawFree(buf);
580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
581e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
5826999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    if (warning_options != NULL) {
5836999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou        Py_ssize_t i;
5846999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou        for (i = 0; i < PyList_GET_SIZE(warning_options); i++) {
5856999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            PySys_AddWarnOptionUnicode(PyList_GET_ITEM(warning_options, i));
5866999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou        }
5876999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    }
5880805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey
589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command == NULL && module == NULL && _PyOS_optind < argc &&
590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscmp(argv[_PyOS_optind], L"-") != 0)
591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = argv[_PyOS_optind];
593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
594775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
596775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
5979cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
59889e343660623862acbd40cc617b4af262d6c799fVictor Stinner    /* don't translate newlines (\r\n <=> \n) */
59989e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdin), O_BINARY);
60089e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdout), O_BINARY);
60189e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stderr), O_BINARY);
602f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
60389e343660623862acbd40cc617b4af262d6c799fVictor Stinner
60489e343660623862acbd40cc617b4af262d6c799fVictor Stinner    if (Py_UnbufferedStdioFlag) {
60522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
60922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdin,  (char *)NULL);
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdout, (char *)NULL);
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stderr, (char *)NULL);
61322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (Py_InteractiveFlag) {
616b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Doesn't have to have line-buffered -- use unbuffered */
618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
62022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
62122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
622f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
62422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
62522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Leave stderr alone - it should be unbuffered anyway. */
627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
628667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
6292ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* On MacOS X, when the Python interpreter is embedded in an
631f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       application bundle, it gets executed by a bootstrapping script
632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       that does os.execve() with an argv[0] that's different from the
633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       actual Python executable. This is needed to keep the Finder happy,
634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       or rather, to work around Apple's overly strict requirements of
635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       the process name. However, we still need a usable sys.executable,
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       so the actual executable path is passed in an environment variable.
637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       script. */
639f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t* buffer;
641eb61f8b3a726a8cd1ae3bc3794623e7fe4dd5703Ronald Oussoren        size_t len = strlen(p) + 1;
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
6431a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buffer == NULL) {
645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONEXECUTABLE");
647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
649b94767ff44edf5d461d7cb1c8eb5160f83886358Brett Cannon        mbstowcs(buffer, p, len);
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(buffer);
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* buffer is now handed off - do not free */
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
65390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#ifdef WITH_NEXT_FRAMEWORK
65490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
65590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
65690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        if (pyvenv_launcher && *pyvenv_launcher) {
65790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            /* Used by Mac/Tools/pythonw.c to forward
65890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             * the argv0 of the stub executable
65990db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             */
660f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner            wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
66190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
66290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            if (wbuf == NULL) {
66390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip                Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
66490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            }
66590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            Py_SetProgramName(wbuf);
66690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
66790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            /* Don't free wbuf, the argument to Py_SetProgramName
668b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter             * must remain valid until Py_FinalizeEx is called.
66990db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             */
67090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        } else {
67190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            Py_SetProgramName(argv[0]);
67290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        }
67390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#else
674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(argv[0]);
67590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#endif
676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
6772ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
678f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_SetProgramName(argv[0]);
679fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Initialize();
6816999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    Py_XDECREF(warning_options);
682f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
6838aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl    if (!Py_QuietFlag && (Py_VerboseFlag ||
6849d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                        (command == NULL && filename == NULL &&
6859d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                         module == NULL && stdin_is_interactive))) {
686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s on %s\n",
687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_GetVersion(), Py_GetPlatform());
688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!Py_NoSiteFlag)
689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "%s\n", COPYRIGHT);
690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command != NULL) {
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        argv[_PyOS_optind] = L"-c";
696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module != NULL) {
699d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
701d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        argv[_PyOS_optind] = L"-m";
702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
707313523ce2dd67db67b7dcbcc5f6d6ca95922b34bSteve Dower        isatty(fileno(stdin)) &&
708313523ce2dd67db67b7dcbcc5f6d6ca95922b34bSteve Dower        !Py_IsolatedFlag) {
709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *v;
710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyImport_ImportModule("readline");
711f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (v == NULL)
712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(v);
715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
717f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command) {
718a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        sts = run_command(command, &cf);
7191a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        PyMem_RawFree(command);
720f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else if (module) {
721f01a337950bdcd6905d12b2335ba4d8773f6b8e5Senthil Kumaran        sts = (RunModule(module, 1) != 0);
722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
724f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == NULL && stdin_is_interactive) {
726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag = 0; /* do exit on SystemExit */
727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            RunStartupFile(&cf);
7281a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou            RunInteractiveHook();
729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = -1;               /* keep track of whether we've already run __main__ */
733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename != NULL) {
735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            sts = RunMainFromImporter(filename);
736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
737f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
738f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (sts==-1 && filename!=NULL) {
7399a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            fp = _Py_wfopen(filename, L"r");
7409a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            if (fp == NULL) {
7419a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                char *cfilename_buffer;
7429a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                const char *cfilename;
743c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou                int err = errno;
744f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner                cfilename_buffer = Py_EncodeLocale(filename, NULL);
7459a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer != NULL)
7469a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = cfilename_buffer;
7479a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                else
7489a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = "<unprintable file name>";
749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
750c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou                    argv[0], cfilename, err, strerror(err));
7519a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer)
7529a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    PyMem_Free(cfilename_buffer);
753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return 2;
754f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else if (skipfirstline) {
756f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                int ch;
757f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* Push back first newline so line numbers
758f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   remain the same */
759f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                while ((ch = getc(fp)) != EOF) {
760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    if (ch == '\n') {
761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        (void)ungetc(ch, fp);
762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        break;
763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    }
764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
766f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            {
767f2f373f5931be48efc3f6fa2c2faa1cca79dce75Steve Dower                struct _Py_stat_struct sb;
768e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
769f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    S_ISDIR(sb.st_mode)) {
770e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                    fprintf(stderr,
771e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                            "%ls: '%ls' is a directory, cannot continue\n",
772e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                            argv[0], filename);
773f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fclose(fp);
774f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return 1;
775f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
776f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
777f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
778f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
7790a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (sts == -1)
7800a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            sts = run_file(fp, filename, &cf);
781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
783f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Check this environment variable at the end, to give programs the
784f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * opportunity to set it from Python.
785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
787f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
788f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
791f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
792f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_InspectFlag && stdin_is_interactive &&
793f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (filename != NULL || command != NULL || module != NULL)) {
794f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 0;
7951a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        RunInteractiveHook();
796f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
797f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
798f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
800b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter    if (Py_FinalizeEx() < 0) {
801b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter        /* Value unlikely to be confused with a non-error exit status or
802b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter        other special meaning */
803b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter        sts = 120;
804b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter    }
8053e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
8063e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
807f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Insure++ is a memory analysis tool that aids in discovering
808f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory leaks and other memory problems.  On Python exit, the
809f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * interned string dictionaries are flagged as being in use at exit
810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * (which it is).  Under normal circumstances, this is fine because
811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the memory will be automatically reclaimed by the system.  Under
812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory debugging, it's a huge source of useless noise, so we
813f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * trade off slower shutdown for less distraction in the memory
814f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * reports.  -baw
815f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
816f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_ReleaseInternedUnicodeStrings();
8173e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
8183e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
819f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return sts;
820667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
821667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
822786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
823786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
824786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
825667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
826667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
827667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
828667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
829667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
830790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv)
831667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
832f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argc = orig_argc;
833f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argv = orig_argv;
834667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
83549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
83649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
83749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
83849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
839