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