blob: 1700b4e4ae536d2b6e43c896af82f8d3dd799952 [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"
Jeremy Hyltonec97a282005-10-21 14:58:06 +00005#include "code.h" /* For CO_FUTURE_DIVISION */
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00006#include "import.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00007
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00008#ifdef __VMS
Martin v. Löwis7a924e62003-03-05 14:15:21 +00009#include <unixlib.h>
Martin v. Löwis79acb9e2002-12-06 12:48:53 +000010#endif
11
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +000012#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwisa43190b2006-05-22 09:15:18 +000013#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000014#include <fcntl.h>
15#endif
Martin v. Löwisa43190b2006-05-22 09:15:18 +000016#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000017
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000018#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000019#define PYTHONHOMEHELP "<prefix>\\lib"
20#else
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000021#if defined(PYOS_OS2) && defined(PYCC_GCC)
22#define PYTHONHOMEHELP "<prefix>/Lib"
23#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000024#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000025#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000026#endif
Guido van Rossuma075ce11997-12-05 21:56:45 +000027
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000028#include "pygetopt.h"
29
Guido van Rossuma22865e2000-09-05 04:41:18 +000030#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000031 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
32 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000033
Anthony Baxterac6bd462006-04-13 02:06:09 +000034#ifdef __cplusplus
35extern "C" {
36#endif
37
Guido van Rossumac56b031996-07-21 02:33:38 +000038/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum667d7041995-08-04 04:20:48 +000039static char **orig_argv;
40static int orig_argc;
41
Guido van Rossumbceccf52001-04-10 22:07:43 +000042/* command line options */
Georg Brandl9dceedb2006-07-12 15:31:17 +000043#define BASE_OPTS "c:dEhim:OQ:StuUvVW:xX?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000044
45#ifndef RISCOS
46#define PROGRAM_OPTS BASE_OPTS
47#else /*RISCOS*/
48/* extra option saying that we are running under a special task window
49 frontend; especially my_readline will behave different */
50#define PROGRAM_OPTS BASE_OPTS "w"
51/* corresponding flag */
Guido van Rossum3ed4c152001-03-02 06:18:03 +000052extern int Py_RISCOSWimpFlag;
Guido van Rossumbceccf52001-04-10 22:07:43 +000053#endif /*RISCOS*/
Guido van Rossum3ed4c152001-03-02 06:18:03 +000054
Guido van Rossum667d7041995-08-04 04:20:48 +000055/* Short usage message (with %s for argv0) */
56static char *usage_line =
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000057"usage: %s [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000058
59/* Long usage message, split into parts < 512 bytes */
Guido van Rossum393661d2001-08-31 17:40:15 +000060static char *usage_1 = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000061Options and arguments (and corresponding environment variables):\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000062-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000063-d : debug output from parser (also PYTHONDEBUG=x)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000064-E : ignore environment variables (such as PYTHONPATH)\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000065-h : print this help message and exit (also --help)\n\
Guido van Rossum775af911997-02-14 19:50:32 +000066-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000067 and force prompts, even if stdin does not appear to be a terminal\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000068";
69static char *usage_2 = "\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000070-m mod : run library module as a script (terminates option list)\n\
Guido van Rossume7adf3e1998-10-07 14:50:06 +000071-O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000072-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum1832de42001-09-04 03:51:09 +000073-Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000074-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000075-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000076-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000077";
78static char *usage_3 = "\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000079 see man page for details on internal buffering relating to '-u'\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000080-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000081-V : print the Python version number and exit (also --version)\n\
Guido van Rossum47f5fdc2000-12-15 22:00:54 +000082-W arg : warning control (arg is action:message:category:module:lineno)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000083-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000084file : program read from script file\n\
85- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000086";
Guido van Rossum393661d2001-08-31 17:40:15 +000087static char *usage_4 = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000088arg ...: arguments passed to program in sys.argv[1:]\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000089Other environment variables:\n\
90PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000091PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000092 default module search path. The result is sys.path.\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000093PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
94 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +000095PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000096";
97
98
Martin v. Löwis852ba7e2003-03-30 17:09:58 +000099static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000100usage(int exitcode, char* program)
101{
Guido van Rossum393661d2001-08-31 17:40:15 +0000102 FILE *f = exitcode ? stderr : stdout;
103
104 fprintf(f, usage_line, program);
105 if (exitcode)
106 fprintf(f, "Try `python -h' for more information.\n");
107 else {
108 fprintf(f, usage_1);
109 fprintf(f, usage_2);
110 fprintf(f, usage_3);
111 fprintf(f, usage_4, DELIM, DELIM, PYTHONHOMEHELP);
112 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000113#if defined(__VMS)
114 if (exitcode == 0) {
115 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000116 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000117 }
118 else {
119 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000120 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000121 }
122#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000123 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000124#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000125 /*NOTREACHED*/
126}
127
Martin v. Löwis6caea372003-11-18 19:46:25 +0000128static void RunStartupFile(PyCompilerFlags *cf)
129{
130 char *startup = Py_GETENV("PYTHONSTARTUP");
131 if (startup != NULL && startup[0] != '\0') {
132 FILE *fp = fopen(startup, "r");
133 if (fp != NULL) {
134 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
135 PyErr_Clear();
136 fclose(fp);
Georg Brandld9f1da02008-03-29 01:50:46 +0000137 } else {
138 int save_errno;
139 save_errno = errno;
140 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
141 errno = save_errno;
142 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
143 startup);
144 PyErr_Print();
145 PyErr_Clear();
Martin v. Löwis6caea372003-11-18 19:46:25 +0000146 }
147 }
148}
149
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000150
151static int RunModule(char *module)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000152{
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000153 PyObject *runpy, *runmodule, *runargs, *result;
154 runpy = PyImport_ImportModule("runpy");
155 if (runpy == NULL) {
156 fprintf(stderr, "Could not import runpy module\n");
157 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000158 }
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000159 runmodule = PyObject_GetAttrString(runpy, "run_module");
160 if (runmodule == NULL) {
161 fprintf(stderr, "Could not access runpy.run_module\n");
162 Py_DECREF(runpy);
163 return -1;
164 }
165 runargs = Py_BuildValue("sOsO", module,
166 Py_None, "__main__", Py_True);
167 if (runargs == NULL) {
168 fprintf(stderr,
169 "Could not create arguments for runpy.run_module\n");
170 Py_DECREF(runpy);
171 Py_DECREF(runmodule);
172 return -1;
173 }
174 result = PyObject_Call(runmodule, runargs, NULL);
175 if (result == NULL) {
176 PyErr_Print();
177 }
178 Py_DECREF(runpy);
179 Py_DECREF(runmodule);
180 Py_DECREF(runargs);
181 if (result == NULL) {
182 return -1;
183 }
184 Py_DECREF(result);
185 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000186}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000187
Martin v. Löwisbea1c702007-01-04 21:06:57 +0000188/* Wait until threading._shutdown completes, provided
189 the threading module was imported in the first place.
190 The shutdown routine will wait until all non-daemon
191 "threading" threads have completed. */
192#include "abstract.h"
193static void
Brett Cannon8012e9c2007-10-12 17:41:08 +0000194WaitForThreadShutdown(void)
Martin v. Löwisbea1c702007-01-04 21:06:57 +0000195{
196#ifdef WITH_THREAD
197 PyObject *result;
198 PyThreadState *tstate = PyThreadState_GET();
199 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
200 "threading");
201 if (threading == NULL) {
202 /* threading not imported */
203 PyErr_Clear();
204 return;
205 }
206 result = PyObject_CallMethod(threading, "_shutdown", "");
207 if (result == NULL)
208 PyErr_WriteUnraisable(threading);
209 else
210 Py_DECREF(result);
211 Py_DECREF(threading);
212#endif
213}
214
Guido van Rossum667d7041995-08-04 04:20:48 +0000215/* Main program */
216
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000217int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000218Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000219{
220 int c;
221 int sts;
222 char *command = NULL;
223 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000224 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000225 FILE *fp = stdin;
226 char *p;
227 int inspect = 0;
228 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000229 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000230 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000231 int help = 0;
232 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000233 int saw_inspect_flag = 0;
234 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000235 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000236
Guido van Rossum393661d2001-08-31 17:40:15 +0000237 cf.cf_flags = 0;
238
Guido van Rossumac56b031996-07-21 02:33:38 +0000239 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000240 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000241
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000242#ifdef RISCOS
243 Py_RISCOSWimpFlag = 0;
244#endif
245
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000246 PySys_ResetWarnOptions();
247
Guido van Rossumbceccf52001-04-10 22:07:43 +0000248 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000249 if (c == 'c') {
250 /* -c is the last option; following arguments
251 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000252 command to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000253 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000254 if (command == NULL)
255 Py_FatalError(
256 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000257 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000258 strcat(command, "\n");
259 break;
260 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000261
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000262 if (c == 'm') {
263 /* -m is the last option; following arguments
264 that look like options are left for the
265 module to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000266 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000267 if (module == NULL)
268 Py_FatalError(
269 "not enough memory to copy -m argument");
270 strcpy(module, _PyOS_optarg);
271 break;
272 }
273
Guido van Rossum667d7041995-08-04 04:20:48 +0000274 switch (c) {
275
276 case 'd':
277 Py_DebugFlag++;
278 break;
279
Guido van Rossum61c345f2001-09-04 03:26:15 +0000280 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000281 if (strcmp(_PyOS_optarg, "old") == 0) {
282 Py_DivisionWarningFlag = 0;
283 break;
284 }
285 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000286 Py_DivisionWarningFlag = 1;
287 break;
288 }
289 if (strcmp(_PyOS_optarg, "warnall") == 0) {
290 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000291 break;
292 }
293 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000294 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000295 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000296 /* And this tells the eval loop to treat
297 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
298 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000299 break;
300 }
301 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000302 "-Q option should be `-Qold', "
303 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000304 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000305 /* NOTREACHED */
306
Guido van Rossum667d7041995-08-04 04:20:48 +0000307 case 'i':
308 inspect++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000309 saw_inspect_flag = 1;
Guido van Rossum775af911997-02-14 19:50:32 +0000310 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000311 break;
312
Guido van Rossum7614da61997-03-03 19:14:45 +0000313 case 'O':
314 Py_OptimizeFlag++;
315 break;
316
Guido van Rossum7922bd71997-08-29 22:34:47 +0000317 case 'S':
318 Py_NoSiteFlag++;
319 break;
320
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000321 case 'E':
322 Py_IgnoreEnvironmentFlag++;
323 break;
324
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000325 case 't':
326 Py_TabcheckFlag++;
327 break;
328
Guido van Rossum667d7041995-08-04 04:20:48 +0000329 case 'u':
330 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000331 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000332 break;
333
334 case 'v':
335 Py_VerboseFlag++;
336 break;
337
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000338#ifdef RISCOS
339 case 'w':
340 Py_RISCOSWimpFlag = 1;
341 break;
342#endif
343
Guido van Rossuma075ce11997-12-05 21:56:45 +0000344 case 'x':
345 skipfirstline = 1;
346 break;
347
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000348 case 'U':
349 Py_UnicodeFlag++;
350 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000351 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000352 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000353 help++;
354 break;
355 case 'V':
356 version++;
357 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000358
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000359 case 'W':
360 PySys_AddWarnOption(_PyOS_optarg);
361 break;
362
Guido van Rossum667d7041995-08-04 04:20:48 +0000363 /* This space reserved for other options */
364
365 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000366 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000367 /*NOTREACHED*/
368
369 }
370 }
371
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000372 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000373 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000374
375 if (version) {
376 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000377 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000378 }
379
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000380 if (!saw_inspect_flag &&
381 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
382 inspect = 1;
383 if (!saw_unbuffered_flag &&
384 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
385 unbuffered = 1;
386
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000387 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000388 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000389 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000390#ifdef __VMS
391 filename = decc$translate_vms(argv[_PyOS_optind]);
392 if (filename == (char *)0 || filename == (char *)-1)
393 filename = argv[_PyOS_optind];
394
395#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000396 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000397#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000398 if (filename != NULL) {
399 if ((fp = fopen(filename, "r")) == NULL) {
Martin v. Löwis4d4dfb72004-08-19 11:07:49 +0000400#ifdef HAVE_STRERROR
401 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
402 argv[0], filename, errno, strerror(errno));
403#else
404 fprintf(stderr, "%s: can't open file '%s': Errno %d\n",
405 argv[0], filename, errno);
406#endif
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000407 return 2;
Guido van Rossum775af911997-02-14 19:50:32 +0000408 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000409 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000410 int ch;
411 /* Push back first newline so line numbers
412 remain the same */
413 while ((ch = getc(fp)) != EOF) {
414 if (ch == '\n') {
415 (void)ungetc(ch, fp);
416 break;
417 }
418 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000419 }
Neal Norwitz11bd1192005-10-03 00:54:56 +0000420 {
421 /* XXX: does this work on Win/Win64? (see posix_fstat) */
422 struct stat sb;
423 if (fstat(fileno(fp), &sb) == 0 &&
424 S_ISDIR(sb.st_mode)) {
Neal Norwitz72c2c062006-03-09 05:58:11 +0000425 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
426 return 1;
Neal Norwitz11bd1192005-10-03 00:54:56 +0000427 }
428 }
Guido van Rossum775af911997-02-14 19:50:32 +0000429 }
430 }
431
432 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
433
Guido van Rossum667d7041995-08-04 04:20:48 +0000434 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000435#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000436 _setmode(fileno(stdin), O_BINARY);
437 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000438#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000439#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000440 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
441 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
442 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000443#else /* !HAVE_SETVBUF */
444 setbuf(stdin, (char *)NULL);
445 setbuf(stdout, (char *)NULL);
446 setbuf(stderr, (char *)NULL);
447#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000448 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000449 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000450#ifdef MS_WINDOWS
451 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000452 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000453 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000454#else /* !MS_WINDOWS */
455#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000456 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
457 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000458#endif /* HAVE_SETVBUF */
459#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000460 /* Leave stderr alone - it should be unbuffered anyway. */
461 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000462#ifdef __VMS
463 else {
464 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
465 }
466#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000467
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000468#ifdef __APPLE__
469 /* On MacOS X, when the Python interpreter is embedded in an
470 application bundle, it gets executed by a bootstrapping script
471 that does os.execve() with an argv[0] that's different from the
472 actual Python executable. This is needed to keep the Finder happy,
473 or rather, to work around Apple's overly strict requirements of
474 the process name. However, we still need a usable sys.executable,
475 so the actual executable path is passed in an environment variable.
476 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
477 script. */
478 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
479 Py_SetProgramName(p);
480 else
481 Py_SetProgramName(argv[0]);
482#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000483 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000484#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000485 Py_Initialize();
486
Guido van Rossum667d7041995-08-04 04:20:48 +0000487 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000488 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000489 fprintf(stderr, "Python %s on %s\n",
490 Py_GetVersion(), Py_GetPlatform());
491 if (!Py_NoSiteFlag)
492 fprintf(stderr, "%s\n", COPYRIGHT);
493 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000494
Guido van Rossum667d7041995-08-04 04:20:48 +0000495 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000496 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
497 _PyOS_optind--;
498 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000499 }
500
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000501 if (module != NULL) {
Nick Coghlan81f444b2006-06-12 10:17:11 +0000502 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
503 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000504 _PyOS_optind--;
Nick Coghlan81f444b2006-06-12 10:17:11 +0000505 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000506 }
507
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000508 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000509
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000510 if ((inspect || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000511 isatty(fileno(stdin))) {
512 PyObject *v;
513 v = PyImport_ImportModule("readline");
514 if (v == NULL)
515 PyErr_Clear();
516 else
517 Py_DECREF(v);
518 }
519
Guido van Rossum667d7041995-08-04 04:20:48 +0000520 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000521 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000522 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000523 } else if (module) {
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000524 sts = RunModule(module);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000525 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000526 }
527 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000528 if (filename == NULL && stdin_is_interactive) {
Martin v. Löwis6caea372003-11-18 19:46:25 +0000529 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000530 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000531 /* XXX */
532 sts = PyRun_AnyFileExFlags(
Guido van Rossum775af911997-02-14 19:50:32 +0000533 fp,
Guido van Rossum0df002c2000-08-27 19:21:52 +0000534 filename == NULL ? "<stdin>" : filename,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000535 filename != NULL, &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000536 }
537
Barry Warsawd86dcd32003-06-29 17:07:06 +0000538 /* Check this environment variable at the end, to give programs the
539 * opportunity to set it from Python.
540 */
541 if (!saw_inspect_flag &&
542 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
543 {
544 inspect = 1;
545 }
546
Guido van Rossum775af911997-02-14 19:50:32 +0000547 if (inspect && stdin_is_interactive &&
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000548 (filename != NULL || command != NULL || module != NULL))
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000549 /* XXX */
550 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000551
Martin v. Löwisbea1c702007-01-04 21:06:57 +0000552 WaitForThreadShutdown();
553
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000554 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000555#ifdef RISCOS
Fred Drake5134a542002-10-17 20:37:50 +0000556 if (Py_RISCOSWimpFlag)
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000557 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
558#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000559
560#ifdef __INSURE__
561 /* Insure++ is a memory analysis tool that aids in discovering
562 * memory leaks and other memory problems. On Python exit, the
563 * interned string dictionary is flagged as being in use at exit
564 * (which it is). Under normal circumstances, this is fine because
565 * the memory will be automatically reclaimed by the system. Under
566 * memory debugging, it's a huge source of useless noise, so we
567 * trade off slower shutdown for less distraction in the memory
568 * reports. -baw
569 */
570 _Py_ReleaseInternedStrings();
571#endif /* __INSURE__ */
572
Guido van Rossum05f7c501997-08-02 03:00:42 +0000573 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000574}
575
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000576/* this is gonna seem *real weird*, but if you put some other code between
577 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
578 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000579
Guido van Rossum667d7041995-08-04 04:20:48 +0000580/* Make the *original* argc/argv available to other modules.
581 This is rare, but it is needed by the secureware extension. */
582
583void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000584Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000585{
586 *argc = orig_argc;
587 *argv = orig_argv;
588}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000589
590#ifdef __cplusplus
591}
592#endif
593