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