main.c revision 7d4bb9f179f1888a472fd5d5a30df4ec3c55fea5
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 666a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#ifdef HAVE_UNISTD_H 766a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#include <unistd.h> 866a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#endif 9667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 103e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#ifdef MS_WINDOWS 113e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h> 123e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif 133e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum 14a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#if defined(PYOS_OS2) || defined(MS_WINDOWS) 15a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib" 16a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else 17da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X" 18a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif 19a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 202cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h" 212cffc7d4202fc1197280a05d998075551b459283Thomas Wouters 22a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \ 2336002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum "Type \"help\", \"copyright\", \"credits\" or \"license\" " \ 2436002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum "for more information." 25a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum 26ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */ 27667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv; 28667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int orig_argc; 29667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 30bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */ 317d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer#define BASE_OPTS "c:diOSEtuUvxXhVW:" 32bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum 33bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#ifndef RISCOS 34bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS 35bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#else /*RISCOS*/ 36bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* extra option saying that we are running under a special task window 37bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum frontend; especially my_readline will behave different */ 38bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS "w" 39bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* corresponding flag */ 403ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossumextern int Py_RISCOSWimpFlag; 41bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#endif /*RISCOS*/ 423ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum 43667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */ 44667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line = 456b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n"; 46667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */ 48a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossumstatic char *usage_top = "\ 49667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\ 50667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-d : debug output from parser (also PYTHONDEBUG=x)\n\ 51775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\ 52bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum and force prompts, even if stdin does not appear to be a terminal\n\ 53e7adf3eb6df5ce8472a41876dd3d3209025aa9fcGuido van Rossum-O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\ 546b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO : remove doc-strings in addition to the -O optimizations\n\ 557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S : don't imply 'import site' on initialization\n\ 567d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer-E : ignore environment variables (such as PYTHONPATH)\n\ 57bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\ 587922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum"; 597922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_mid = "\ 60bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\ 61c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum-U : Unicode literals: treats '...' literals like u'...'\n\ 62667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\ 63a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ 643b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-h : print this help message and exit\n\ 653b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-V : print the Python version number and exit\n\ 6647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum-W arg : warning control (arg is action:message:category:module:lineno)\n\ 67775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-c cmd : program passed in as string (terminates option list)\n\ 68667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile : program read from script file\n\ 69667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum- : program read from stdin (default; interactive mode if a tty)\n\ 707922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum"; 717922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_bot = "\ 72bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossumarg ...: arguments passed to program in sys.argv[1:]\n\ 73667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\ 74667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\ 75a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH : '%c'-separated list of directories prefixed to the\n\ 76667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default module search path. The result is sys.path.\n\ 77a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\ 78a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum The default module search path uses %s.\n\ 79793de09b21ce286bc3c6aa0419f258cceb5d029fTim PetersPYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ 80667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum"; 81667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 82667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 833b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawstatic void 843b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawusage(int exitcode, char* program) 853b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{ 863b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_line, program); 873b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_top); 883b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_mid); 893b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_bot, DELIM, DELIM, PYTHONHOMEHELP); 903b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw exit(exitcode); 913b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw /*NOTREACHED*/ 923b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw} 933b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */ 96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 979c1201fe39c21ecc238daea82460e0ae85ce11f3Guido van RossumDL_EXPORT(int) 98620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv) 99667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 100667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int c; 101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int sts; 102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *command = NULL; 103667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *filename = NULL; 104667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum FILE *fp = stdin; 105667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *p; 106667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int inspect = 0; 107667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int unbuffered = 0; 108a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum int skipfirstline = 0; 109775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum int stdin_is_interactive = 0; 1103b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int help = 0; 1113b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int version = 0; 1127d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer int saw_inspect_flag = 0; 1137d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer int saw_unbuffered_flag = 0; 114bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags cf; 115667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 116ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum orig_argc = argc; /* For Py_GetArgcArgv() */ 117667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum orig_argv = argv; 118ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 1193ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS 1203ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum Py_RISCOSWimpFlag = 0; 1213ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif 1223ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum 12347f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_ResetWarnOptions(); 12447f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 125bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { 126667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (c == 'c') { 127667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* -c is the last option; following arguments 128667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum that look like options are left for the 129667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum the command to interpret. */ 1302cffc7d4202fc1197280a05d998075551b459283Thomas Wouters command = malloc(strlen(_PyOS_optarg) + 2); 131667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command == NULL) 132667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_FatalError( 133667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum "not enough memory to copy -c argument"); 1342cffc7d4202fc1197280a05d998075551b459283Thomas Wouters strcpy(command, _PyOS_optarg); 135667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum strcat(command, "\n"); 136667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 137667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 138667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 139667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum switch (c) { 140667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 141667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'd': 142667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_DebugFlag++; 143667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 144667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 145667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'i': 146667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum inspect++; 1477d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer saw_inspect_flag = 1; 148775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum Py_InteractiveFlag++; 149667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 150667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 1517614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum case 'O': 1527614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum Py_OptimizeFlag++; 1537614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum break; 1547614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum 1557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum case 'S': 1567922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum Py_NoSiteFlag++; 1577922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum break; 1587922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum 1597d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer case 'E': 1607d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer Py_IgnoreEnvironmentFlag++; 1617d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer break; 1627d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer 163bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum case 't': 164bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum Py_TabcheckFlag++; 165bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum break; 166bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum 167667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'u': 168667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum unbuffered++; 1697d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer saw_unbuffered_flag = 1; 170667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 171667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 172667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'v': 173667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_VerboseFlag++; 174667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 175667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 1763ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS 1773ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum case 'w': 1783ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum Py_RISCOSWimpFlag = 1; 1793ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum break; 1803ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif 1813ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum 182a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum case 'x': 183a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum skipfirstline = 1; 184a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum break; 185a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 186c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum case 'U': 187c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum Py_UnicodeFlag++; 188c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum break; 1893b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'h': 1903b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw help++; 1913b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 1923b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'V': 1933b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw version++; 1943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 195c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum 19647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum case 'W': 19747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_AddWarnOption(_PyOS_optarg); 19847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum break; 19947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 200667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* This space reserved for other options */ 201667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 202667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default: 2033b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw usage(2, argv[0]); 204667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /*NOTREACHED*/ 205667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 206667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 207667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 208667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 2093b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (help) 2103b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw usage(0, argv[0]); 2113b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 2123b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (version) { 2133b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, "Python %s\n", PY_VERSION); 2143b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw exit(0); 2153b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw } 2163b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 2177d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if (!saw_inspect_flag && 2187d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 2197d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer inspect = 1; 2207d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if (!saw_unbuffered_flag && 2217d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') 2227d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer unbuffered = 1; 2237d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer 2242cffc7d4202fc1197280a05d998075551b459283Thomas Wouters if (command == NULL && _PyOS_optind < argc && 2252cffc7d4202fc1197280a05d998075551b459283Thomas Wouters strcmp(argv[_PyOS_optind], "-") != 0) 226775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum { 2272cffc7d4202fc1197280a05d998075551b459283Thomas Wouters filename = argv[_PyOS_optind]; 228775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (filename != NULL) { 229775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if ((fp = fopen(filename, "r")) == NULL) { 230775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum fprintf(stderr, "%s: can't open file '%s'\n", 231775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum argv[0], filename); 232775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum exit(2); 233775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 234a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum else if (skipfirstline) { 235dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum int ch; 236dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum /* Push back first newline so line numbers 237dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum remain the same */ 238dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum while ((ch = getc(fp)) != EOF) { 239dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum if (ch == '\n') { 240dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum (void)ungetc(ch, fp); 241dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum break; 242dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum } 243dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum } 244a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum } 245775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 246775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 247775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 248775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0); 249775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 250667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (unbuffered) { 251f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#ifdef MS_WINDOWS 2523e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdin), O_BINARY); 2533e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdout), O_BINARY); 254f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif 255667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#ifndef MPW 25622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 257775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); 258775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 259775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ); 26022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */ 26122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdin, (char *)NULL); 26222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdout, (char *)NULL); 26322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stderr, (char *)NULL); 26422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */ 26522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* MPW */ 266667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* On MPW (3.2) unbuffered seems to hang */ 267775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); 268667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); 269667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ); 27022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* MPW */ 271667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 2722a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum else if (Py_InteractiveFlag) { 273b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS 274b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum /* Doesn't have to have line-buffered -- use unbuffered */ 27501b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */ 276b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 27722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */ 27822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 279b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); 280b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); 28122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */ 28222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */ 283775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum /* Leave stderr alone - it should be unbuffered anyway. */ 284775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 285667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 286ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_SetProgramName(argv[0]); 287ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_Initialize(); 288ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (Py_VerboseFlag || 290129e91aa77b22db1637e9f6db9e081a4a0c9f2a1Guido van Rossum (command == NULL && filename == NULL && stdin_is_interactive)) 291fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum fprintf(stderr, "Python %s on %s\n%s\n", 292a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum Py_GetVersion(), Py_GetPlatform(), COPYRIGHT); 293667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 294667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 295667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command != NULL) { 2962cffc7d4202fc1197280a05d998075551b459283Thomas Wouters /* Backup _PyOS_optind and force sys.argv[0] = '-c' */ 2972cffc7d4202fc1197280a05d998075551b459283Thomas Wouters _PyOS_optind--; 2982cffc7d4202fc1197280a05d998075551b459283Thomas Wouters argv[_PyOS_optind] = "-c"; 299667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 300667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 3012cffc7d4202fc1197280a05d998075551b459283Thomas Wouters PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); 302667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 3033d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum if ((inspect || (command == NULL && filename == NULL)) && 3043d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum isatty(fileno(stdin))) { 3053d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyObject *v; 3063d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum v = PyImport_ImportModule("readline"); 3073d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum if (v == NULL) 3083d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyErr_Clear(); 3093d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum else 3103d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum Py_DECREF(v); 3113d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum } 3123d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum 3135ba58662817b708a453020f0425fe4747ea6d5cbTim Peters cf.cf_flags = 0; 314bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton 315667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command) { 316667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum sts = PyRun_SimpleString(command) != 0; 31705f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum free(command); 318667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 319667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum else { 320775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (filename == NULL && stdin_is_interactive) { 3217d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer char *startup = Py_GETENV("PYTHONSTARTUP"); 322667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (startup != NULL && startup[0] != '\0') { 323667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum FILE *fp = fopen(startup, "r"); 324667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (fp != NULL) { 325667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum (void) PyRun_SimpleFile(fp, startup); 326667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum PyErr_Clear(); 327667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum fclose(fp); 328667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 329667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 330667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 331bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton /* XXX */ 332bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton sts = PyRun_AnyFileExFlags( 333775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum fp, 3340df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum filename == NULL ? "<stdin>" : filename, 335bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton filename != NULL, &cf) != 0; 336667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 337667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 338775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (inspect && stdin_is_interactive && 339667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum (filename != NULL || command != NULL)) 340bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton /* XXX */ 341bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0; 342667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 3435d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum Py_Finalize(); 3443ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#ifdef RISCOS 3453ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum if(Py_RISCOSWimpFlag) 3463ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */ 3473ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum#endif 3483e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 3493e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__ 3503e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw /* Insure++ is a memory analysis tool that aids in discovering 3513e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * memory leaks and other memory problems. On Python exit, the 3523e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * interned string dictionary is flagged as being in use at exit 3533e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * (which it is). Under normal circumstances, this is fine because 3543e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * the memory will be automatically reclaimed by the system. Under 3553e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * memory debugging, it's a huge source of useless noise, so we 3563e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * trade off slower shutdown for less distraction in the memory 3573e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * reports. -baw 3583e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw */ 3593e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw _Py_ReleaseInternedStrings(); 3603e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */ 3613e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 36205f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum return sts; 363667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 364667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 365667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 366667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules. 367667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum This is rare, but it is needed by the secureware extension. */ 368667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 369667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid 370620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv) 371667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 372667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argc = orig_argc; 373667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argv = orig_argv; 374667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 375