main.c revision 275270772e6b733beb5bf0e24f6d33663975cc63
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\ 7789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\ 780805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey also PYTHONWARNINGS=arg\n\ 79393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ 809583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou-X opt : set implementation-specific option\n\ 817922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum"; 822d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_4[] = "\ 8398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile : program read from script file\n\ 8498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum- : program read from stdin (default; interactive mode if a tty)\n\ 8589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\ 86667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\ 87667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\ 881ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy StorchakaPYTHONPATH : '%lc'-separated list of directories prefixed to the\n\ 89667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default module search path. The result is sys.path.\n\ 90790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes"; 912d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_5[] = 921ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n" 939802b39c12712e924bed699812756ce5076b77a3Victor Stinner" The default module search path uses %s.\n" 949802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" 959802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n" 9634be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n"; 9734be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinnerstatic const char usage_6[] = 9834be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n" 9934be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner" to seed the hashes of str, bytes and datetime objects. It can also be\n" 10034be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner" set to an integer in the range [0,4294967295] to get hash values with a\n" 10134be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner" predictable seed.\n" 10234be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n" 10334be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n" 10434be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner" hooks.\n"; 105667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 106852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int 107ef1585eb9a488ae8ce3ff057f43a7048b941cc1cSerhiy Storchakausage(int exitcode, const wchar_t* program) 1083b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{ 109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou FILE *f = exitcode ? stderr : stdout; 110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(f, usage_line, program); 112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (exitcode) 113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(f, "Try `python -h' for more information.\n"); 114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fputs(usage_1, f); 116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fputs(usage_2, f); 117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fputs(usage_3, f); 1181ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka fprintf(f, usage_4, (wint_t)DELIM); 1191ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP); 1202daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl fputs(usage_6, f); 121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return exitcode; 1233b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw} 1243b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 1256caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf) 1266caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{ 127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char *startup = Py_GETENV("PYTHONSTARTUP"); 128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (startup != NULL && startup[0] != '\0') { 129daf455554bc21b6b5df0a016ab5fa639d36cc595Victor Stinner FILE *fp = _Py_fopen(startup, "r"); 130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (fp != NULL) { 131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); 132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fclose(fp); 134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int save_errno; 136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou save_errno = errno; 138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); 139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errno = save_errno; 140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_SetFromErrnoWithFilename(PyExc_IOError, 141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou startup); 142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Print(); 143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1466caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis} 1476caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis 1481a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitroustatic void RunInteractiveHook(void) 1491a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou{ 1501a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou PyObject *sys, *hook, *result; 1511a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou sys = PyImport_ImportModule("sys"); 1521a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou if (sys == NULL) 1531a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou goto error; 1541a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou hook = PyObject_GetAttrString(sys, "__interactivehook__"); 1551a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou Py_DECREF(sys); 1561a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou if (hook == NULL) 1571a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou PyErr_Clear(); 1581a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou else { 1591a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou result = PyObject_CallObject(hook, NULL); 1601a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou Py_DECREF(hook); 1611a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou if (result == NULL) 1621a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou goto error; 1631a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou else 1641a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou Py_DECREF(result); 1651a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou } 1661a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou return; 1671a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou 1681a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrouerror: 1691a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou PySys_WriteStderr("Failed calling sys.__interactivehook__\n"); 1701a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou PyErr_Print(); 1711a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou PyErr_Clear(); 1721a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou} 1731a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou 174db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger 1755651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0) 176a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{ 177f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *module, *runpy, *runmodule, *runargs, *result; 178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou runpy = PyImport_ImportModule("runpy"); 179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (runpy == NULL) { 180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "Could not import runpy module\n"); 1817d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner PyErr_Print(); 182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main"); 185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (runmodule == NULL) { 186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "Could not access runpy._run_module_as_main\n"); 1877d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner PyErr_Print(); 188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runpy); 189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou module = PyUnicode_FromWideChar(modname, wcslen(modname)); 192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (module == NULL) { 193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "Could not convert module name to unicode\n"); 1947d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner PyErr_Print(); 195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runpy); 196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runmodule); 197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou runargs = Py_BuildValue("(Oi)", module, set_argv0); 200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (runargs == NULL) { 201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, 202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "Could not create arguments for runpy._run_module_as_main\n"); 2037d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner PyErr_Print(); 204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runpy); 205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runmodule); 206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(module); 207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou result = PyObject_Call(runmodule, runargs, NULL); 210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (result == NULL) { 211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Print(); 212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runpy); 214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runmodule); 215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(module); 216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(runargs); 217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (result == NULL) { 218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(result); 221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 222db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger} 2233b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 2244726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnerstatic int 2254726e40e00ad9c2e333c4dfc5005f410a520834cVictor StinnerRunMainFromImporter(wchar_t *filename) 2269cd177526afc086a300b548588880329c32f607dChristian Heimes{ 2274726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner PyObject *argv0 = NULL, *importer, *sys_path; 2284726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner int sts; 229f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 2304726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner argv0 = PyUnicode_FromWideChar(filename, wcslen(filename)); 2314726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner if (argv0 == NULL) 2324726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner goto error; 2334726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner 2344726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner importer = PyImport_GetImporter(argv0); 2354726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner if (importer == NULL) 2364726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner goto error; 2374726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner 238aa93642a35ed570ba91a80c583df2c8a383686d6Brett Cannon if (importer == Py_None) { 2394726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner Py_DECREF(argv0); 2404726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner Py_DECREF(importer); 241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 2434726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner Py_DECREF(importer); 2444726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner 2454726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner /* argv0 is usable as an import source, so put it in sys.path[0] 2464726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner and import __main__ */ 247bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner sys_path = PySys_GetObject("path"); 2481e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner if (sys_path == NULL) { 2491e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path"); 2504726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner goto error; 2511e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner } 2524726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner if (PyList_SetItem(sys_path, 0, argv0)) { 2534726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner argv0 = NULL; 2544726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner goto error; 2554726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner } 2564726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner Py_INCREF(argv0); 2574726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner 2584726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner sts = RunModule(L"__main__", 0); 2594726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner return sts != 0; 2604726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner 2614726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnererror: 2624726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner Py_XDECREF(argv0); 2634726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner PyErr_Print(); 2644726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner return 1; 2659cd177526afc086a300b548588880329c32f607dChristian Heimes} 2669cd177526afc086a300b548588880329c32f607dChristian Heimes 267a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerstatic int 268a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerrun_command(wchar_t *command, PyCompilerFlags *cf) 269a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner{ 270a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner PyObject *unicode, *bytes; 271a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner int ret; 272a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner 273a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner unicode = PyUnicode_FromWideChar(command, -1); 274a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner if (unicode == NULL) 275a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner goto error; 276a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner bytes = PyUnicode_AsUTF8String(unicode); 277a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner Py_DECREF(unicode); 278a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner if (bytes == NULL) 279a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner goto error; 280a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf); 281a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner Py_DECREF(bytes); 282a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner return ret != 0; 283a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner 284a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnererror: 285398356baaa60b1e46ce45ec7b8ae8ac28ca53091Victor Stinner PySys_WriteStderr("Unable to decode the command from the command line:\n"); 286a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner PyErr_Print(); 287a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner return 1; 288a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner} 289a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner 2900a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerstatic int 2910a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerrun_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf) 2920a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner{ 2930a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner PyObject *unicode, *bytes = NULL; 2940a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner char *filename_str; 2950a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner int run; 2960a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner 2970a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner /* call pending calls like signal handlers (SIGINT) */ 2980a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner if (Py_MakePendingCalls() == -1) { 2990a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner PyErr_Print(); 3000a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner return 1; 3010a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner } 3020a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner 3030a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner if (filename) { 3040a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner unicode = PyUnicode_FromWideChar(filename, wcslen(filename)); 3050a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner if (unicode != NULL) { 306e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner bytes = PyUnicode_EncodeFSDefault(unicode); 3070a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner Py_DECREF(unicode); 3080a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner } 3090a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner if (bytes != NULL) 3100a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner filename_str = PyBytes_AsString(bytes); 3110a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner else { 3120a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner PyErr_Clear(); 313e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner filename_str = "<encoding error>"; 3140a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner } 3150a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner } 3160a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner else 3170a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner filename_str = "<stdin>"; 3180a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner 3190a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf); 3200a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner Py_XDECREF(bytes); 3210a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner return run != 0; 3220a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner} 3230a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner 3249cd177526afc086a300b548588880329c32f607dChristian Heimes 325667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */ 326667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 327fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint 328790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv) 329667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int c; 331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int sts; 332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wchar_t *command = NULL; 333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wchar_t *filename = NULL; 334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wchar_t *module = NULL; 335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou FILE *fp = stdin; 336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char *p; 337e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS 338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wchar_t *wp; 339e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif 340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int skipfirstline = 0; 341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int stdin_is_interactive = 0; 342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int help = 0; 343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int version = 0; 344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int saw_unbuffered_flag = 0; 34534be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner char *opt; 346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags cf; 3476999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou PyObject *warning_option = NULL; 3486999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou PyObject *warning_options = NULL; 349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou cf.cf_flags = 0; 351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou orig_argc = argc; /* For Py_GetArgcArgv() */ 353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou orig_argv = argv; 354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 35586838b02f04a01445778584afb7acd0b05081335Antoine Pitrou /* Hash randomization needed early for all string operations 35686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou (including -W and -X options). */ 357a0dd22e5e824195e322cb417ebb34c66475e952dEzio Melotti _PyOS_opterr = 0; /* prevent printing the error in 1st pass */ 35886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { 35986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou if (c == 'm' || c == 'c') { 36086838b02f04a01445778584afb7acd0b05081335Antoine Pitrou /* -c / -m is the last option: following arguments are 36186838b02f04a01445778584afb7acd0b05081335Antoine Pitrou not interpreter options. */ 36286838b02f04a01445778584afb7acd0b05081335Antoine Pitrou break; 36386838b02f04a01445778584afb7acd0b05081335Antoine Pitrou } 364c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson if (c == 'E') { 36586838b02f04a01445778584afb7acd0b05081335Antoine Pitrou Py_IgnoreEnvironmentFlag++; 36686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou break; 36786838b02f04a01445778584afb7acd0b05081335Antoine Pitrou } 36886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou } 36986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou 37034be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner opt = Py_GETENV("PYTHONMALLOC"); 37134be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner if (_PyMem_SetupAllocators(opt) < 0) { 37234be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner fprintf(stderr, 37334be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", opt); 37434be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner exit(1); 37534be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner } 37634be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner 377c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson Py_HashRandomizationFlag = 1; 37886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou _PyRandom_Init(); 37986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou 380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_ResetWarnOptions(); 38186838b02f04a01445778584afb7acd0b05081335Antoine Pitrou _PyOS_ResetGetOpt(); 382f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { 384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (c == 'c') { 385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou size_t len; 386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* -c is the last option; following arguments 387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou that look like options are left for the 388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou command to interpret. */ 389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou len = wcslen(_PyOS_optarg) + 1 + 1; 3911a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len); 392f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (command == NULL) 393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_FatalError( 394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "not enough memory to copy -c argument"); 395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wcscpy(command, _PyOS_optarg); 396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou command[len - 2] = '\n'; 397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou command[len - 1] = 0; 398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (c == 'm') { 402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* -m is the last option; following arguments 403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou that look like options are left for the 404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou module to interpret. */ 405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou module = _PyOS_optarg; 406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou switch (c) { 410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'b': 411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_BytesWarningFlag++; 412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'd': 415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DebugFlag++; 416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'i': 419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_InspectFlag++; 420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_InteractiveFlag++; 421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 423ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes case 'I': 424ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes Py_IsolatedFlag++; 425ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes Py_NoUserSiteDirectory++; 426ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes Py_IgnoreEnvironmentFlag++; 427ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes break; 428ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes 429f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* case 'J': reserved for Jython */ 430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'O': 432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_OptimizeFlag++; 433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'B': 436f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DontWriteBytecodeFlag++; 437f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 439f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 's': 440f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_NoUserSiteDirectory++; 441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 443f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'S': 444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_NoSiteFlag++; 445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 446f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 447f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'E': 44886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou /* Already handled above */ 449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 't': 452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* ignored for backwards compatibility */ 453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 454f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'u': 456f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_UnbufferedStdioFlag = 1; 457f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou saw_unbuffered_flag = 1; 458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'v': 461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_VerboseFlag++; 462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'x': 465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou skipfirstline = 1; 466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 467f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'h': 469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case '?': 470f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou help++; 471f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'V': 474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou version++; 475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case 'W': 4786999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou if (warning_options == NULL) 4796999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou warning_options = PyList_New(0); 4806999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou if (warning_options == NULL) 4816999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou Py_FatalError("failure in handling of -W argument"); 4826999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1); 4836999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou if (warning_option == NULL) 4846999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou Py_FatalError("failure in handling of -W argument"); 485275270772e6b733beb5bf0e24f6d33663975cc63Christian Heimes if (PyList_Append(warning_options, warning_option) == -1) 486275270772e6b733beb5bf0e24f6d33663975cc63Christian Heimes Py_FatalError("failure in handling of -W argument"); 4876999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou Py_DECREF(warning_option); 488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 4909583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou case 'X': 4919583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou PySys_AddXOption(_PyOS_optarg); 4929583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou break; 4939583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou 4949d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl case 'q': 4958aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl Py_QuietFlag++; 4969d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl break; 4979d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl 4982daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl case 'R': 499c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson /* Ignored */ 5002daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl break; 5012daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl 502f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* This space reserved for other options */ 503f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 504f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou default: 505f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return usage(2, argv[0]); 506f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /*NOTREACHED*/ 507f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 5107d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer 511f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (help) 512f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return usage(0, argv[0]); 513f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 514f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (version) { 515e3ed4edb94cadaef747f6032c52cd903a169883eSerhiy Storchaka printf("Python %s\n", PY_VERSION); 516f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 518f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 519f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!Py_InspectFlag && 520f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_InspectFlag = 1; 522f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!saw_unbuffered_flag && 523f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') 524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_UnbufferedStdioFlag = 1; 525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!Py_NoUserSiteDirectory && 527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0') 528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_NoUserSiteDirectory = 1; 5298dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes 530e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS 531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) && 532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *wp != L'\0') { 533f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower wchar_t *buf, *warning, *context = NULL; 534f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 5351a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t)); 536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (buf == NULL) 537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_FatalError( 538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "not enough memory to copy PYTHONWARNINGS"); 539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wcscpy(buf, wp); 540f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower for (warning = wcstok_s(buf, L",", &context); 541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou warning != NULL; 542f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower warning = wcstok_s(NULL, L",", &context)) { 543f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_AddWarnOption(warning); 544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 5451a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(buf); 546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 547e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#else 548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') { 549f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char *buf, *oldloc; 550c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner PyObject *unicode; 551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* settle for strtok here as there's no one standard 553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou C89 wcstok */ 5541a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner buf = (char *)PyMem_RawMalloc(strlen(p) + 1); 555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (buf == NULL) 556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_FatalError( 557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "not enough memory to copy PYTHONWARNINGS"); 558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou strcpy(buf, p); 55949fc8ece8172162510890f42127d2aa4e13f878bVictor Stinner oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); 560f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setlocale(LC_ALL, ""); 561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) { 5625c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#ifdef __APPLE__ 5635c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner /* Use utf-8 on Mac OS X */ 5645c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner unicode = PyUnicode_FromString(p); 5655c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#else 5661b57967b96daeb505e9d2dbe3cd347625dcb0739Victor Stinner unicode = PyUnicode_DecodeLocale(p, "surrogateescape"); 5675c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#endif 568af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner if (unicode == NULL) { 569af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner /* ignore errors */ 570af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner PyErr_Clear(); 571c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner continue; 572af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner } 573c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner PySys_AddWarnOptionUnicode(unicode); 574c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner Py_DECREF(unicode); 575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setlocale(LC_ALL, oldloc); 57749fc8ece8172162510890f42127d2aa4e13f878bVictor Stinner PyMem_RawFree(oldloc); 5781a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(buf); 579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 580e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif 5816999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou if (warning_options != NULL) { 5826999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou Py_ssize_t i; 5836999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou for (i = 0; i < PyList_GET_SIZE(warning_options); i++) { 5846999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou PySys_AddWarnOptionUnicode(PyList_GET_ITEM(warning_options, i)); 5856999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou } 5866999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou } 5870805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey 588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (command == NULL && module == NULL && _PyOS_optind < argc && 589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wcscmp(argv[_PyOS_optind], L"-") != 0) 590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou { 591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou filename = argv[_PyOS_optind]; 592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 593775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 594f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0); 595775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 5969cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__) 59789e343660623862acbd40cc617b4af262d6c799fVictor Stinner /* don't translate newlines (\r\n <=> \n) */ 59889e343660623862acbd40cc617b4af262d6c799fVictor Stinner _setmode(fileno(stdin), O_BINARY); 59989e343660623862acbd40cc617b4af262d6c799fVictor Stinner _setmode(fileno(stdout), O_BINARY); 60089e343660623862acbd40cc617b4af262d6c799fVictor Stinner _setmode(fileno(stderr), O_BINARY); 601f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif 60289e343660623862acbd40cc617b4af262d6c799fVictor Stinner 60389e343660623862acbd40cc617b4af262d6c799fVictor Stinner if (Py_UnbufferedStdioFlag) { 60422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); 606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ); 60822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */ 609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setbuf(stdin, (char *)NULL); 610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setbuf(stdout, (char *)NULL); 611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setbuf(stderr, (char *)NULL); 61222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */ 613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (Py_InteractiveFlag) { 615b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS 616f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Doesn't have to have line-buffered -- use unbuffered */ 617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */ 618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 61922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */ 62022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); 622f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); 62322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */ 62422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */ 625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Leave stderr alone - it should be unbuffered anyway. */ 626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 627667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 6282ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__ 629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* On MacOS X, when the Python interpreter is embedded in an 630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou application bundle, it gets executed by a bootstrapping script 631f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou that does os.execve() with an argv[0] that's different from the 632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou actual Python executable. This is needed to keep the Finder happy, 633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou or rather, to work around Apple's overly strict requirements of 634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou the process name. However, we still need a usable sys.executable, 635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou so the actual executable path is passed in an environment variable. 636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou See Lib/plat-mac/bundlebuiler.py for details about the bootstrap 637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou script. */ 638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') { 639f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wchar_t* buffer; 640eb61f8b3a726a8cd1ae3bc3794623e7fe4dd5703Ronald Oussoren size_t len = strlen(p) + 1; 641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 6421a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner buffer = PyMem_RawMalloc(len * sizeof(wchar_t)); 643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (buffer == NULL) { 644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_FatalError( 645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "not enough memory to copy PYTHONEXECUTABLE"); 646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 648b94767ff44edf5d461d7cb1c8eb5160f83886358Brett Cannon mbstowcs(buffer, p, len); 649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_SetProgramName(buffer); 650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* buffer is now handed off - do not free */ 651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 65290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#ifdef WITH_NEXT_FRAMEWORK 65390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__"); 65490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip 65590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip if (pyvenv_launcher && *pyvenv_launcher) { 65690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip /* Used by Mac/Tools/pythonw.c to forward 65790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip * the argv0 of the stub executable 65890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip */ 659f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL); 66090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip 66190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip if (wbuf == NULL) { 66290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip Py_FatalError("Cannot decode __PYVENV_LAUNCHER__"); 66390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip } 66490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip Py_SetProgramName(wbuf); 66590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip 66690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip /* Don't free wbuf, the argument to Py_SetProgramName 667b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter * must remain valid until Py_FinalizeEx is called. 66890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip */ 66990db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip } else { 67090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip Py_SetProgramName(argv[0]); 67190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip } 67290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#else 673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_SetProgramName(argv[0]); 67490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#endif 675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 6762ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else 677f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_SetProgramName(argv[0]); 678fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif 679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_Initialize(); 6806999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou Py_XDECREF(warning_options); 681f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 6828aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl if (!Py_QuietFlag && (Py_VerboseFlag || 6839d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl (command == NULL && filename == NULL && 6849d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl module == NULL && stdin_is_interactive))) { 685f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "Python %s on %s\n", 686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_GetVersion(), Py_GetPlatform()); 687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!Py_NoSiteFlag) 688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "%s\n", COPYRIGHT); 689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (command != NULL) { 692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Backup _PyOS_optind and force sys.argv[0] = '-c' */ 693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou _PyOS_optind--; 694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou argv[_PyOS_optind] = L"-c"; 695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (module != NULL) { 698d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/ 699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou _PyOS_optind--; 700d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan argv[_PyOS_optind] = L"-m"; 701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); 704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) && 706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou isatty(fileno(stdin))) { 707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *v; 708f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou v = PyImport_ImportModule("readline"); 709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL) 710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 711f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else 712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v); 713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (command) { 716a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner sts = run_command(command, &cf); 7171a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(command); 718f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else if (module) { 719f01a337950bdcd6905d12b2335ba4d8773f6b8e5Senthil Kumaran sts = (RunModule(module, 1) != 0); 720f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 721f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (filename == NULL && stdin_is_interactive) { 724f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_InspectFlag = 0; /* do exit on SystemExit */ 725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou RunStartupFile(&cf); 7261a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou RunInteractiveHook(); 727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 728f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* XXX */ 729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou sts = -1; /* keep track of whether we've already run __main__ */ 731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (filename != NULL) { 733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou sts = RunMainFromImporter(filename); 734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (sts==-1 && filename!=NULL) { 7379a6692f6d7784365ae07094694c754d2b153b719Victor Stinner fp = _Py_wfopen(filename, L"r"); 7389a6692f6d7784365ae07094694c754d2b153b719Victor Stinner if (fp == NULL) { 7399a6692f6d7784365ae07094694c754d2b153b719Victor Stinner char *cfilename_buffer; 7409a6692f6d7784365ae07094694c754d2b153b719Victor Stinner const char *cfilename; 741c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou int err = errno; 742f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner cfilename_buffer = Py_EncodeLocale(filename, NULL); 7439a6692f6d7784365ae07094694c754d2b153b719Victor Stinner if (cfilename_buffer != NULL) 7449a6692f6d7784365ae07094694c754d2b153b719Victor Stinner cfilename = cfilename_buffer; 7459a6692f6d7784365ae07094694c754d2b153b719Victor Stinner else 7469a6692f6d7784365ae07094694c754d2b153b719Victor Stinner cfilename = "<unprintable file name>"; 747f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n", 748c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou argv[0], cfilename, err, strerror(err)); 7499a6692f6d7784365ae07094694c754d2b153b719Victor Stinner if (cfilename_buffer) 7509a6692f6d7784365ae07094694c754d2b153b719Victor Stinner PyMem_Free(cfilename_buffer); 751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 2; 752f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (skipfirstline) { 754f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int ch; 755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Push back first newline so line numbers 756f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou remain the same */ 757f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou while ((ch = getc(fp)) != EOF) { 758f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (ch == '\n') { 759f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (void)ungetc(ch, fp); 760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou { 765f2f373f5931be48efc3f6fa2c2faa1cca79dce75Steve Dower struct _Py_stat_struct sb; 766e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && 767f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou S_ISDIR(sb.st_mode)) { 768e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner fprintf(stderr, 769e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner "%ls: '%ls' is a directory, cannot continue\n", 770e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner argv[0], filename); 771f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fclose(fp); 772f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 1; 773f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 774f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 775f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 776f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 7770a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner if (sts == -1) 7780a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner sts = run_file(fp, filename, &cf); 779f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 780f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Check this environment variable at the end, to give programs the 782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * opportunity to set it from Python. 783f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou */ 784f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!Py_InspectFlag && 785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou { 787f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_InspectFlag = 1; 788f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (Py_InspectFlag && stdin_is_interactive && 791f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (filename != NULL || command != NULL || module != NULL)) { 792f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_InspectFlag = 0; 7931a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou RunInteractiveHook(); 794f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* XXX */ 795f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0; 796f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 797f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 798b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter if (Py_FinalizeEx() < 0) { 799b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter /* Value unlikely to be confused with a non-error exit status or 800b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter other special meaning */ 801b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter sts = 120; 802b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter } 8033e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 8043e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__ 805f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Insure++ is a memory analysis tool that aids in discovering 806f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * memory leaks and other memory problems. On Python exit, the 807f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * interned string dictionaries are flagged as being in use at exit 808f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * (which it is). Under normal circumstances, this is fine because 809f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * the memory will be automatically reclaimed by the system. Under 810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * memory debugging, it's a huge source of useless noise, so we 811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * trade off slower shutdown for less distraction in the memory 812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * reports. -baw 813f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou */ 814f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou _Py_ReleaseInternedUnicodeStrings(); 8153e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */ 8163e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 817f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return sts; 818667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 819667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 820786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between 821786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the 822786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro while statement in Misc/gdbinit:ppystack */ 823667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 824667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules. 825667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum This is rare, but it is needed by the secureware extension. */ 826667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 827667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid 828790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv) 829667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 830f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *argc = orig_argc; 831f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *argv = orig_argv; 832667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 83349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 83449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 83549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 83649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 837