main.c revision 89f507fe8c497b3f70fdcecce8bc240f9af2bbe2
1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */ 2667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h" 4a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#include "osdefs.h" 5db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger#include "import.h" 6667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS 87a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#include <unixlib.h> 979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif 1079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis 119cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__) 12477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H 133e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h> 143e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif 15477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif 163e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum 177bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS) 18a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib" 19a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else 207bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC) 217bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#define PYTHONHOMEHELP "<prefix>/Lib" 227bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#else 23da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X" 24a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif 257bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#endif 26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 272cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h" 282cffc7d4202fc1197280a05d998075551b459283Thomas Wouters 29a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \ 3036002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum "Type \"help\", \"copyright\", \"credits\" or \"license\" " \ 3136002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum "for more information." 32a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum 3349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 3449fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" { 3549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 3649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 37ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */ 38667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv; 39667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int orig_argc; 40667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 41bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */ 420e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#define BASE_OPTS "c:dEhim:OStuvVW:xX?" 43bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum 44bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#ifndef RISCOS 45bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS 46bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#else /*RISCOS*/ 47bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* extra option saying that we are running under a special task window 48bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum frontend; especially my_readline will behave different */ 49bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS "w" 50bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* corresponding flag */ 513ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossumextern int Py_RISCOSWimpFlag; 52bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#endif /*RISCOS*/ 533ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum 54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */ 55667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line = 56db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n"; 57667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 58667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */ 59393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_1 = "\ 60667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\ 61393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\ 6289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d : debug output from parser; also PYTHONDEBUG=x\n\ 63393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-E : ignore environment variables (such as PYTHONPATH)\n\ 640e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h : print this help message and exit (also --help)\n\ 6589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-i : inspect interactively after running script; forces a prompt even\n\ 6689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\ 6761c345fa37573005b708d239c0911218ca22383cGuido van Rossum"; 6861c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\ 69db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\ 7089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\ 716b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO : remove doc-strings in addition to the -O optimizations\n\ 727922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S : don't imply 'import site' on initialization\n\ 73bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\ 7489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\ 75393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum"; 76393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_3 = "\ 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\ 82393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ 83667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile : program read from script file\n\ 84667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum- : program read from stdin (default; interactive mode if a tty)\n\ 857922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum"; 86393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\ 8789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\ 88667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\ 89667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\ 90a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH : '%c'-separated list of directories prefixed to the\n\ 91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default module search path. The result is sys.path.\n\ 92a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\ 93a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum The default module search path uses %s.\n\ 94793de09b21ce286bc3c6aa0419f258cceb5d029fTim PetersPYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ 95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum"; 96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 97667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 98852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int 993b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawusage(int exitcode, char* program) 1003b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{ 101393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum FILE *f = exitcode ? stderr : stdout; 102393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 103393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_line, program); 104393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum if (exitcode) 105393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, "Try `python -h' for more information.\n"); 106393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum else { 107393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_1); 108393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_2); 109393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_3); 110393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_4, DELIM, DELIM, PYTHONHOMEHELP); 111393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum } 11279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS) 11379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis if (exitcode == 0) { 11479acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis /* suppress 'error' message */ 115852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return 1; 11679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis } 11779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis else { 11879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis /* STS$M_INHIB_MSG + SS$_ABORT */ 119852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return 0x1000002c; 12079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis } 12179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else 122852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return exitcode; 12379acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif 1243b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw /*NOTREACHED*/ 1253b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw} 1263b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 1276caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf) 1286caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{ 1296caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis char *startup = Py_GETENV("PYTHONSTARTUP"); 1306caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis if (startup != NULL && startup[0] != '\0') { 1316caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis FILE *fp = fopen(startup, "r"); 1326caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis if (fp != NULL) { 1336caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); 1346caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis PyErr_Clear(); 1356caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis fclose(fp); 1366caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis } 1376caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis } 1386caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis} 1396caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis 140db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger 141a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Woutersstatic int RunModule(char *module) 142a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{ 143a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters PyObject *runpy, *runmodule, *runargs, *result; 144a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters runpy = PyImport_ImportModule("runpy"); 145a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (runpy == NULL) { 146a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters fprintf(stderr, "Could not import runpy module\n"); 147a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 148db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } 149a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters runmodule = PyObject_GetAttrString(runpy, "run_module"); 150a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (runmodule == NULL) { 151a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters fprintf(stderr, "Could not access runpy.run_module\n"); 152a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runpy); 153a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 154a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 155a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters runargs = Py_BuildValue("sOsO", module, 156a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_None, "__main__", Py_True); 157a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (runargs == NULL) { 158a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters fprintf(stderr, 159a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters "Could not create arguments for runpy.run_module\n"); 160a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runpy); 161a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runmodule); 162a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 163a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 164a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters result = PyObject_Call(runmodule, runargs, NULL); 165a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (result == NULL) { 166a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters PyErr_Print(); 167a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 168a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runpy); 169a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runmodule); 170a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runargs); 171a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (result == NULL) { 172a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 173a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 174a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(result); 175a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return 0; 176db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger} 1773b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 178667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */ 179667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 180fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint 181620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv) 182667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 183667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int c; 184667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int sts; 185667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *command = NULL; 186667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *filename = NULL; 187db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger char *module = NULL; 188667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum FILE *fp = stdin; 189667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *p; 190667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int inspect = 0; 191667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int unbuffered = 0; 192a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum int skipfirstline = 0; 193775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum int stdin_is_interactive = 0; 1943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int help = 0; 1953b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int version = 0; 1967d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer int saw_inspect_flag = 0; 1977d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer int saw_unbuffered_flag = 0; 198bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags cf; 199667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 200393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum cf.cf_flags = 0; 201393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 202ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum orig_argc = argc; /* For Py_GetArgcArgv() */ 203667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum orig_argv = argv; 204ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 2053ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS 2063ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum Py_RISCOSWimpFlag = 0; 2073ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif 2083ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum 20947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_ResetWarnOptions(); 21047f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 211bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { 212667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (c == 'c') { 213667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* -c is the last option; following arguments 214667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum that look like options are left for the 215f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter Dörwald command to interpret. */ 21649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters command = (char *)malloc(strlen(_PyOS_optarg) + 2); 217667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command == NULL) 218667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_FatalError( 219667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum "not enough memory to copy -c argument"); 2202cffc7d4202fc1197280a05d998075551b459283Thomas Wouters strcpy(command, _PyOS_optarg); 221667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum strcat(command, "\n"); 222667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 223667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 224393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 225db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if (c == 'm') { 226db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger /* -m is the last option; following arguments 227db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger that look like options are left for the 228db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger module to interpret. */ 22949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters module = (char *)malloc(strlen(_PyOS_optarg) + 2); 230db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if (module == NULL) 231db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger Py_FatalError( 232db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger "not enough memory to copy -m argument"); 233db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger strcpy(module, _PyOS_optarg); 234db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger break; 235db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } 236db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger 237667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum switch (c) { 238667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 239667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'd': 240667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_DebugFlag++; 241667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 242667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 243667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'i': 244667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum inspect++; 2457d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer saw_inspect_flag = 1; 246775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum Py_InteractiveFlag++; 247667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 248667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 2497614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum case 'O': 2507614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum Py_OptimizeFlag++; 2517614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum break; 2527614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum 2537922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum case 'S': 2547922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum Py_NoSiteFlag++; 2557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum break; 2567922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum 2577d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer case 'E': 2587d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer Py_IgnoreEnvironmentFlag++; 2597d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer break; 2607d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer 261bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum case 't': 262bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum Py_TabcheckFlag++; 263bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum break; 264bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum 265667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'u': 266667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum unbuffered++; 2677d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer saw_unbuffered_flag = 1; 268667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 269667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 270667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'v': 271667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_VerboseFlag++; 272667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 273667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 2743ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS 2753ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum case 'w': 2763ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum Py_RISCOSWimpFlag = 1; 2773ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum break; 2783ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif 2793ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum 280a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum case 'x': 281a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum skipfirstline = 1; 282a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum break; 283a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 2843b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'h': 2850e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters case '?': 2863b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw help++; 2873b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 28845aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum 2893b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'V': 2903b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw version++; 2913b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 292c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum 29347f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum case 'W': 29447f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_AddWarnOption(_PyOS_optarg); 29547f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum break; 29647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 297667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* This space reserved for other options */ 298667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 299667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default: 300852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return usage(2, argv[0]); 301667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /*NOTREACHED*/ 302667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 303667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 304667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 305667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 3063b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (help) 307852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return usage(0, argv[0]); 3083b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 3093b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (version) { 3103b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, "Python %s\n", PY_VERSION); 311852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return 0; 3123b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw } 3133b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 3147d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if (!saw_inspect_flag && 3157d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 3167d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer inspect = 1; 3177d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if (!saw_unbuffered_flag && 3187d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') 3197d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer unbuffered = 1; 3207d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer 321db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if (command == NULL && module == NULL && _PyOS_optind < argc && 3222cffc7d4202fc1197280a05d998075551b459283Thomas Wouters strcmp(argv[_PyOS_optind], "-") != 0) 323775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum { 3247a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS 3257a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis filename = decc$translate_vms(argv[_PyOS_optind]); 3267a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis if (filename == (char *)0 || filename == (char *)-1) 3277a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis filename = argv[_PyOS_optind]; 3287a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis 3297a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else 3302cffc7d4202fc1197280a05d998075551b459283Thomas Wouters filename = argv[_PyOS_optind]; 3317a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif 332775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (filename != NULL) { 333775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if ((fp = fopen(filename, "r")) == NULL) { 3344d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis#ifdef HAVE_STRERROR 3354d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n", 3364d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis argv[0], filename, errno, strerror(errno)); 3374d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis#else 3384d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis fprintf(stderr, "%s: can't open file '%s': Errno %d\n", 3394d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis argv[0], filename, errno); 3404d4dfb7a2b3bf4ed49a9f72ae8b802280b4e6154Martin v. Löwis#endif 341852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return 2; 342775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 343a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum else if (skipfirstline) { 344dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum int ch; 345dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum /* Push back first newline so line numbers 346dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum remain the same */ 347dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum while ((ch = getc(fp)) != EOF) { 348dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum if (ch == '\n') { 349dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum (void)ungetc(ch, fp); 350dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum break; 351dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum } 352dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum } 353a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum } 35411bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz { 35511bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz /* XXX: does this work on Win/Win64? (see posix_fstat) */ 35611bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz struct stat sb; 35711bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz if (fstat(fileno(fp), &sb) == 0 && 35811bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz S_ISDIR(sb.st_mode)) { 35972c2c062d71c499863ff6e260525faaea4a53dbbNeal Norwitz fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename); 36072c2c062d71c499863ff6e260525faaea4a53dbbNeal Norwitz return 1; 36111bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz } 36211bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz } 363775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 364775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 365775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 366775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0); 367775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 368667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (unbuffered) { 3699cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__) 3703e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdin), O_BINARY); 3713e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdout), O_BINARY); 372f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif 37322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 374775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); 375775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 376775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ); 37722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */ 37822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdin, (char *)NULL); 37922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdout, (char *)NULL); 38022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stderr, (char *)NULL); 38122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */ 382667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 3832a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum else if (Py_InteractiveFlag) { 384b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS 385b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum /* Doesn't have to have line-buffered -- use unbuffered */ 38601b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */ 387b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 38822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */ 38922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 390b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); 391b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); 39222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */ 39322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */ 394775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum /* Leave stderr alone - it should be unbuffered anyway. */ 395775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 39679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS 39779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis else { 39879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ); 39979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis } 40079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */ 401667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 4022ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__ 4032ac79ef9e3168691efabad6877e45168a00738acJust van Rossum /* On MacOS X, when the Python interpreter is embedded in an 4042ac79ef9e3168691efabad6877e45168a00738acJust van Rossum application bundle, it gets executed by a bootstrapping script 4052ac79ef9e3168691efabad6877e45168a00738acJust van Rossum that does os.execve() with an argv[0] that's different from the 4062ac79ef9e3168691efabad6877e45168a00738acJust van Rossum actual Python executable. This is needed to keep the Finder happy, 4072ac79ef9e3168691efabad6877e45168a00738acJust van Rossum or rather, to work around Apple's overly strict requirements of 4082ac79ef9e3168691efabad6877e45168a00738acJust van Rossum the process name. However, we still need a usable sys.executable, 4092ac79ef9e3168691efabad6877e45168a00738acJust van Rossum so the actual executable path is passed in an environment variable. 4102ac79ef9e3168691efabad6877e45168a00738acJust van Rossum See Lib/plat-mac/bundlebuiler.py for details about the bootstrap 4112ac79ef9e3168691efabad6877e45168a00738acJust van Rossum script. */ 4122ac79ef9e3168691efabad6877e45168a00738acJust van Rossum if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') 4132ac79ef9e3168691efabad6877e45168a00738acJust van Rossum Py_SetProgramName(p); 4142ac79ef9e3168691efabad6877e45168a00738acJust van Rossum else 4152ac79ef9e3168691efabad6877e45168a00738acJust van Rossum Py_SetProgramName(argv[0]); 4162ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else 417ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_SetProgramName(argv[0]); 418fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif 419ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_Initialize(); 420ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 421667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (Py_VerboseFlag || 422db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) { 423e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis fprintf(stderr, "Python %s on %s\n", 424e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis Py_GetVersion(), Py_GetPlatform()); 425e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis if (!Py_NoSiteFlag) 426e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis fprintf(stderr, "%s\n", COPYRIGHT); 427e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis } 428393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 429667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command != NULL) { 4302cffc7d4202fc1197280a05d998075551b459283Thomas Wouters /* Backup _PyOS_optind and force sys.argv[0] = '-c' */ 4312cffc7d4202fc1197280a05d998075551b459283Thomas Wouters _PyOS_optind--; 4322cffc7d4202fc1197280a05d998075551b459283Thomas Wouters argv[_PyOS_optind] = "-c"; 433667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 434667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 435db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if (module != NULL) { 4360e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters /* Backup _PyOS_optind and force sys.argv[0] = '-c' 4370e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters so that PySys_SetArgv correctly sets sys.path[0] to ''*/ 438db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger _PyOS_optind--; 4390e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters argv[_PyOS_optind] = "-c"; 440db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } 441db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger 4422cffc7d4202fc1197280a05d998075551b459283Thomas Wouters PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); 443667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 444db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if ((inspect || (command == NULL && filename == NULL && module == NULL)) && 4453d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum isatty(fileno(stdin))) { 4463d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyObject *v; 4473d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum v = PyImport_ImportModule("readline"); 4483d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum if (v == NULL) 4493d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyErr_Clear(); 4503d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum else 4513d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum Py_DECREF(v); 4523d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum } 4533d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum 454667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command) { 455393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum sts = PyRun_SimpleStringFlags(command, &cf) != 0; 45605f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum free(command); 457db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } else if (module) { 458a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters sts = RunModule(module); 459db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger free(module); 460667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 461667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum else { 462775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (filename == NULL && stdin_is_interactive) { 4636caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis RunStartupFile(&cf); 464667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 465bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton /* XXX */ 466bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton sts = PyRun_AnyFileExFlags( 467775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum fp, 4680df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum filename == NULL ? "<stdin>" : filename, 469bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton filename != NULL, &cf) != 0; 470667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 471667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 472d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw /* Check this environment variable at the end, to give programs the 473d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw * opportunity to set it from Python. 474d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw */ 475d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw if (!saw_inspect_flag && 476d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 477d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw { 478d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw inspect = 1; 479d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw } 480d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw 481775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (inspect && stdin_is_interactive && 482db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger (filename != NULL || command != NULL || module != NULL)) 483bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton /* XXX */ 484bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0; 485667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 4865d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum Py_Finalize(); 4873ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS 4885134a54df995baa404d0334c7eb8c8218f30d9bfFred Drake if (Py_RISCOSWimpFlag) 4893ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */ 4903ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif 4913e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 4923e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__ 4933e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw /* Insure++ is a memory analysis tool that aids in discovering 4943e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * memory leaks and other memory problems. On Python exit, the 4953e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * interned string dictionary is flagged as being in use at exit 4963e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * (which it is). Under normal circumstances, this is fine because 4973e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * the memory will be automatically reclaimed by the system. Under 4983e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * memory debugging, it's a huge source of useless noise, so we 4993e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * trade off slower shutdown for less distraction in the memory 5003e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * reports. -baw 5013e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw */ 5023e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw _Py_ReleaseInternedStrings(); 5033e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */ 5043e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 50505f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum return sts; 506667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 507667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 508786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between 509786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the 510786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro while statement in Misc/gdbinit:ppystack */ 511667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 512667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules. 513667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum This is rare, but it is needed by the secureware extension. */ 514667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 515667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid 516620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv) 517667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 518667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argc = orig_argc; 519667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argv = orig_argv; 520667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 52149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 52249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 52349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 52449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 52549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 526