blob: 21cb48703d4ebf027a188bf0d96d6279475025e9 [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 */
Christian Heimes1a6387e2008-03-26 12:49:49 +000043#define BASE_OPTS "3bBc: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\
Georg Brandl2da0fce2008-01-07 17:09:35 +000062-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000063-c cmd : program passed in as string (terminates option list)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000064-d : debug output from parser; also PYTHONDEBUG=x\n\
Georg Brandlaed6c662008-01-07 17:25:53 +000065-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000066-h : print this help message and exit (also --help)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000067-i : inspect interactively after running script; forces a prompt even\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000068";
69static char *usage_2 = "\
Georg Brandl2da0fce2008-01-07 17:09:35 +000070 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000071-m mod : run library module as a script (terminates option list)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000072-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000073-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum1832de42001-09-04 03:51:09 +000074-Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000075-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000076-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000077";
78static char *usage_3 = "\
Georg Brandl2da0fce2008-01-07 17:09:35 +000079-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000080 see man page for details on internal buffering relating to '-u'\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000081-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
82 can be supplied multiple times to increase verbosity\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000083-V : print the Python version number and exit (also --version)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000084-W arg : warning control; arg is action:message:category:module:lineno\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000085-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Georg Brandl2da0fce2008-01-07 17:09:35 +000086";
87static char *usage_4 = "\
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +000088-3 : warn about Python 3.x incompatibilities\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000089file : program read from script file\n\
90- : program read from stdin (default; interactive mode if a tty)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000091arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000092Other environment variables:\n\
93PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000094PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000095 default module search path. The result is sys.path.\n\
Georg Brandl2da0fce2008-01-07 17:09:35 +000096";
97static char *usage_5 = "\
Guido van Rossuma075ce11997-12-05 21:56:45 +000098PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
99 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +0000100PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000101";
102
103
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000104static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000105usage(int exitcode, char* program)
106{
Guido van Rossum393661d2001-08-31 17:40:15 +0000107 FILE *f = exitcode ? stderr : stdout;
108
109 fprintf(f, usage_line, program);
110 if (exitcode)
111 fprintf(f, "Try `python -h' for more information.\n");
112 else {
113 fprintf(f, usage_1);
114 fprintf(f, usage_2);
115 fprintf(f, usage_3);
Georg Brandl2da0fce2008-01-07 17:09:35 +0000116 fprintf(f, usage_4, DELIM);
117 fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
Guido van Rossum393661d2001-08-31 17:40:15 +0000118 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000119#if defined(__VMS)
120 if (exitcode == 0) {
121 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000122 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000123 }
124 else {
125 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000126 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000127 }
128#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000129 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000130#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000131 /*NOTREACHED*/
132}
133
Martin v. Löwis6caea372003-11-18 19:46:25 +0000134static void RunStartupFile(PyCompilerFlags *cf)
135{
136 char *startup = Py_GETENV("PYTHONSTARTUP");
137 if (startup != NULL && startup[0] != '\0') {
138 FILE *fp = fopen(startup, "r");
139 if (fp != NULL) {
140 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
141 PyErr_Clear();
142 fclose(fp);
143 }
144 }
145}
146
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000147
Nick Coghlan327a39b2007-11-18 11:56:28 +0000148static int RunModule(char *module, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000149{
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000150 PyObject *runpy, *runmodule, *runargs, *result;
151 runpy = PyImport_ImportModule("runpy");
152 if (runpy == NULL) {
153 fprintf(stderr, "Could not import runpy module\n");
154 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000155 }
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000156 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000157 if (runmodule == NULL) {
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000158 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000159 Py_DECREF(runpy);
160 return -1;
161 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000162 runargs = Py_BuildValue("(si)", module, set_argv0);
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000163 if (runargs == NULL) {
164 fprintf(stderr,
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000165 "Could not create arguments for runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000166 Py_DECREF(runpy);
167 Py_DECREF(runmodule);
168 return -1;
169 }
170 result = PyObject_Call(runmodule, runargs, NULL);
171 if (result == NULL) {
172 PyErr_Print();
173 }
174 Py_DECREF(runpy);
175 Py_DECREF(runmodule);
176 Py_DECREF(runargs);
177 if (result == NULL) {
178 return -1;
179 }
180 Py_DECREF(result);
181 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000182}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000183
Nick Coghlan327a39b2007-11-18 11:56:28 +0000184static int RunMainFromImporter(char *filename)
185{
186 PyObject *argv0 = NULL, *importer = NULL;
187
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000188 if ((argv0 = PyString_FromString(filename)) &&
189 (importer = PyImport_GetImporter(argv0)) &&
190 (importer->ob_type != &PyNullImporter_Type))
Nick Coghlan327a39b2007-11-18 11:56:28 +0000191 {
192 /* argv0 is usable as an import source, so
193 put it in sys.path[0] and import __main__ */
194 PyObject *sys_path = NULL;
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000195 if ((sys_path = PySys_GetObject("path")) &&
196 !PyList_SetItem(sys_path, 0, argv0))
197 {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000198 Py_INCREF(argv0);
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000199 Py_DECREF(importer);
Nick Coghlan327a39b2007-11-18 11:56:28 +0000200 sys_path = NULL;
201 return RunModule("__main__", 0) != 0;
202 }
203 }
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000204 Py_XDECREF(argv0);
205 Py_XDECREF(importer);
206 if (PyErr_Occurred()) {
207 PyErr_Print();
208 return 1;
209 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000210 return -1;
211}
212
213
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000214/* Wait until threading._shutdown completes, provided
215 the threading module was imported in the first place.
216 The shutdown routine will wait until all non-daemon
217 "threading" threads have completed. */
218#include "abstract.h"
219static void
Brett Cannond14ef772007-01-05 21:45:09 +0000220WaitForThreadShutdown(void)
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000221{
222#ifdef WITH_THREAD
223 PyObject *result;
224 PyThreadState *tstate = PyThreadState_GET();
225 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
226 "threading");
227 if (threading == NULL) {
228 /* threading not imported */
229 PyErr_Clear();
230 return;
231 }
232 result = PyObject_CallMethod(threading, "_shutdown", "");
233 if (result == NULL)
234 PyErr_WriteUnraisable(threading);
235 else
236 Py_DECREF(result);
237 Py_DECREF(threading);
238#endif
239}
240
Guido van Rossum667d7041995-08-04 04:20:48 +0000241/* Main program */
242
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000243int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000244Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000245{
246 int c;
247 int sts;
248 char *command = NULL;
249 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000250 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000251 FILE *fp = stdin;
252 char *p;
Guido van Rossum667d7041995-08-04 04:20:48 +0000253 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000254 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000255 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000256 int help = 0;
257 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000258 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000259 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000260
Guido van Rossum393661d2001-08-31 17:40:15 +0000261 cf.cf_flags = 0;
262
Guido van Rossumac56b031996-07-21 02:33:38 +0000263 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000264 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000265
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000266#ifdef RISCOS
267 Py_RISCOSWimpFlag = 0;
268#endif
269
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000270 PySys_ResetWarnOptions();
271
Guido van Rossumbceccf52001-04-10 22:07:43 +0000272 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000273 if (c == 'c') {
274 /* -c is the last option; following arguments
275 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000276 command to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000277 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000278 if (command == NULL)
279 Py_FatalError(
280 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000281 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000282 strcat(command, "\n");
283 break;
284 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000285
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000286 if (c == 'm') {
287 /* -m is the last option; following arguments
288 that look like options are left for the
289 module to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000290 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000291 if (module == NULL)
292 Py_FatalError(
293 "not enough memory to copy -m argument");
294 strcpy(module, _PyOS_optarg);
295 break;
296 }
297
Guido van Rossum667d7041995-08-04 04:20:48 +0000298 switch (c) {
Christian Heimes1a6387e2008-03-26 12:49:49 +0000299 case 'b':
300 Py_BytesWarningFlag++;
301 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000302
303 case 'd':
304 Py_DebugFlag++;
305 break;
306
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000307 case '3':
308 Py_Py3kWarningFlag++;
309 break;
310
Guido van Rossum61c345f2001-09-04 03:26:15 +0000311 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000312 if (strcmp(_PyOS_optarg, "old") == 0) {
313 Py_DivisionWarningFlag = 0;
314 break;
315 }
316 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000317 Py_DivisionWarningFlag = 1;
318 break;
319 }
320 if (strcmp(_PyOS_optarg, "warnall") == 0) {
321 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000322 break;
323 }
324 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000325 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000326 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000327 /* And this tells the eval loop to treat
328 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
329 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000330 break;
331 }
332 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000333 "-Q option should be `-Qold', "
334 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000335 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000336 /* NOTREACHED */
337
Guido van Rossum667d7041995-08-04 04:20:48 +0000338 case 'i':
Georg Brandl49aafc92007-03-07 00:34:46 +0000339 Py_InspectFlag++;
Guido van Rossum775af911997-02-14 19:50:32 +0000340 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000341 break;
342
Guido van Rossum7614da61997-03-03 19:14:45 +0000343 case 'O':
344 Py_OptimizeFlag++;
345 break;
346
Georg Brandl2da0fce2008-01-07 17:09:35 +0000347 case 'B':
348 Py_DontWriteBytecodeFlag++;
349 break;
350
Guido van Rossum7922bd71997-08-29 22:34:47 +0000351 case 'S':
352 Py_NoSiteFlag++;
353 break;
354
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000355 case 'E':
356 Py_IgnoreEnvironmentFlag++;
357 break;
358
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000359 case 't':
360 Py_TabcheckFlag++;
361 break;
362
Guido van Rossum667d7041995-08-04 04:20:48 +0000363 case 'u':
364 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000365 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000366 break;
367
368 case 'v':
369 Py_VerboseFlag++;
370 break;
371
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000372#ifdef RISCOS
373 case 'w':
374 Py_RISCOSWimpFlag = 1;
375 break;
376#endif
377
Guido van Rossuma075ce11997-12-05 21:56:45 +0000378 case 'x':
379 skipfirstline = 1;
380 break;
381
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000382 case 'U':
383 Py_UnicodeFlag++;
384 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000385 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000386 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000387 help++;
388 break;
389 case 'V':
390 version++;
391 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000392
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000393 case 'W':
394 PySys_AddWarnOption(_PyOS_optarg);
395 break;
396
Guido van Rossum667d7041995-08-04 04:20:48 +0000397 /* This space reserved for other options */
398
399 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000400 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000401 /*NOTREACHED*/
402
403 }
404 }
405
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000406 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000407 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000408
409 if (version) {
410 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000411 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000412 }
413
Georg Brandl49aafc92007-03-07 00:34:46 +0000414 if (!Py_InspectFlag &&
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000415 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
Georg Brandl49aafc92007-03-07 00:34:46 +0000416 Py_InspectFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000417 if (!saw_unbuffered_flag &&
418 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
419 unbuffered = 1;
420
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000421 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000422 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000423 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000424#ifdef __VMS
425 filename = decc$translate_vms(argv[_PyOS_optind]);
426 if (filename == (char *)0 || filename == (char *)-1)
427 filename = argv[_PyOS_optind];
428
429#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000430 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000431#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000432 }
433
434 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
435
Guido van Rossum667d7041995-08-04 04:20:48 +0000436 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000437#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000438 _setmode(fileno(stdin), O_BINARY);
439 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000440#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000441#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000442 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
443 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
444 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000445#else /* !HAVE_SETVBUF */
446 setbuf(stdin, (char *)NULL);
447 setbuf(stdout, (char *)NULL);
448 setbuf(stderr, (char *)NULL);
449#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000450 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000451 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000452#ifdef MS_WINDOWS
453 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000454 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000455 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000456#else /* !MS_WINDOWS */
457#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000458 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
459 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000460#endif /* HAVE_SETVBUF */
461#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000462 /* Leave stderr alone - it should be unbuffered anyway. */
463 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000464#ifdef __VMS
465 else {
466 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
467 }
468#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000469
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000470#ifdef __APPLE__
471 /* On MacOS X, when the Python interpreter is embedded in an
472 application bundle, it gets executed by a bootstrapping script
473 that does os.execve() with an argv[0] that's different from the
474 actual Python executable. This is needed to keep the Finder happy,
475 or rather, to work around Apple's overly strict requirements of
476 the process name. However, we still need a usable sys.executable,
477 so the actual executable path is passed in an environment variable.
478 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
479 script. */
480 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
481 Py_SetProgramName(p);
482 else
483 Py_SetProgramName(argv[0]);
484#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000485 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000486#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000487 Py_Initialize();
488
Guido van Rossum667d7041995-08-04 04:20:48 +0000489 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000490 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000491 fprintf(stderr, "Python %s on %s\n",
492 Py_GetVersion(), Py_GetPlatform());
493 if (!Py_NoSiteFlag)
494 fprintf(stderr, "%s\n", COPYRIGHT);
495 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000496
Guido van Rossum667d7041995-08-04 04:20:48 +0000497 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000498 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
499 _PyOS_optind--;
500 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000501 }
502
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000503 if (module != NULL) {
Nick Coghlan81f444b2006-06-12 10:17:11 +0000504 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
505 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000506 _PyOS_optind--;
Nick Coghlan81f444b2006-06-12 10:17:11 +0000507 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000508 }
509
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000510 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000511
Georg Brandl49aafc92007-03-07 00:34:46 +0000512 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000513 isatty(fileno(stdin))) {
514 PyObject *v;
515 v = PyImport_ImportModule("readline");
516 if (v == NULL)
517 PyErr_Clear();
518 else
519 Py_DECREF(v);
520 }
521
Guido van Rossum667d7041995-08-04 04:20:48 +0000522 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000523 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000524 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000525 } else if (module) {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000526 sts = RunModule(module, 1);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000527 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000528 }
529 else {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000530
Guido van Rossum775af911997-02-14 19:50:32 +0000531 if (filename == NULL && stdin_is_interactive) {
Georg Brandl49aafc92007-03-07 00:34:46 +0000532 Py_InspectFlag = 0; /* do exit on SystemExit */
Martin v. Löwis6caea372003-11-18 19:46:25 +0000533 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000534 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000535 /* XXX */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000536
537 sts = -1; /* keep track of whether we've already run __main__ */
538
539 if (filename != NULL) {
540 sts = RunMainFromImporter(filename);
541 }
542
543 if (sts==-1 && filename!=NULL) {
544 if ((fp = fopen(filename, "r")) == NULL) {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000545 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
546 argv[0], filename, errno, strerror(errno));
Brett Cannon10ed0f52008-03-18 15:35:58 +0000547
Nick Coghlan327a39b2007-11-18 11:56:28 +0000548 return 2;
549 }
550 else if (skipfirstline) {
551 int ch;
552 /* Push back first newline so line numbers
553 remain the same */
554 while ((ch = getc(fp)) != EOF) {
555 if (ch == '\n') {
556 (void)ungetc(ch, fp);
557 break;
558 }
559 }
560 }
561 {
562 /* XXX: does this work on Win/Win64? (see posix_fstat) */
563 struct stat sb;
564 if (fstat(fileno(fp), &sb) == 0 &&
565 S_ISDIR(sb.st_mode)) {
566 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
Christian Heimes5cc3f262008-01-18 08:53:45 +0000567 fclose(fp);
Nick Coghlan327a39b2007-11-18 11:56:28 +0000568 return 1;
569 }
570 }
571 }
572
573 if (sts==-1) {
574 sts = PyRun_AnyFileExFlags(
575 fp,
576 filename == NULL ? "<stdin>" : filename,
577 filename != NULL, &cf) != 0;
578 }
579
Guido van Rossum667d7041995-08-04 04:20:48 +0000580 }
581
Barry Warsawd86dcd32003-06-29 17:07:06 +0000582 /* Check this environment variable at the end, to give programs the
583 * opportunity to set it from Python.
584 */
Georg Brandl49aafc92007-03-07 00:34:46 +0000585 if (!Py_InspectFlag &&
Barry Warsawd86dcd32003-06-29 17:07:06 +0000586 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
587 {
Georg Brandl49aafc92007-03-07 00:34:46 +0000588 Py_InspectFlag = 1;
Barry Warsawd86dcd32003-06-29 17:07:06 +0000589 }
590
Georg Brandl49aafc92007-03-07 00:34:46 +0000591 if (Py_InspectFlag && stdin_is_interactive &&
592 (filename != NULL || command != NULL || module != NULL)) {
593 Py_InspectFlag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000594 /* XXX */
595 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Georg Brandl49aafc92007-03-07 00:34:46 +0000596 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000597
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000598 WaitForThreadShutdown();
599
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000600 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000601#ifdef RISCOS
Fred Drake5134a542002-10-17 20:37:50 +0000602 if (Py_RISCOSWimpFlag)
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000603 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
604#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000605
606#ifdef __INSURE__
607 /* Insure++ is a memory analysis tool that aids in discovering
608 * memory leaks and other memory problems. On Python exit, the
609 * interned string dictionary is flagged as being in use at exit
610 * (which it is). Under normal circumstances, this is fine because
611 * the memory will be automatically reclaimed by the system. Under
612 * memory debugging, it's a huge source of useless noise, so we
613 * trade off slower shutdown for less distraction in the memory
614 * reports. -baw
615 */
616 _Py_ReleaseInternedStrings();
617#endif /* __INSURE__ */
618
Guido van Rossum05f7c501997-08-02 03:00:42 +0000619 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000620}
621
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000622/* this is gonna seem *real weird*, but if you put some other code between
623 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
624 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000625
Guido van Rossum667d7041995-08-04 04:20:48 +0000626/* Make the *original* argc/argv available to other modules.
627 This is rare, but it is needed by the secureware extension. */
628
629void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000630Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000631{
632 *argc = orig_argc;
633 *argv = orig_argv;
634}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000635
636#ifdef __cplusplus
637}
638#endif
639