blob: 87a21d7c30f259b9d6e6d820e0e5e3f8f6c0368e [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001/* Python interpreter main program */
2
3#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +00004#include "osdefs.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00005
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00006#include <locale.h>
7
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00008#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +00009#include <windows.h>
Thomas Wouters477c8d52006-05-27 19:21:47 +000010#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000011#include <fcntl.h>
Martin v. Löwis790465f2008-04-05 20:41:37 +000012#define PATH_MAX MAXPATHLEN
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000013#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000014#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000015
Martin v. Löwis945362c2007-08-30 14:57:25 +000016#ifdef _MSC_VER
17#include <crtdbg.h>
18#endif
19
Jesus Ceaab70e2a2012-10-05 01:48:08 +020020#if defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000021#define PYTHONHOMEHELP "<prefix>\\lib"
22#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000023#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000024#endif
25
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000026#include "pygetopt.h"
27
Guido van Rossuma22865e2000-09-05 04:41:18 +000028#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000029 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
30 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000031
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000032#ifdef __cplusplus
33extern "C" {
34#endif
35
Guido van Rossumac56b031996-07-21 02:33:38 +000036/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000037static wchar_t **orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000038static int orig_argc;
39
Guido van Rossumbceccf52001-04-10 22:07:43 +000040/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020041#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000042
Guido van Rossumbceccf52001-04-10 22:07:43 +000043#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000044
Guido van Rossum667d7041995-08-04 04:20:48 +000045/* Short usage message (with %s for argv0) */
46static char *usage_line =
Martin v. Löwis790465f2008-04-05 20:41:37 +000047"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000048
49/* Long usage message, split into parts < 512 bytes */
Guido van Rossum393661d2001-08-31 17:40:15 +000050static char *usage_1 = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000051Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000052-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
53 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Christian Heimes790c8232008-01-07 21:14:23 +000054-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000055-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000056-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000057-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000058-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000059";
60static char *usage_2 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000061-i : inspect interactively after running script; forces a prompt even\n\
62 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020063-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000064-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000065-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000066-OO : remove doc-strings in addition to the -O optimizations\n\
Georg Brandl9d871192010-12-04 10:47:18 +000067-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +000068-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000069-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000070";
71static char *usage_3 = "\
Ezio Melotti61b0c672013-07-25 05:04:02 +020072-u : unbuffered binary stdout and stderr, stdin always buffered;\n\
73 also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000074 see man page for details on internal buffering relating to '-u'\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000075-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
76 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000077-V : print the Python version number and exit (also --version)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000078-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +000079 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000080-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +000081-X opt : set implementation-specific option\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000082";
Guido van Rossum393661d2001-08-31 17:40:15 +000083static char *usage_4 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000084file : program read from script file\n\
85- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000086arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000087Other environment variables:\n\
88PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000089PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000090 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000091";
Victor Stinner9802b392010-08-19 11:36:43 +000092static char *usage_5 =
93"PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n"
94" The default module search path uses %s.\n"
95"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
96"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Georg Brandl2fb477c2012-02-21 00:33:36 +010097"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000098";
Georg Brandl2daf6ae2012-02-20 19:54:16 +010099static char *usage_6 = "\
Georg Brandl42ae4722012-02-21 22:37:36 +0100100PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n\
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500101 to seed the hashes of str, bytes and datetime objects. It can also be\n\
102 set to an integer in the range [0,4294967295] to get hash values with a\n\
103 predictable seed.\n\
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100104";
Guido van Rossum667d7041995-08-04 04:20:48 +0000105
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000106static int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000107usage(int exitcode, wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 FILE *f = exitcode ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 fprintf(f, usage_line, program);
112 if (exitcode)
113 fprintf(f, "Try `python -h' for more information.\n");
114 else {
115 fputs(usage_1, f);
116 fputs(usage_2, f);
117 fputs(usage_3, f);
118 fprintf(f, usage_4, DELIM);
119 fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100120 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 return exitcode;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000123}
124
Martin v. Löwis6caea372003-11-18 19:46:25 +0000125static void RunStartupFile(PyCompilerFlags *cf)
126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 char *startup = Py_GETENV("PYTHONSTARTUP");
128 if (startup != NULL && startup[0] != '\0') {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200129 FILE *fp = _Py_fopen(startup, "r");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 if (fp != NULL) {
131 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
132 PyErr_Clear();
133 fclose(fp);
134 } else {
135 int save_errno;
136
137 save_errno = errno;
138 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
139 errno = save_errno;
140 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
141 startup);
142 PyErr_Print();
143 PyErr_Clear();
144 }
145 }
Martin v. Löwis6caea372003-11-18 19:46:25 +0000146}
147
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200148static void RunInteractiveHook(void)
149{
150 PyObject *sys, *hook, *result;
151 sys = PyImport_ImportModule("sys");
152 if (sys == NULL)
153 goto error;
154 hook = PyObject_GetAttrString(sys, "__interactivehook__");
155 Py_DECREF(sys);
156 if (hook == NULL)
157 PyErr_Clear();
158 else {
159 result = PyObject_CallObject(hook, NULL);
160 Py_DECREF(hook);
161 if (result == NULL)
162 goto error;
163 else
164 Py_DECREF(result);
165 }
166 return;
167
168error:
169 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
170 PyErr_Print();
171 PyErr_Clear();
172}
173
Thomas Woutersa9773292006-04-21 09:43:23 +0000174
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000175static int RunModule(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 PyObject *module, *runpy, *runmodule, *runargs, *result;
178 runpy = PyImport_ImportModule("runpy");
179 if (runpy == NULL) {
180 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200181 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 return -1;
183 }
184 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
185 if (runmodule == NULL) {
186 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200187 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 Py_DECREF(runpy);
189 return -1;
190 }
191 module = PyUnicode_FromWideChar(modname, wcslen(modname));
192 if (module == NULL) {
193 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200194 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 Py_DECREF(runpy);
196 Py_DECREF(runmodule);
197 return -1;
198 }
199 runargs = Py_BuildValue("(Oi)", module, set_argv0);
200 if (runargs == NULL) {
201 fprintf(stderr,
202 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200203 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 Py_DECREF(runpy);
205 Py_DECREF(runmodule);
206 Py_DECREF(module);
207 return -1;
208 }
209 result = PyObject_Call(runmodule, runargs, NULL);
210 if (result == NULL) {
211 PyErr_Print();
212 }
213 Py_DECREF(runpy);
214 Py_DECREF(runmodule);
215 Py_DECREF(module);
216 Py_DECREF(runargs);
217 if (result == NULL) {
218 return -1;
219 }
220 Py_DECREF(result);
221 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000222}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000223
Victor Stinner4726e402010-10-06 23:24:57 +0000224static int
225RunMainFromImporter(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000226{
Victor Stinner4726e402010-10-06 23:24:57 +0000227 PyObject *argv0 = NULL, *importer, *sys_path;
228 int sts;
Christian Heimes9cd17752007-11-18 19:35:23 +0000229
Victor Stinner4726e402010-10-06 23:24:57 +0000230 argv0 = PyUnicode_FromWideChar(filename, wcslen(filename));
231 if (argv0 == NULL)
232 goto error;
233
234 importer = PyImport_GetImporter(argv0);
235 if (importer == NULL)
236 goto error;
237
Brett Cannonaa936422012-04-27 15:30:58 -0400238 if (importer == Py_None) {
Victor Stinner4726e402010-10-06 23:24:57 +0000239 Py_DECREF(argv0);
240 Py_DECREF(importer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 return -1;
242 }
Victor Stinner4726e402010-10-06 23:24:57 +0000243 Py_DECREF(importer);
244
245 /* argv0 is usable as an import source, so put it in sys.path[0]
246 and import __main__ */
Victor Stinnerbd303c12013-11-07 23:07:29 +0100247 sys_path = PySys_GetObject("path");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200248 if (sys_path == NULL) {
249 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
Victor Stinner4726e402010-10-06 23:24:57 +0000250 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200251 }
Victor Stinner4726e402010-10-06 23:24:57 +0000252 if (PyList_SetItem(sys_path, 0, argv0)) {
253 argv0 = NULL;
254 goto error;
255 }
256 Py_INCREF(argv0);
257
258 sts = RunModule(L"__main__", 0);
259 return sts != 0;
260
261error:
262 Py_XDECREF(argv0);
263 PyErr_Print();
264 return 1;
Christian Heimes9cd17752007-11-18 19:35:23 +0000265}
266
Victor Stinnera62207c2010-08-07 10:57:17 +0000267static int
268run_command(wchar_t *command, PyCompilerFlags *cf)
269{
270 PyObject *unicode, *bytes;
271 int ret;
272
273 unicode = PyUnicode_FromWideChar(command, -1);
274 if (unicode == NULL)
275 goto error;
276 bytes = PyUnicode_AsUTF8String(unicode);
277 Py_DECREF(unicode);
278 if (bytes == NULL)
279 goto error;
280 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
281 Py_DECREF(bytes);
282 return ret != 0;
283
284error:
Victor Stinner398356b2010-08-18 22:23:22 +0000285 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000286 PyErr_Print();
287 return 1;
288}
289
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000290static int
291run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
292{
293 PyObject *unicode, *bytes = NULL;
294 char *filename_str;
295 int run;
296
297 /* call pending calls like signal handlers (SIGINT) */
298 if (Py_MakePendingCalls() == -1) {
299 PyErr_Print();
300 return 1;
301 }
302
303 if (filename) {
304 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
305 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000306 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000307 Py_DECREF(unicode);
308 }
309 if (bytes != NULL)
310 filename_str = PyBytes_AsString(bytes);
311 else {
312 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000313 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000314 }
315 }
316 else
317 filename_str = "<stdin>";
318
319 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
320 Py_XDECREF(bytes);
321 return run != 0;
322}
323
Christian Heimes9cd17752007-11-18 19:35:23 +0000324
Guido van Rossum667d7041995-08-04 04:20:48 +0000325/* Main program */
326
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000327int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000328Py_Main(int argc, wchar_t **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 int c;
331 int sts;
332 wchar_t *command = NULL;
333 wchar_t *filename = NULL;
334 wchar_t *module = NULL;
335 FILE *fp = stdin;
336 char *p;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000337#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 wchar_t *wp;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 int skipfirstline = 0;
341 int stdin_is_interactive = 0;
342 int help = 0;
343 int version = 0;
344 int saw_unbuffered_flag = 0;
345 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 cf.cf_flags = 0;
Guido van Rossum393661d2001-08-31 17:40:15 +0000348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 orig_argc = argc; /* For Py_GetArgcArgv() */
350 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000351
Antoine Pitrou86838b02012-02-21 19:03:47 +0100352 /* Hash randomization needed early for all string operations
353 (including -W and -X options). */
Ezio Melottia0dd22e2012-11-23 18:48:32 +0200354 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
Antoine Pitrou86838b02012-02-21 19:03:47 +0100355 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
356 if (c == 'm' || c == 'c') {
357 /* -c / -m is the last option: following arguments are
358 not interpreter options. */
359 break;
360 }
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500361 if (c == 'E') {
Antoine Pitrou86838b02012-02-21 19:03:47 +0100362 Py_IgnoreEnvironmentFlag++;
363 break;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100364 }
365 }
Antoine Pitrou86838b02012-02-21 19:03:47 +0100366
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500367 Py_HashRandomizationFlag = 1;
Antoine Pitrou86838b02012-02-21 19:03:47 +0100368 _PyRandom_Init();
369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 PySys_ResetWarnOptions();
Antoine Pitrou86838b02012-02-21 19:03:47 +0100371 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
374 if (c == 'c') {
375 size_t len;
376 /* -c is the last option; following arguments
377 that look like options are left for the
378 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 len = wcslen(_PyOS_optarg) + 1 + 1;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200381 command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (command == NULL)
383 Py_FatalError(
384 "not enough memory to copy -c argument");
385 wcscpy(command, _PyOS_optarg);
386 command[len - 2] = '\n';
387 command[len - 1] = 0;
388 break;
389 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 if (c == 'm') {
392 /* -m is the last option; following arguments
393 that look like options are left for the
394 module to interpret. */
395 module = _PyOS_optarg;
396 break;
397 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 switch (c) {
400 case 'b':
401 Py_BytesWarningFlag++;
402 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 case 'd':
405 Py_DebugFlag++;
406 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 case 'i':
409 Py_InspectFlag++;
410 Py_InteractiveFlag++;
411 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000412
Christian Heimesad73a9c2013-08-10 16:36:18 +0200413 case 'I':
414 Py_IsolatedFlag++;
415 Py_NoUserSiteDirectory++;
416 Py_IgnoreEnvironmentFlag++;
417 break;
418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 case 'O':
422 Py_OptimizeFlag++;
423 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 case 'B':
426 Py_DontWriteBytecodeFlag++;
427 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 case 's':
430 Py_NoUserSiteDirectory++;
431 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 case 'S':
434 Py_NoSiteFlag++;
435 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 case 'E':
Antoine Pitrou86838b02012-02-21 19:03:47 +0100438 /* Already handled above */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 case 't':
442 /* ignored for backwards compatibility */
443 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 case 'u':
446 Py_UnbufferedStdioFlag = 1;
447 saw_unbuffered_flag = 1;
448 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 case 'v':
451 Py_VerboseFlag++;
452 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 case 'x':
455 skipfirstline = 1;
456 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 case 'h':
459 case '?':
460 help++;
461 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 case 'V':
464 version++;
465 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 case 'W':
468 PySys_AddWarnOption(_PyOS_optarg);
469 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000470
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000471 case 'X':
472 PySys_AddXOption(_PyOS_optarg);
473 break;
474
Georg Brandl9d871192010-12-04 10:47:18 +0000475 case 'q':
Georg Brandl8aa7e992010-12-28 18:30:18 +0000476 Py_QuietFlag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000477 break;
478
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100479 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500480 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100481 break;
482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 default:
486 return usage(2, argv[0]);
487 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 }
490 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 if (help)
493 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 if (version) {
Serhiy Storchakae3ed4ed2013-07-11 20:01:17 +0300496 printf("Python %s\n", PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 return 0;
498 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 if (!Py_InspectFlag &&
501 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
502 Py_InspectFlag = 1;
503 if (!saw_unbuffered_flag &&
504 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
505 Py_UnbufferedStdioFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 if (!Py_NoUserSiteDirectory &&
508 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
509 Py_NoUserSiteDirectory = 1;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000510
Philip Jenveye53de3d2010-04-14 03:01:39 +0000511#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
513 *wp != L'\0') {
514 wchar_t *buf, *warning;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000515
Victor Stinner1a7425f2013-07-07 16:25:15 +0200516 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (buf == NULL)
518 Py_FatalError(
519 "not enough memory to copy PYTHONWARNINGS");
520 wcscpy(buf, wp);
521 for (warning = wcstok(buf, L",");
522 warning != NULL;
523 warning = wcstok(NULL, L",")) {
524 PySys_AddWarnOption(warning);
525 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200526 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000528#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
530 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000531 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 /* settle for strtok here as there's no one standard
534 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200535 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 if (buf == NULL)
537 Py_FatalError(
538 "not enough memory to copy PYTHONWARNINGS");
539 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200540 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 setlocale(LC_ALL, "");
542 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000543#ifdef __APPLE__
544 /* Use utf-8 on Mac OS X */
545 unicode = PyUnicode_FromString(p);
546#else
Victor Stinner1b579672011-12-17 05:47:23 +0100547 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000548#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100549 if (unicode == NULL) {
550 /* ignore errors */
551 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000552 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100553 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000554 PySys_AddWarnOptionUnicode(unicode);
555 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 }
557 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200558 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200559 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000561#endif
Philip Jenvey0805ca32010-04-07 04:04:10 +0000562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 if (command == NULL && module == NULL && _PyOS_optind < argc &&
564 wcscmp(argv[_PyOS_optind], L"-") != 0)
565 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 filename = argv[_PyOS_optind];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 }
Guido van Rossum775af911997-02-14 19:50:32 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000570
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000571#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000572 /* don't translate newlines (\r\n <=> \n) */
573 _setmode(fileno(stdin), O_BINARY);
574 _setmode(fileno(stdout), O_BINARY);
575 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000576#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000577
578 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000579#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
581 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
582 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000583#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 setbuf(stdin, (char *)NULL);
585 setbuf(stdout, (char *)NULL);
586 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000587#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 }
589 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000590#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 /* Doesn't have to have line-buffered -- use unbuffered */
592 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
593 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000594#else /* !MS_WINDOWS */
595#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
597 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000598#endif /* HAVE_SETVBUF */
599#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 /* Leave stderr alone - it should be unbuffered anyway. */
601 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000602
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000603#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 /* On MacOS X, when the Python interpreter is embedded in an
605 application bundle, it gets executed by a bootstrapping script
606 that does os.execve() with an argv[0] that's different from the
607 actual Python executable. This is needed to keep the Finder happy,
608 or rather, to work around Apple's overly strict requirements of
609 the process name. However, we still need a usable sys.executable,
610 so the actual executable path is passed in an environment variable.
611 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
612 script. */
613 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
614 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200615 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000616
Victor Stinner1a7425f2013-07-07 16:25:15 +0200617 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 if (buffer == NULL) {
619 Py_FatalError(
620 "not enough memory to copy PYTHONEXECUTABLE");
621 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000622
Brett Cannonb94767f2011-02-22 20:15:44 +0000623 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 Py_SetProgramName(buffer);
625 /* buffer is now handed off - do not free */
626 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100627#ifdef WITH_NEXT_FRAMEWORK
628 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
629
630 if (pyvenv_launcher && *pyvenv_launcher) {
631 /* Used by Mac/Tools/pythonw.c to forward
632 * the argv0 of the stub executable
633 */
634 wchar_t* wbuf = _Py_char2wchar(pyvenv_launcher, NULL);
635
636 if (wbuf == NULL) {
637 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
638 }
639 Py_SetProgramName(wbuf);
640
641 /* Don't free wbuf, the argument to Py_SetProgramName
642 * must remain valid until the Py_Finalize is called.
643 */
644 } else {
645 Py_SetProgramName(argv[0]);
646 }
647#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000651#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 Py_Initialize();
Guido van Rossumed52aac1997-07-19 19:20:32 +0000655
Georg Brandl8aa7e992010-12-28 18:30:18 +0000656 if (!Py_QuietFlag && (Py_VerboseFlag ||
Georg Brandl9d871192010-12-04 10:47:18 +0000657 (command == NULL && filename == NULL &&
658 module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 fprintf(stderr, "Python %s on %s\n",
660 Py_GetVersion(), Py_GetPlatform());
661 if (!Py_NoSiteFlag)
662 fprintf(stderr, "%s\n", COPYRIGHT);
663 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 if (command != NULL) {
666 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
667 _PyOS_optind--;
668 argv[_PyOS_optind] = L"-c";
669 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 if (module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000672 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000674 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
680 isatty(fileno(stdin))) {
681 PyObject *v;
682 v = PyImport_ImportModule("readline");
683 if (v == NULL)
684 PyErr_Clear();
685 else
686 Py_DECREF(v);
687 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 if (command) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000690 sts = run_command(command, &cf);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200691 PyMem_RawFree(command);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 } else if (module) {
Senthil Kumaranf01a3372012-07-04 19:28:16 -0700693 sts = (RunModule(module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 }
695 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 if (filename == NULL && stdin_is_interactive) {
698 Py_InspectFlag = 0; /* do exit on SystemExit */
699 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200700 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 }
702 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 if (filename != NULL) {
707 sts = RunMainFromImporter(filename);
708 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 if (sts==-1 && filename!=NULL) {
Victor Stinner9a6692f2010-10-14 10:51:24 +0000711 fp = _Py_wfopen(filename, L"r");
712 if (fp == NULL) {
713 char *cfilename_buffer;
714 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100715 int err = errno;
Victor Stinner2f02a512010-11-08 22:43:46 +0000716 cfilename_buffer = _Py_wchar2char(filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000717 if (cfilename_buffer != NULL)
718 cfilename = cfilename_buffer;
719 else
720 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100722 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000723 if (cfilename_buffer)
724 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return 2;
726 }
727 else if (skipfirstline) {
728 int ch;
729 /* Push back first newline so line numbers
730 remain the same */
731 while ((ch = getc(fp)) != EOF) {
732 if (ch == '\n') {
733 (void)ungetc(ch, fp);
734 break;
735 }
736 }
737 }
738 {
739 /* XXX: does this work on Win/Win64? (see posix_fstat) */
740 struct stat sb;
741 if (fstat(fileno(fp), &sb) == 0 &&
742 S_ISDIR(sb.st_mode)) {
743 fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename);
744 fclose(fp);
745 return 1;
746 }
747 }
748 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000749
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000750 if (sts == -1)
751 sts = run_file(fp, filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 /* Check this environment variable at the end, to give programs the
755 * opportunity to set it from Python.
756 */
757 if (!Py_InspectFlag &&
758 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
759 {
760 Py_InspectFlag = 1;
761 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 if (Py_InspectFlag && stdin_is_interactive &&
764 (filename != NULL || command != NULL || module != NULL)) {
765 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200766 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 /* XXX */
768 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
769 }
770
771 Py_Finalize();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000772
773#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 /* Insure++ is a memory analysis tool that aids in discovering
775 * memory leaks and other memory problems. On Python exit, the
776 * interned string dictionaries are flagged as being in use at exit
777 * (which it is). Under normal circumstances, this is fine because
778 * the memory will be automatically reclaimed by the system. Under
779 * memory debugging, it's a huge source of useless noise, so we
780 * trade off slower shutdown for less distraction in the memory
781 * reports. -baw
782 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000784#endif /* __INSURE__ */
785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000787}
788
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000789/* this is gonna seem *real weird*, but if you put some other code between
790 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
791 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000792
Guido van Rossum667d7041995-08-04 04:20:48 +0000793/* Make the *original* argc/argv available to other modules.
794 This is rare, but it is needed by the secureware extension. */
795
796void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000797Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 *argc = orig_argc;
800 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000801}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000802
803#ifdef __cplusplus
804}
805#endif