blob: df4c6d887f42a60c668ac9eeaed9ae774c705ec9 [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"
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00005#include "import.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00006
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00007#ifdef __VMS
Martin v. Löwis7a924e62003-03-05 14:15:21 +00008#include <unixlib.h>
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00009#endif
10
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +000011#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +000012#include <windows.h>
Thomas Wouters477c8d52006-05-27 19:21:47 +000013#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000014#include <fcntl.h>
15#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000016#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000017
Martin v. Löwis945362c2007-08-30 14:57:25 +000018#ifdef _MSC_VER
19#include <crtdbg.h>
20#endif
21
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000022#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000023#define PYTHONHOMEHELP "<prefix>\\lib"
24#else
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000025#if defined(PYOS_OS2) && defined(PYCC_GCC)
26#define PYTHONHOMEHELP "<prefix>/Lib"
27#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000028#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000029#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000030#endif
Guido van Rossuma075ce11997-12-05 21:56:45 +000031
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000032#include "pygetopt.h"
33
Guido van Rossuma22865e2000-09-05 04:41:18 +000034#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000035 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
36 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000037
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000038#ifdef __cplusplus
39extern "C" {
40#endif
41
Guido van Rossumac56b031996-07-21 02:33:38 +000042/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum667d7041995-08-04 04:20:48 +000043static char **orig_argv;
44static int orig_argc;
45
Guido van Rossumbceccf52001-04-10 22:07:43 +000046/* command line options */
Guido van Rossum98297ee2007-11-06 21:34:58 +000047#define BASE_OPTS "bc:dEhim:OStuvVW:xX?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000048
Guido van Rossumbceccf52001-04-10 22:07:43 +000049#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000050
Guido van Rossum667d7041995-08-04 04:20:48 +000051/* Short usage message (with %s for argv0) */
52static char *usage_line =
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000053"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000054
55/* Long usage message, split into parts < 512 bytes */
Guido van Rossum393661d2001-08-31 17:40:15 +000056static char *usage_1 = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000057Options and arguments (and corresponding environment variables):\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +000058-b : issue warnings about str(bytes_instance), str(buffer_instance)\n\
59 and comparing bytes/buffer with str. (-bb: issue errors)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000060-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000061-d : debug output from parser; also PYTHONDEBUG=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000062-E : ignore environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000063-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000064";
65static char *usage_2 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000066-i : inspect interactively after running script; forces a prompt even\n\
67 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000068-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000069-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000070-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000071-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000072-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000073";
74static char *usage_3 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000075-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000076 see man page for details on internal buffering relating to '-u'\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000077-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
78 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000079-V : print the Python version number and exit (also --version)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000080-W arg : warning control; arg is action:message:category:module:lineno\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000081-x : skip first line of source, allowing use of non-Unix forms of #!cmd\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\
Guido van Rossuma075ce11997-12-05 21:56:45 +000091PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
92 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +000093PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000094";
95
96
Martin v. Löwis852ba7e2003-03-30 17:09:58 +000097static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +000098usage(int exitcode, char* program)
99{
Guido van Rossum393661d2001-08-31 17:40:15 +0000100 FILE *f = exitcode ? stderr : stdout;
101
102 fprintf(f, usage_line, program);
103 if (exitcode)
104 fprintf(f, "Try `python -h' for more information.\n");
105 else {
106 fprintf(f, usage_1);
107 fprintf(f, usage_2);
108 fprintf(f, usage_3);
109 fprintf(f, usage_4, DELIM, DELIM, PYTHONHOMEHELP);
110 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000111#if defined(__VMS)
112 if (exitcode == 0) {
113 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000114 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000115 }
116 else {
117 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000118 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000119 }
120#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000121 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000122#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000123 /*NOTREACHED*/
124}
125
Martin v. Löwis6caea372003-11-18 19:46:25 +0000126static void RunStartupFile(PyCompilerFlags *cf)
127{
128 char *startup = Py_GETENV("PYTHONSTARTUP");
129 if (startup != NULL && startup[0] != '\0') {
130 FILE *fp = fopen(startup, "r");
131 if (fp != NULL) {
132 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
133 PyErr_Clear();
134 fclose(fp);
Christian Heimese69a08e2007-11-14 16:21:32 +0000135 } else {
136 int save_errno;
137
138 save_errno = errno;
139 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
140 errno = save_errno;
141 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
142 startup);
143 PyErr_Print();
144 PyErr_Clear();
Martin v. Löwis6caea372003-11-18 19:46:25 +0000145 }
146 }
147}
148
Thomas Woutersa9773292006-04-21 09:43:23 +0000149
150static int RunModule(char *module)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000151{
Thomas Woutersa9773292006-04-21 09:43:23 +0000152 PyObject *runpy, *runmodule, *runargs, *result;
153 runpy = PyImport_ImportModule("runpy");
154 if (runpy == NULL) {
155 fprintf(stderr, "Could not import runpy module\n");
156 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000157 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000158 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
Thomas Woutersa9773292006-04-21 09:43:23 +0000159 if (runmodule == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000160 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Thomas Woutersa9773292006-04-21 09:43:23 +0000161 Py_DECREF(runpy);
162 return -1;
163 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000164 runargs = Py_BuildValue("(s)", module);
Thomas Woutersa9773292006-04-21 09:43:23 +0000165 if (runargs == NULL) {
166 fprintf(stderr,
Thomas Woutersed03b412007-08-28 21:37:11 +0000167 "Could not create arguments for runpy._run_module_as_main\n");
Thomas Woutersa9773292006-04-21 09:43:23 +0000168 Py_DECREF(runpy);
169 Py_DECREF(runmodule);
170 return -1;
171 }
172 result = PyObject_Call(runmodule, runargs, NULL);
173 if (result == NULL) {
174 PyErr_Print();
175 }
176 Py_DECREF(runpy);
177 Py_DECREF(runmodule);
178 Py_DECREF(runargs);
179 if (result == NULL) {
180 return -1;
181 }
182 Py_DECREF(result);
183 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000184}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000185
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000186/* Wait until threading._shutdown completes, provided
187 the threading module was imported in the first place.
188 The shutdown routine will wait until all non-daemon
189 "threading" threads have completed. */
190#include "abstract.h"
191static void
192WaitForThreadShutdown(void)
193{
194#ifdef WITH_THREAD
195 PyObject *result;
196 PyThreadState *tstate = PyThreadState_GET();
197 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
198 "threading");
199 if (threading == NULL) {
200 /* threading not imported */
201 PyErr_Clear();
202 return;
203 }
204 result = PyObject_CallMethod(threading, "_shutdown", "");
205 if (result == NULL)
206 PyErr_WriteUnraisable(threading);
207 else
208 Py_DECREF(result);
209 Py_DECREF(threading);
210#endif
211}
212
Guido van Rossum667d7041995-08-04 04:20:48 +0000213/* Main program */
214
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000215int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000216Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000217{
218 int c;
219 int sts;
220 char *command = NULL;
221 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000222 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000223 FILE *fp = stdin;
224 char *p;
Guido van Rossum667d7041995-08-04 04:20:48 +0000225 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000226 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000227 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000228 int help = 0;
229 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000230 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000231 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000232
Guido van Rossum393661d2001-08-31 17:40:15 +0000233 cf.cf_flags = 0;
234
Guido van Rossumac56b031996-07-21 02:33:38 +0000235 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000236 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000237
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000238 PySys_ResetWarnOptions();
239
Guido van Rossumbceccf52001-04-10 22:07:43 +0000240 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000241 if (c == 'c') {
242 /* -c is the last option; following arguments
243 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000244 command to interpret. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000245 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000246 if (command == NULL)
247 Py_FatalError(
248 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000249 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000250 strcat(command, "\n");
251 break;
252 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000253
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000254 if (c == 'm') {
255 /* -m is the last option; following arguments
256 that look like options are left for the
257 module to interpret. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000258 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000259 if (module == NULL)
260 Py_FatalError(
261 "not enough memory to copy -m argument");
262 strcpy(module, _PyOS_optarg);
263 break;
264 }
265
Guido van Rossum667d7041995-08-04 04:20:48 +0000266 switch (c) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000267 case 'b':
268 Py_BytesWarningFlag++;
269 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000270
271 case 'd':
272 Py_DebugFlag++;
273 break;
274
275 case 'i':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000276 Py_InspectFlag++;
Guido van Rossum775af911997-02-14 19:50:32 +0000277 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000278 break;
279
Guido van Rossum7614da61997-03-03 19:14:45 +0000280 case 'O':
281 Py_OptimizeFlag++;
282 break;
283
Guido van Rossum7922bd71997-08-29 22:34:47 +0000284 case 'S':
285 Py_NoSiteFlag++;
286 break;
287
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000288 case 'E':
289 Py_IgnoreEnvironmentFlag++;
290 break;
291
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000292 case 't':
293 Py_TabcheckFlag++;
294 break;
295
Guido van Rossum667d7041995-08-04 04:20:48 +0000296 case 'u':
297 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000298 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000299 break;
300
301 case 'v':
302 Py_VerboseFlag++;
303 break;
304
Guido van Rossuma075ce11997-12-05 21:56:45 +0000305 case 'x':
306 skipfirstline = 1;
307 break;
308
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000309 case 'h':
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000310 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000311 help++;
312 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000313
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000314 case 'V':
315 version++;
316 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000317
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000318 case 'W':
319 PySys_AddWarnOption(_PyOS_optarg);
320 break;
321
Guido van Rossum667d7041995-08-04 04:20:48 +0000322 /* This space reserved for other options */
323
324 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000325 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000326 /*NOTREACHED*/
327
328 }
329 }
330
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000331 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000332 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000333
334 if (version) {
335 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000336 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000337 }
338
Guido van Rossumd8faa362007-04-27 19:54:29 +0000339 if (!Py_InspectFlag &&
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000340 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000341 Py_InspectFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000342 if (!saw_unbuffered_flag &&
343 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
344 unbuffered = 1;
345
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000346 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000347 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000348 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000349#ifdef __VMS
350 filename = decc$translate_vms(argv[_PyOS_optind]);
351 if (filename == (char *)0 || filename == (char *)-1)
352 filename = argv[_PyOS_optind];
353
354#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000355 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000356#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000357 if (filename != NULL) {
358 if ((fp = fopen(filename, "r")) == NULL) {
Martin v. Löwis4d4dfb72004-08-19 11:07:49 +0000359#ifdef HAVE_STRERROR
360 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
361 argv[0], filename, errno, strerror(errno));
362#else
363 fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
364 argv[0], filename, errno);
365#endif
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000366 return 2;
Guido van Rossum775af911997-02-14 19:50:32 +0000367 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000368 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000369 int ch;
370 /* Push back first newline so line numbers
371 remain the same */
372 while ((ch = getc(fp)) != EOF) {
373 if (ch == '\n') {
374 (void)ungetc(ch, fp);
375 break;
376 }
377 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000378 }
Neal Norwitz11bd1192005-10-03 00:54:56 +0000379 {
380 /* XXX: does this work on Win/Win64? (see posix_fstat) */
381 struct stat sb;
382 if (fstat(fileno(fp), &sb) == 0 &&
383 S_ISDIR(sb.st_mode)) {
Neal Norwitz72c2c062006-03-09 05:58:11 +0000384 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000385 fclose(fp);
Neal Norwitz72c2c062006-03-09 05:58:11 +0000386 return 1;
Neal Norwitz11bd1192005-10-03 00:54:56 +0000387 }
388 }
Guido van Rossum775af911997-02-14 19:50:32 +0000389 }
390 }
391
392 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
393
Guido van Rossum667d7041995-08-04 04:20:48 +0000394 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000395#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000396 _setmode(fileno(stdin), O_BINARY);
397 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000398#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000399#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000400 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
401 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
402 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000403#else /* !HAVE_SETVBUF */
404 setbuf(stdin, (char *)NULL);
405 setbuf(stdout, (char *)NULL);
406 setbuf(stderr, (char *)NULL);
407#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000408 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000409 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000410#ifdef MS_WINDOWS
411 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000412 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000413 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000414#else /* !MS_WINDOWS */
415#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000416 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
417 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000418#endif /* HAVE_SETVBUF */
419#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000420 /* Leave stderr alone - it should be unbuffered anyway. */
421 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000422#ifdef __VMS
423 else {
424 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
425 }
426#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000427
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000428#ifdef __APPLE__
429 /* On MacOS X, when the Python interpreter is embedded in an
430 application bundle, it gets executed by a bootstrapping script
431 that does os.execve() with an argv[0] that's different from the
432 actual Python executable. This is needed to keep the Finder happy,
433 or rather, to work around Apple's overly strict requirements of
434 the process name. However, we still need a usable sys.executable,
435 so the actual executable path is passed in an environment variable.
436 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
437 script. */
438 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
439 Py_SetProgramName(p);
440 else
441 Py_SetProgramName(argv[0]);
442#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000443 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000444#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000445 Py_Initialize();
446
Guido van Rossum667d7041995-08-04 04:20:48 +0000447 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000448 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000449 fprintf(stderr, "Python %s on %s\n",
450 Py_GetVersion(), Py_GetPlatform());
451 if (!Py_NoSiteFlag)
452 fprintf(stderr, "%s\n", COPYRIGHT);
453 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000454
Guido van Rossum667d7041995-08-04 04:20:48 +0000455 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000456 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
457 _PyOS_optind--;
458 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000459 }
460
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000461 if (module != NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000462 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
463 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000464 _PyOS_optind--;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000465 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000466 }
467
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000468 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000469
Guido van Rossumd8faa362007-04-27 19:54:29 +0000470 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000471 isatty(fileno(stdin))) {
472 PyObject *v;
473 v = PyImport_ImportModule("readline");
474 if (v == NULL)
475 PyErr_Clear();
476 else
477 Py_DECREF(v);
478 }
479
Guido van Rossum667d7041995-08-04 04:20:48 +0000480 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000481 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000482 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000483 } else if (module) {
Thomas Woutersa9773292006-04-21 09:43:23 +0000484 sts = RunModule(module);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000485 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000486 }
487 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000488 if (filename == NULL && stdin_is_interactive) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000489 Py_InspectFlag = 0; /* do exit on SystemExit */
Martin v. Löwis6caea372003-11-18 19:46:25 +0000490 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000491 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000492 /* XXX */
493 sts = PyRun_AnyFileExFlags(
Guido van Rossum775af911997-02-14 19:50:32 +0000494 fp,
Guido van Rossum0df002c2000-08-27 19:21:52 +0000495 filename == NULL ? "<stdin>" : filename,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000496 filename != NULL, &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000497 }
498
Barry Warsawd86dcd32003-06-29 17:07:06 +0000499 /* Check this environment variable at the end, to give programs the
500 * opportunity to set it from Python.
501 */
Guido van Rossumd8faa362007-04-27 19:54:29 +0000502 if (!Py_InspectFlag &&
Barry Warsawd86dcd32003-06-29 17:07:06 +0000503 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
504 {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000505 Py_InspectFlag = 1;
Barry Warsawd86dcd32003-06-29 17:07:06 +0000506 }
507
Guido van Rossumd8faa362007-04-27 19:54:29 +0000508 if (Py_InspectFlag && stdin_is_interactive &&
509 (filename != NULL || command != NULL || module != NULL)) {
510 Py_InspectFlag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000511 /* XXX */
512 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000513 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000514
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000515 WaitForThreadShutdown();
516
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000517 Py_Finalize();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000518
519#ifdef __INSURE__
520 /* Insure++ is a memory analysis tool that aids in discovering
521 * memory leaks and other memory problems. On Python exit, the
Walter Dörwald16807132007-05-25 13:52:07 +0000522 * interned string dictionaries are flagged as being in use at exit
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000523 * (which it is). Under normal circumstances, this is fine because
524 * the memory will be automatically reclaimed by the system. Under
525 * memory debugging, it's a huge source of useless noise, so we
526 * trade off slower shutdown for less distraction in the memory
527 * reports. -baw
528 */
529 _Py_ReleaseInternedStrings();
Walter Dörwald16807132007-05-25 13:52:07 +0000530 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000531#endif /* __INSURE__ */
532
Guido van Rossum05f7c501997-08-02 03:00:42 +0000533 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000534}
535
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000536/* this is gonna seem *real weird*, but if you put some other code between
537 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
538 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000539
Guido van Rossum667d7041995-08-04 04:20:48 +0000540/* Make the *original* argc/argv available to other modules.
541 This is rare, but it is needed by the secureware extension. */
542
543void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000544Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000545{
546 *argc = orig_argc;
547 *argv = orig_argv;
548}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000549
550#ifdef __cplusplus
551}
552#endif
553