main.c revision 374e220bcb1ee71053c18c0b4e409cfa69881722
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 75651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou#include <locale.h> 85651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou 979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS 107a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#include <unixlib.h> 1179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif 1279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis 139cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__) 14945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <windows.h> 15477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H 163e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h> 17790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#define PATH_MAX MAXPATHLEN 183e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif 19477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif 203e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum 21945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#ifdef _MSC_VER 22945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <crtdbg.h> 23945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#endif 24945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis 257bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS) 26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib" 27a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else 287bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC) 297bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#define PYTHONHOMEHELP "<prefix>/Lib" 307bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#else 31da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X" 32a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif 337bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#endif 34a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 352cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h" 362cffc7d4202fc1197280a05d998075551b459283Thomas Wouters 37a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \ 3836002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum "Type \"help\", \"copyright\", \"credits\" or \"license\" " \ 3936002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum "for more information." 40a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum 4149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 4249fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" { 4349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 4449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 45ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */ 46790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t **orig_argv; 47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int orig_argc; 48667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 49bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */ 508dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes#define BASE_OPTS L"bBc:dEhiJm:OsStuvVW:xX?" 51bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum 52bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS 533ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum 54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */ 55667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line = 56790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis"usage: %ls [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\ 612ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\ 622ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes and comparing bytes/bytearray with str. (-bb: issue errors)\n\ 63790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\ 64393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\ 6589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d : debug output from parser; also PYTHONDEBUG=x\n\ 66790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ 670e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h : print this help message and exit (also --help)\n\ 6861c345fa37573005b708d239c0911218ca22383cGuido van Rossum"; 6961c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\ 7098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i : inspect interactively after running script; forces a prompt even\n\ 7198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\ 72db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\ 7389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\ 746b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO : remove doc-strings in addition to the -O optimizations\n\ 758dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ 767922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S : don't imply 'import site' on initialization\n\ 77393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum"; 78393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_3 = "\ 7998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\ 80db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger see man page for details on internal buffering relating to '-u'\n\ 8189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\ 8289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters can be supplied multiple times to increase verbosity\n\ 830e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-V : print the Python version number and exit (also --version)\n\ 8489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\ 85393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ 867922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum"; 87393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\ 8898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile : program read from script file\n\ 8998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum- : program read from stdin (default; interactive mode if a tty)\n\ 9089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\ 91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\ 92667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\ 93a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH : '%c'-separated list of directories prefixed to the\n\ 94667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default module search path. The result is sys.path.\n\ 95790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes"; 96790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimesstatic char *usage_5 = "\ 97a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\ 98a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum The default module search path uses %s.\n\ 99793de09b21ce286bc3c6aa0419f258cceb5d029fTim PetersPYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ 1000f5998911c0a39400a42bad781e84eba822fed38Martin v. LöwisPYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ 101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum"; 102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 103790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#ifndef MS_WINDOWS 104790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic FILE* 105790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis_wfopen(const wchar_t *path, const wchar_t *mode) 106790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis{ 107790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis char cpath[PATH_MAX]; 108790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis char cmode[10]; 109790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis size_t r; 110790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis r = wcstombs(cpath, path, PATH_MAX); 111790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis if (r == (size_t)-1 || r >= PATH_MAX) { 112790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis errno = EINVAL; 113790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis return NULL; 114790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis } 115790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis r = wcstombs(cmode, mode, 10); 116790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis if (r == (size_t)-1 || r >= 10) { 117790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis errno = EINVAL; 118790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis return NULL; 119790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis } 120790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis return fopen(cpath, cmode); 121790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis} 122790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#endif 123790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis 124667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 125852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int 126790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisusage(int exitcode, wchar_t* program) 1273b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{ 128393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum FILE *f = exitcode ? stderr : stdout; 129393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 130393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_line, program); 131393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum if (exitcode) 132393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, "Try `python -h' for more information.\n"); 133393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum else { 134393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_1); 135393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_2); 136393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum fprintf(f, usage_3); 137790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes fprintf(f, usage_4, DELIM); 138790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes fprintf(f, usage_5, DELIM, PYTHONHOMEHELP); 139393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum } 14079acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS) 14179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis if (exitcode == 0) { 14279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis /* suppress 'error' message */ 143852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return 1; 14479acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis } 14579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis else { 14679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis /* STS$M_INHIB_MSG + SS$_ABORT */ 147852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return 0x1000002c; 14879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis } 14979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else 150852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return exitcode; 15179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif 1523b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw /*NOTREACHED*/ 1533b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw} 1543b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 1556caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf) 1566caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{ 1576caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis char *startup = Py_GETENV("PYTHONSTARTUP"); 1586caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis if (startup != NULL && startup[0] != '\0') { 1596caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis FILE *fp = fopen(startup, "r"); 1606caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis if (fp != NULL) { 1616caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); 1626caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis PyErr_Clear(); 1636caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis fclose(fp); 164e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes } else { 165e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes int save_errno; 166e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes 167e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes save_errno = errno; 168e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); 169e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes errno = save_errno; 170e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes PyErr_SetFromErrnoWithFilename(PyExc_IOError, 171e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes startup); 172e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes PyErr_Print(); 173e69a08ea933e69262b08dc18bb3565892de0ad9bChristian Heimes PyErr_Clear(); 1746caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis } 1756caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis } 1766caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis} 1776caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis 178db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger 1795651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0) 180a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{ 1815651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou PyObject *module, *runpy, *runmodule, *runargs, *result; 182a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters runpy = PyImport_ImportModule("runpy"); 183a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (runpy == NULL) { 184a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters fprintf(stderr, "Could not import runpy module\n"); 185a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 186db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } 187ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main"); 188a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (runmodule == NULL) { 189ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters fprintf(stderr, "Could not access runpy._run_module_as_main\n"); 190a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runpy); 191a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 192a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 1935651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou module = PyUnicode_FromWideChar(modname, wcslen(modname)); 1945651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou if (module == NULL) { 1955651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou fprintf(stderr, "Could not convert module name to unicode\n"); 1965651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou Py_DECREF(runpy); 1975651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou Py_DECREF(runmodule); 1985651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou return -1; 1995651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou } 2005651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou runargs = Py_BuildValue("(Oi)", module, set_argv0); 201a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (runargs == NULL) { 202a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters fprintf(stderr, 203ed03b4121ead78df76f6882de5eca01b7a3a628cThomas Wouters "Could not create arguments for runpy._run_module_as_main\n"); 204a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runpy); 205a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runmodule); 2065651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou Py_DECREF(module); 207a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 208a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 209a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters result = PyObject_Call(runmodule, runargs, NULL); 210a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (result == NULL) { 211a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters PyErr_Print(); 212a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 213a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runpy); 214a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runmodule); 2155651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou Py_DECREF(module); 216a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(runargs); 217a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters if (result == NULL) { 218a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return -1; 219a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters } 220a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters Py_DECREF(result); 221a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters return 0; 222db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger} 2233b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 224790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic int RunMainFromImporter(wchar_t *filename) 2259cd177526afc086a300b548588880329c32f607dChristian Heimes{ 2269cd177526afc086a300b548588880329c32f607dChristian Heimes PyObject *argv0 = NULL, *importer = NULL; 2279cd177526afc086a300b548588880329c32f607dChristian Heimes 228790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis if ((argv0 = PyUnicode_FromWideChar(filename,wcslen(filename))) && 22974c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum (importer = PyImport_GetImporter(argv0)) && 23074c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum (importer->ob_type != &PyNullImporter_Type)) 2319cd177526afc086a300b548588880329c32f607dChristian Heimes { 2329cd177526afc086a300b548588880329c32f607dChristian Heimes /* argv0 is usable as an import source, so 2339cd177526afc086a300b548588880329c32f607dChristian Heimes put it in sys.path[0] and import __main__ */ 2349cd177526afc086a300b548588880329c32f607dChristian Heimes PyObject *sys_path = NULL; 23574c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum if ((sys_path = PySys_GetObject("path")) && 23674c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum !PyList_SetItem(sys_path, 0, argv0)) 23774c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum { 2389cd177526afc086a300b548588880329c32f607dChristian Heimes Py_INCREF(argv0); 23974c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum Py_DECREF(importer); 2409cd177526afc086a300b548588880329c32f607dChristian Heimes sys_path = NULL; 2415651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou return RunModule(L"__main__", 0) != 0; 2429cd177526afc086a300b548588880329c32f607dChristian Heimes } 2439cd177526afc086a300b548588880329c32f607dChristian Heimes } 24474c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum Py_XDECREF(argv0); 24574c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum Py_XDECREF(importer); 24674c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum if (PyErr_Occurred()) { 24774c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum PyErr_Print(); 24874c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum return 1; 24974c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum } 25074c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum else { 25174c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum return -1; 25274c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum } 2539cd177526afc086a300b548588880329c32f607dChristian Heimes} 2549cd177526afc086a300b548588880329c32f607dChristian Heimes 2559cd177526afc086a300b548588880329c32f607dChristian Heimes 256902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters/* Wait until threading._shutdown completes, provided 257902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters the threading module was imported in the first place. 258902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters The shutdown routine will wait until all non-daemon 259902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters "threading" threads have completed. */ 260902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#include "abstract.h" 261902d6ebddd07a6086b54ae42929293418f0852d7Thomas Woutersstatic void 262902d6ebddd07a6086b54ae42929293418f0852d7Thomas WoutersWaitForThreadShutdown(void) 263902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters{ 264902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#ifdef WITH_THREAD 265902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters PyObject *result; 266902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters PyThreadState *tstate = PyThreadState_GET(); 267902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters PyObject *threading = PyMapping_GetItemString(tstate->interp->modules, 268902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters "threading"); 269902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters if (threading == NULL) { 270902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters /* threading not imported */ 271902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters PyErr_Clear(); 272902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters return; 273902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters } 274902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters result = PyObject_CallMethod(threading, "_shutdown", ""); 275902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters if (result == NULL) 276902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters PyErr_WriteUnraisable(threading); 277902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters else 278902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters Py_DECREF(result); 279902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters Py_DECREF(threading); 280902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters#endif 281902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters} 282902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters 283667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */ 284667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 285fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint 286790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv) 287667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 288667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int c; 289667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int sts; 2909a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc wchar_t *command = NULL; 291790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *filename = NULL; 2925651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou wchar_t *module = NULL; 293667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum FILE *fp = stdin; 294667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum char *p; 295667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum int unbuffered = 0; 296a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum int skipfirstline = 0; 297775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum int stdin_is_interactive = 0; 2983b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int help = 0; 2993b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw int version = 0; 3007d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer int saw_unbuffered_flag = 0; 301bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags cf; 302667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 303393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum cf.cf_flags = 0; 304393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 305ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum orig_argc = argc; /* For Py_GetArgcArgv() */ 306667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum orig_argv = argv; 307ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 30847f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_ResetWarnOptions(); 30947f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 310bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { 311667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (c == 'c') { 3129a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc size_t len; 313667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* -c is the last option; following arguments 314667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum that look like options are left for the 315f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter Dörwald command to interpret. */ 3169a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc 3179a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc len = wcslen(_PyOS_optarg) + 1 + 1; 3189a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc command = (wchar_t *)malloc(sizeof(wchar_t) * len); 319667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command == NULL) 320667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_FatalError( 321667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum "not enough memory to copy -c argument"); 3229a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc wcscpy(command, _PyOS_optarg); 3239a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc command[len - 2] = '\n'; 3249a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc command[len - 1] = 0; 325667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 326667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 327393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 328db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if (c == 'm') { 329db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger /* -m is the last option; following arguments 330db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger that look like options are left for the 331db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger module to interpret. */ 3325651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou module = _PyOS_optarg; 333db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger break; 334db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } 335db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger 336667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum switch (c) { 33798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum case 'b': 33898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum Py_BytesWarningFlag++; 33998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum break; 340667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 341667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'd': 342667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_DebugFlag++; 343667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 344667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 345667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'i': 346d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum Py_InspectFlag++; 347775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum Py_InteractiveFlag++; 348667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 349667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 35033fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimes /* case 'J': reserved for Jython */ 35133fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimes 3527614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum case 'O': 3537614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum Py_OptimizeFlag++; 3547614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum break; 3557614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum 356790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes case 'B': 357790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes Py_DontWriteBytecodeFlag++; 358790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes break; 359790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes 3608dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes case 's': 3618dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes Py_NoUserSiteDirectory++; 3628dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes break; 3638dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes 3647922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum case 'S': 3657922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum Py_NoSiteFlag++; 3667922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum break; 3677922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum 3687d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer case 'E': 3697d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer Py_IgnoreEnvironmentFlag++; 3707d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer break; 3717d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer 372bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum case 't': 373e1b5ac640841e4233bcd0204efcd50fe9b50a6d0Georg Brandl /* ignored for backwards compatibility */ 374bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum break; 375bba92ca555daeac987386a18ce16df2ea4cdebfeGuido van Rossum 376667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'u': 377667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum unbuffered++; 3787d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer saw_unbuffered_flag = 1; 379667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 380667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 381667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum case 'v': 382667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum Py_VerboseFlag++; 383667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum break; 384667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 385a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum case 'x': 386a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum skipfirstline = 1; 387a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum break; 388a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum 38932dde22186efbbfcfb275ac9542b3e62a9b5cf1bNeal Norwitz /* case 'X': reserved for implementation-specific arguments */ 39033fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimes 3913b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'h': 3920e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters case '?': 3933b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw help++; 3943b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 39545aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum 3963b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw case 'V': 3973b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw version++; 3983b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw break; 399c15a9a1f98544d3258e656503f7cbcefcda92f43Guido van Rossum 400790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis case 'W': 40147f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum PySys_AddWarnOption(_PyOS_optarg); 40247f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum break; 40347f5fdc1144e6f88c09ce790c8d5b9653c7a6d65Guido van Rossum 404667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /* This space reserved for other options */ 405667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 406667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum default: 407852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return usage(2, argv[0]); 408667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum /*NOTREACHED*/ 409667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 410667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 411667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 412667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 4133b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (help) 414852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return usage(0, argv[0]); 4153b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 4163b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw if (version) { 4173b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw fprintf(stderr, "Python %s\n", PY_VERSION); 418852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwis return 0; 4193b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw } 4203b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw 421d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum if (!Py_InspectFlag && 4227d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 423d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum Py_InspectFlag = 1; 4247d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if (!saw_unbuffered_flag && 4257d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') 4267d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer unbuffered = 1; 4277d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer 4288dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes if (!Py_NoUserSiteDirectory && 4298dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0') 4308dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes Py_NoUserSiteDirectory = 1; 4318dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes 432db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if (command == NULL && module == NULL && _PyOS_optind < argc && 433790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcscmp(argv[_PyOS_optind], L"-") != 0) 434775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum { 4357a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS 4367a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis filename = decc$translate_vms(argv[_PyOS_optind]); 4377a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis if (filename == (char *)0 || filename == (char *)-1) 4387a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis filename = argv[_PyOS_optind]; 4397a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis 4407a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else 4412cffc7d4202fc1197280a05d998075551b459283Thomas Wouters filename = argv[_PyOS_optind]; 4427a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif 443775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 444775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 445775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0); 446775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum 447667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (unbuffered) { 4489cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__) 4493e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdin), O_BINARY); 4503e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum _setmode(fileno(stdout), O_BINARY); 451f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif 45222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 453775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ); 454775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 455775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ); 45622ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */ 45722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdin, (char *)NULL); 45822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stdout, (char *)NULL); 45922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum setbuf(stderr, (char *)NULL); 46022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */ 461667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 4622a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum else if (Py_InteractiveFlag) { 463b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS 464b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum /* Doesn't have to have line-buffered -- use unbuffered */ 46501b7ced83452b733c4db004307292493c9dd6d73Guido van Rossum /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */ 466b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ); 46722ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */ 46822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF 469b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ); 470b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ); 47122ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */ 47222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */ 473775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum /* Leave stderr alone - it should be unbuffered anyway. */ 474775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum } 47579acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS 47679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis else { 47779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ); 47879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis } 47979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */ 480667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 4812ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__ 4822ac79ef9e3168691efabad6877e45168a00738acJust van Rossum /* On MacOS X, when the Python interpreter is embedded in an 4832ac79ef9e3168691efabad6877e45168a00738acJust van Rossum application bundle, it gets executed by a bootstrapping script 4842ac79ef9e3168691efabad6877e45168a00738acJust van Rossum that does os.execve() with an argv[0] that's different from the 4852ac79ef9e3168691efabad6877e45168a00738acJust van Rossum actual Python executable. This is needed to keep the Finder happy, 4862ac79ef9e3168691efabad6877e45168a00738acJust van Rossum or rather, to work around Apple's overly strict requirements of 4872ac79ef9e3168691efabad6877e45168a00738acJust van Rossum the process name. However, we still need a usable sys.executable, 4882ac79ef9e3168691efabad6877e45168a00738acJust van Rossum so the actual executable path is passed in an environment variable. 4892ac79ef9e3168691efabad6877e45168a00738acJust van Rossum See Lib/plat-mac/bundlebuiler.py for details about the bootstrap 4902ac79ef9e3168691efabad6877e45168a00738acJust van Rossum script. */ 4912ac79ef9e3168691efabad6877e45168a00738acJust van Rossum if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') 4922ac79ef9e3168691efabad6877e45168a00738acJust van Rossum Py_SetProgramName(p); 4932ac79ef9e3168691efabad6877e45168a00738acJust van Rossum else 4942ac79ef9e3168691efabad6877e45168a00738acJust van Rossum Py_SetProgramName(argv[0]); 4952ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else 496ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_SetProgramName(argv[0]); 497fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif 498ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum Py_Initialize(); 499ed52aacb33623ac2e3d768ee3fcc205c6bd9046fGuido van Rossum 500667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (Py_VerboseFlag || 501db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) { 502e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis fprintf(stderr, "Python %s on %s\n", 503e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis Py_GetVersion(), Py_GetPlatform()); 504e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis if (!Py_NoSiteFlag) 505e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis fprintf(stderr, "%s\n", COPYRIGHT); 506e98922fb80a38fe9b6eb9612f92d9470f2cd2fa8Martin v. Löwis } 507393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum 508667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command != NULL) { 5092cffc7d4202fc1197280a05d998075551b459283Thomas Wouters /* Backup _PyOS_optind and force sys.argv[0] = '-c' */ 5102cffc7d4202fc1197280a05d998075551b459283Thomas Wouters _PyOS_optind--; 511790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis argv[_PyOS_optind] = L"-c"; 512667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 513667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 514db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger if (module != NULL) { 5150e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters /* Backup _PyOS_optind and force sys.argv[0] = '-c' 5160e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters so that PySys_SetArgv correctly sets sys.path[0] to ''*/ 517db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger _PyOS_optind--; 518790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis argv[_PyOS_optind] = L"-c"; 519db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } 520db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger 5212cffc7d4202fc1197280a05d998075551b459283Thomas Wouters PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); 522667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 523d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) && 5243d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum isatty(fileno(stdin))) { 5253d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyObject *v; 5263d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum v = PyImport_ImportModule("readline"); 5273d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum if (v == NULL) 5283d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum PyErr_Clear(); 5293d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum else 5303d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum Py_DECREF(v); 5313d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum } 5323d26cc9542a9ee4ad31e54011ac0d809ba6ff6faGuido van Rossum 533667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum if (command) { 5349a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc PyObject *commandObj = PyUnicode_FromWideChar( 5359a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc command, wcslen(command)); 53605f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum free(command); 5379a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc if (commandObj != NULL) { 5389a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc sts = PyRun_SimpleStringFlags( 5399a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc _PyUnicode_AsString(commandObj), &cf) != 0; 5409a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc } 5419a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc else { 5429a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc PyErr_Print(); 5439a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc sts = 1; 5449a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc } 5459a5499b4e54f1d74dfe41772d780511c8ad1120cAmaury Forgeot d'Arc Py_DECREF(commandObj); 546db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger } else if (module) { 5479cd177526afc086a300b548588880329c32f607dChristian Heimes sts = RunModule(module, 1); 548667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 549667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum else { 5509cd177526afc086a300b548588880329c32f607dChristian Heimes 551775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum if (filename == NULL && stdin_is_interactive) { 552d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum Py_InspectFlag = 0; /* do exit on SystemExit */ 5536caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis RunStartupFile(&cf); 554667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 555bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton /* XXX */ 5569cd177526afc086a300b548588880329c32f607dChristian Heimes 5579cd177526afc086a300b548588880329c32f607dChristian Heimes sts = -1; /* keep track of whether we've already run __main__ */ 5589cd177526afc086a300b548588880329c32f607dChristian Heimes 5599cd177526afc086a300b548588880329c32f607dChristian Heimes if (filename != NULL) { 5609cd177526afc086a300b548588880329c32f607dChristian Heimes sts = RunMainFromImporter(filename); 5619cd177526afc086a300b548588880329c32f607dChristian Heimes } 5629cd177526afc086a300b548588880329c32f607dChristian Heimes 5639cd177526afc086a300b548588880329c32f607dChristian Heimes if (sts==-1 && filename!=NULL) { 564790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis if ((fp = _wfopen(filename, L"r")) == NULL) { 565dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc char cfilename[PATH_MAX]; 566dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc size_t r = wcstombs(cfilename, filename, PATH_MAX); 567dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc if (r == PATH_MAX) 568dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc /* cfilename is not null-terminated; 569dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc * forcefully null-terminating it 570dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc * might break the shift state */ 571dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc strcpy(cfilename, "<file name too long>"); 572dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc if (r == ((size_t)-1)) 573dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc strcpy(cfilename, "<unprintable file name>"); 574dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n", 575dd8059f0781d5af09b25ee5a0683c16cf5ff4d2aAmaury Forgeot d'Arc argv[0], cfilename, errno, strerror(errno)); 576ada8c3b046aa6f3684cbc32a4a140a38c204c050Christian Heimes 5779cd177526afc086a300b548588880329c32f607dChristian Heimes return 2; 5789cd177526afc086a300b548588880329c32f607dChristian Heimes } 5799cd177526afc086a300b548588880329c32f607dChristian Heimes else if (skipfirstline) { 5809cd177526afc086a300b548588880329c32f607dChristian Heimes int ch; 5819cd177526afc086a300b548588880329c32f607dChristian Heimes /* Push back first newline so line numbers 5829cd177526afc086a300b548588880329c32f607dChristian Heimes remain the same */ 5839cd177526afc086a300b548588880329c32f607dChristian Heimes while ((ch = getc(fp)) != EOF) { 5849cd177526afc086a300b548588880329c32f607dChristian Heimes if (ch == '\n') { 5859cd177526afc086a300b548588880329c32f607dChristian Heimes (void)ungetc(ch, fp); 5869cd177526afc086a300b548588880329c32f607dChristian Heimes break; 5879cd177526afc086a300b548588880329c32f607dChristian Heimes } 5889cd177526afc086a300b548588880329c32f607dChristian Heimes } 5899cd177526afc086a300b548588880329c32f607dChristian Heimes } 5909cd177526afc086a300b548588880329c32f607dChristian Heimes { 5919cd177526afc086a300b548588880329c32f607dChristian Heimes /* XXX: does this work on Win/Win64? (see posix_fstat) */ 5929cd177526afc086a300b548588880329c32f607dChristian Heimes struct stat sb; 5939cd177526afc086a300b548588880329c32f607dChristian Heimes if (fstat(fileno(fp), &sb) == 0 && 5949cd177526afc086a300b548588880329c32f607dChristian Heimes S_ISDIR(sb.st_mode)) { 595790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename); 596679db4aa99352abc3c9d93dcfc30e772760a43daChristian Heimes fclose(fp); 5979cd177526afc086a300b548588880329c32f607dChristian Heimes return 1; 5989cd177526afc086a300b548588880329c32f607dChristian Heimes } 5999cd177526afc086a300b548588880329c32f607dChristian Heimes } 6009cd177526afc086a300b548588880329c32f607dChristian Heimes } 6019cd177526afc086a300b548588880329c32f607dChristian Heimes 6029cd177526afc086a300b548588880329c32f607dChristian Heimes if (sts==-1) { 603374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc PyObject *filenameObj = NULL; 604790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis char *p_cfilename = "<stdin>"; 605790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis if (filename) { 606374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc filenameObj = PyUnicode_FromWideChar( 607374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc filename, wcslen(filename)); 608374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc if (filenameObj != NULL) 609374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc p_cfilename = _PyUnicode_AsString(filenameObj); 610374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc else 611790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis p_cfilename = "<decoding error>"; 612790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis } 6139cd177526afc086a300b548588880329c32f607dChristian Heimes sts = PyRun_AnyFileExFlags( 6149cd177526afc086a300b548588880329c32f607dChristian Heimes fp, 615790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis p_cfilename, 6169cd177526afc086a300b548588880329c32f607dChristian Heimes filename != NULL, &cf) != 0; 617374e220bcb1ee71053c18c0b4e409cfa69881722Amaury Forgeot d'Arc Py_XDECREF(filenameObj); 6189cd177526afc086a300b548588880329c32f607dChristian Heimes } 6199cd177526afc086a300b548588880329c32f607dChristian Heimes 620667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum } 621667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 622d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw /* Check this environment variable at the end, to give programs the 623d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw * opportunity to set it from Python. 624d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw */ 625d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum if (!Py_InspectFlag && 626d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') 627d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw { 628d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum Py_InspectFlag = 1; 629d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw } 630d86dcd35540327ac7ba559e8c7852bd82ab84ce7Barry Warsaw 631d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum if (Py_InspectFlag && stdin_is_interactive && 632d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum (filename != NULL || command != NULL || module != NULL)) { 633d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum Py_InspectFlag = 0; 634bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton /* XXX */ 635bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0; 636d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum } 637667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 638902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters WaitForThreadShutdown(); 639902d6ebddd07a6086b54ae42929293418f0852d7Thomas Wouters 6405d1770ee24c7181259fbc5c427f73da037bb8eeeGuido van Rossum Py_Finalize(); 6413e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 6423e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__ 6433e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw /* Insure++ is a memory analysis tool that aids in discovering 6443e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * memory leaks and other memory problems. On Python exit, the 6451680713e524016d93a94114c4a874ad71a090b95Walter Dörwald * interned string dictionaries are flagged as being in use at exit 6463e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * (which it is). Under normal circumstances, this is fine because 6473e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * the memory will be automatically reclaimed by the system. Under 6483e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * memory debugging, it's a huge source of useless noise, so we 6493e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * trade off slower shutdown for less distraction in the memory 6503e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw * reports. -baw 6513e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw */ 6523e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw _Py_ReleaseInternedStrings(); 6531680713e524016d93a94114c4a874ad71a090b95Walter Dörwald _Py_ReleaseInternedUnicodeStrings(); 6543e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */ 6553e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw 65605f7c50bfd68ed0efc68145ff029b1509685751dGuido van Rossum return sts; 657667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 658667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 659786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between 660786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the 661786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro while statement in Misc/gdbinit:ppystack */ 662667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 663667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules. 664667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum This is rare, but it is needed by the secureware extension. */ 665667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 666667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid 667790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv) 668667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 669667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argc = orig_argc; 670667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum *argv = orig_argv; 671667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 67249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 67349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 67449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 67549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 676