main.c revision 47f5fdc1144e6f88c09ce790c8d5b9653c7a6d65
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 17620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik Lundh#define PYTHONHOMEHELP "<prefix>/python2.0" 18a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif 19a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 202cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h" 212cffc7d4202fc1197280a05d998075551b459283Thomas Wouters 22a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \ 23a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum "Type \"copyright\", \"credits\" or \"license\" for more information." 24a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum 25ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */ 26667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv; 27667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int orig_argc; 28667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 29667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */ 30667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line = 316b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n"; 32667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 33667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */ 34a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossumstatic char *usage_top = "\ 35667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\ 36667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-d : debug output from parser (also PYTHONDEBUG=x)\n\ 37775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\ 38bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum and force prompts, even if stdin does not appear to be a terminal\n\ 39e7adf3eb6df5ce8472a41876dd3d3209025aa9fcGuido van Rossum-O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\ 406b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO : remove doc-strings in addition to the -O optimizations\n\ 417922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S : don't imply 'import site' on initialization\n\ 42bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\ 437922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum"; 447922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_mid = "\ 45bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\ 46c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum-U : Unicode literals: treats '...' literals like u'...'\n\ 47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\ 48a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ 493b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-h : print this help message and exit\n\ 503b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw-V : print the Python version number and exit\n\ 5147f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum-W arg : warning control (arg is action:message:category:module:lineno)\n\ 52775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-c cmd : program passed in as string (terminates option list)\n\ 53667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile : program read from script file\n\ 54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum- : program read from stdin (default; interactive mode if a tty)\n\ 557922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum"; 567922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossumstatic char *usage_bot = "\ 57bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossumarg ...: arguments passed to program in sys.argv[1:]\n\ 58667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\ 59667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\ 60a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH : '%c'-separated list of directories prefixed to the\n\ 61667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default module search path. The result is sys.path.\n\ 62a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\ 63a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum The default module search path uses %s.\n\ 64667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum"; 65667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 66667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 673b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawstatic void 683b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsawusage(int exitcode, char* program) 693b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{ 703b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_line, program); 713b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_top); 723b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_mid); 733b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, usage_bot, DELIM, DELIM, PYTHONHOMEHELP); 743b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw exit(exitcode); 753b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw /*NOTREACHED*/ 763b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw} 773b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 783b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 79667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */ 80667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 819c1201fe39c21ecc238daea82460e0ae85ce11f3Guido van RossumDL_EXPORT(int) 82620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_Main(int argc, char **argv) 83667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 84667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int c; 85667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int sts; 86667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *command = NULL; 87667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *filename = NULL; 88667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum FILE *fp = stdin; 89667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *p; 90667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int inspect = 0; 91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int unbuffered = 0; 92a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum int skipfirstline = 0; 93775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum int stdin_is_interactive = 0; 943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int help = 0; 953b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int version = 0; 96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 97ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum orig_argc = argc; /* For Py_GetArgcArgv() */ 98667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum orig_argv = argv; 99ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 100667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if ((p = getenv("PYTHONINSPECT")) && *p != '\0') 101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum inspect = 1; 102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0') 103667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum unbuffered = 1; 104667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 10547f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_ResetWarnOptions(); 10647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 10747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum while ((c = _PyOS_GetOpt(argc, argv, "c:diOStuUvxXhVW:")) != EOF) { 108667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (c == 'c') { 109667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* -c is the last option; following arguments 110667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum that look like options are left for the 111667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum the command to interpret. */ 1122cffc7d4202fc1197280a05d998075551b459283Thomas Wouters command = malloc(strlen(_PyOS_optarg) + 2); 113667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command == NULL) 114667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_FatalError( 115667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum "not enough memory to copy -c argument"); 1162cffc7d4202fc1197280a05d998075551b459283Thomas Wouters strcpy(command, _PyOS_optarg); 117667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum strcat(command, "\n"); 118667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 119667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 120667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 121667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum switch (c) { 122667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 123667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'd': 124667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_DebugFlag++; 125667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 126667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 127667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'i': 128667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum inspect++; 129775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum Py_InteractiveFlag++; 130667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 131667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 1327614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum case 'O': 1337614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum Py_OptimizeFlag++; 1347614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum break; 1357614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum 1367922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum case 'S': 1377922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum Py_NoSiteFlag++; 1387922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum break; 1397922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum 140bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum case 't': 141bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum Py_TabcheckFlag++; 142bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum break; 143bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum 144667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'u': 145667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum unbuffered++; 146667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 147667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 148667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'v': 149667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_VerboseFlag++; 150667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 151667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 152a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum case 'x': 153a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum skipfirstline = 1; 154a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum break; 155a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 156c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum case 'U': 157c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum Py_UnicodeFlag++; 158c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum break; 1593b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'h': 1603b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw help++; 1613b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 1623b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'V': 1633b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw version++; 1643b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 165c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum 16647f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum case 'W': 16747f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_AddWarnOption(_PyOS_optarg); 16847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum break; 16947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 170667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* This space reserved for other options */ 171667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 172667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default: 1733b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw usage(2, argv[0]); 174667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /*NOTREACHED*/ 175667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 176667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 177667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 178667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 1793b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (help) 1803b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw usage(0, argv[0]); 1813b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 1823b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (version) { 1833b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, "Python %s\n", PY_VERSION); 1843b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw exit(0); 1853b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw } 1863b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 1872cffc7d4202fc1197280a05d998075551b459283Thomas Wouters if (command == NULL && _PyOS_optind < argc && 1882cffc7d4202fc1197280a05d998075551b459283Thomas Wouters strcmp(argv[_PyOS_optind], "-") != 0) 189775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum { 1902cffc7d4202fc1197280a05d998075551b459283Thomas Wouters filename = argv[_PyOS_optind]; 191775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (filename != NULL) { 192775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if ((fp = fopen(filename, "r")) == NULL) { 193775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum fprintf(stderr, "%s: can't open file '%s'\n", 194775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum argv[0], filename); 195775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum exit(2); 196775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 197a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum else if (skipfirstline) { 198dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum int ch; 199dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum /* Push back first newline so line numbers 200dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum remain the same */ 201dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum while ((ch = getc(fp)) != EOF) { 202dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum if (ch == '\n') { 203dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum (void)ungetc(ch, fp); 204dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum break; 205dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum } 206dc8b56915534b15668d9f40d499b60934292b4d4Guido van Rossum } 207a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum } 208775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 209775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 210775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 211775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0); 212775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 213667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (unbuffered) { 214f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#ifdef MS_WINDOWS 2153e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdin), O_BINARY); 2163e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdout), O_BINARY); 217f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif 218667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#ifndef MPW 21922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 220775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); 221775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 222775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ); 22322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */ 22422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdin, (char *)NULL); 22522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdout, (char *)NULL); 22622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stderr, (char *)NULL); 22722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */ 22822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* MPW */ 229667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* On MPW (3.2) unbuffered seems to hang */ 230775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); 231667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); 232667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ); 23322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* MPW */ 234667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 2352a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum else if (Py_InteractiveFlag) { 236b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS 237b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum /* Doesn't have to have line-buffered -- use unbuffered */ 23801b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */ 239b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 24022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */ 24122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 242b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); 243b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); 24422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */ 24522ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */ 246775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum /* Leave stderr alone - it should be unbuffered anyway. */ 247775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 248667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 249ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_SetProgramName(argv[0]); 250ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_Initialize(); 251ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 252667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (Py_VerboseFlag || 253129e91aa77b22db1637e9f6db9e081a4a0c9f2a1Guido van Rossum (command == NULL && filename == NULL && stdin_is_interactive)) 254fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum fprintf(stderr, "Python %s on %s\n%s\n", 255a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum Py_GetVersion(), Py_GetPlatform(), COPYRIGHT); 256667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 257667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 258667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command != NULL) { 2592cffc7d4202fc1197280a05d998075551b459283Thomas Wouters /* Backup _PyOS_optind and force sys.argv[0] = '-c' */ 2602cffc7d4202fc1197280a05d998075551b459283Thomas Wouters _PyOS_optind--; 2612cffc7d4202fc1197280a05d998075551b459283Thomas Wouters argv[_PyOS_optind] = "-c"; 262667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 263667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 2642cffc7d4202fc1197280a05d998075551b459283Thomas Wouters PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); 265667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 2663d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum if ((inspect || (command == NULL && filename == NULL)) && 2673d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum isatty(fileno(stdin))) { 2683d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyObject *v; 2693d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum v = PyImport_ImportModule("readline"); 2703d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum if (v == NULL) 2713d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyErr_Clear(); 2723d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum else 2733d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum Py_DECREF(v); 2743d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum } 2753d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum 276667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command) { 277667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum sts = PyRun_SimpleString(command) != 0; 27805f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum free(command); 279667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 280667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum else { 281775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (filename == NULL && stdin_is_interactive) { 282667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *startup = getenv("PYTHONSTARTUP"); 283667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (startup != NULL && startup[0] != '\0') { 284667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum FILE *fp = fopen(startup, "r"); 285667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (fp != NULL) { 286667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum (void) PyRun_SimpleFile(fp, startup); 287667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum PyErr_Clear(); 288667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum fclose(fp); 289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 290667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 291667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 2920df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum sts = PyRun_AnyFileEx( 293775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum fp, 2940df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum filename == NULL ? "<stdin>" : filename, 2950df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum filename != NULL) != 0; 296667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 297667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 298775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (inspect && stdin_is_interactive && 299667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum (filename != NULL || command != NULL)) 300667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum sts = PyRun_AnyFile(stdin, "<stdin>") != 0; 301667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 3025d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum Py_Finalize(); 30305f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum return sts; 304667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 305667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 306667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 307667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules. 308667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum This is rare, but it is needed by the secureware extension. */ 309667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 310667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid 311620f37723ffe02f7b550aaf8386fcd62f30f6db1Fredrik LundhPy_GetArgcArgv(int *argc, char ***argv) 312667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 313667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argc = orig_argc; 314667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argv = orig_argv; 315667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 316