blob: a91974012547f1e0c8717718cda3b68a1b81f4b3 [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);
Georg Brandl91e0cda2008-03-29 01:50:06 +0000143 } else {
144 int save_errno;
145 save_errno = errno;
146 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
147 errno = save_errno;
148 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
149 startup);
150 PyErr_Print();
151 PyErr_Clear();
Martin v. Löwis6caea372003-11-18 19:46:25 +0000152 }
153 }
154}
155
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000156
Nick Coghlan327a39b2007-11-18 11:56:28 +0000157static int RunModule(char *module, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000158{
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000159 PyObject *runpy, *runmodule, *runargs, *result;
160 runpy = PyImport_ImportModule("runpy");
161 if (runpy == NULL) {
162 fprintf(stderr, "Could not import runpy module\n");
163 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000164 }
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000165 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000166 if (runmodule == NULL) {
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000167 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000168 Py_DECREF(runpy);
169 return -1;
170 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000171 runargs = Py_BuildValue("(si)", module, set_argv0);
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000172 if (runargs == NULL) {
173 fprintf(stderr,
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000174 "Could not create arguments for runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000175 Py_DECREF(runpy);
176 Py_DECREF(runmodule);
177 return -1;
178 }
179 result = PyObject_Call(runmodule, runargs, NULL);
180 if (result == NULL) {
181 PyErr_Print();
182 }
183 Py_DECREF(runpy);
184 Py_DECREF(runmodule);
185 Py_DECREF(runargs);
186 if (result == NULL) {
187 return -1;
188 }
189 Py_DECREF(result);
190 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000191}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000192
Nick Coghlan327a39b2007-11-18 11:56:28 +0000193static int RunMainFromImporter(char *filename)
194{
195 PyObject *argv0 = NULL, *importer = NULL;
196
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000197 if ((argv0 = PyString_FromString(filename)) &&
198 (importer = PyImport_GetImporter(argv0)) &&
199 (importer->ob_type != &PyNullImporter_Type))
Nick Coghlan327a39b2007-11-18 11:56:28 +0000200 {
201 /* argv0 is usable as an import source, so
202 put it in sys.path[0] and import __main__ */
203 PyObject *sys_path = NULL;
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000204 if ((sys_path = PySys_GetObject("path")) &&
205 !PyList_SetItem(sys_path, 0, argv0))
206 {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000207 Py_INCREF(argv0);
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000208 Py_DECREF(importer);
Nick Coghlan327a39b2007-11-18 11:56:28 +0000209 sys_path = NULL;
210 return RunModule("__main__", 0) != 0;
211 }
212 }
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000213 Py_XDECREF(argv0);
214 Py_XDECREF(importer);
215 if (PyErr_Occurred()) {
216 PyErr_Print();
217 return 1;
218 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000219 return -1;
220}
221
222
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000223/* Wait until threading._shutdown completes, provided
224 the threading module was imported in the first place.
225 The shutdown routine will wait until all non-daemon
226 "threading" threads have completed. */
227#include "abstract.h"
228static void
Brett Cannond14ef772007-01-05 21:45:09 +0000229WaitForThreadShutdown(void)
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000230{
231#ifdef WITH_THREAD
232 PyObject *result;
233 PyThreadState *tstate = PyThreadState_GET();
234 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
235 "threading");
236 if (threading == NULL) {
237 /* threading not imported */
238 PyErr_Clear();
239 return;
240 }
241 result = PyObject_CallMethod(threading, "_shutdown", "");
242 if (result == NULL)
243 PyErr_WriteUnraisable(threading);
244 else
245 Py_DECREF(result);
246 Py_DECREF(threading);
247#endif
248}
249
Guido van Rossum667d7041995-08-04 04:20:48 +0000250/* Main program */
251
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000252int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000253Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000254{
255 int c;
256 int sts;
257 char *command = NULL;
258 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000259 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000260 FILE *fp = stdin;
261 char *p;
Guido van Rossum667d7041995-08-04 04:20:48 +0000262 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000263 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000264 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000265 int help = 0;
266 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000267 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000268 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000269
Guido van Rossum393661d2001-08-31 17:40:15 +0000270 cf.cf_flags = 0;
271
Guido van Rossumac56b031996-07-21 02:33:38 +0000272 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000273 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000274
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000275#ifdef RISCOS
276 Py_RISCOSWimpFlag = 0;
277#endif
278
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000279 PySys_ResetWarnOptions();
280
Guido van Rossumbceccf52001-04-10 22:07:43 +0000281 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000282 if (c == 'c') {
283 /* -c is the last option; following arguments
284 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000285 command to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000286 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000287 if (command == NULL)
288 Py_FatalError(
289 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000290 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000291 strcat(command, "\n");
292 break;
293 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000294
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000295 if (c == 'm') {
296 /* -m is the last option; following arguments
297 that look like options are left for the
298 module to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000299 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000300 if (module == NULL)
301 Py_FatalError(
302 "not enough memory to copy -m argument");
303 strcpy(module, _PyOS_optarg);
304 break;
305 }
306
Guido van Rossum667d7041995-08-04 04:20:48 +0000307 switch (c) {
Christian Heimes1a6387e2008-03-26 12:49:49 +0000308 case 'b':
309 Py_BytesWarningFlag++;
310 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000311
312 case 'd':
313 Py_DebugFlag++;
314 break;
315
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000316 case '3':
317 Py_Py3kWarningFlag++;
318 break;
319
Guido van Rossum61c345f2001-09-04 03:26:15 +0000320 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000321 if (strcmp(_PyOS_optarg, "old") == 0) {
322 Py_DivisionWarningFlag = 0;
323 break;
324 }
325 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000326 Py_DivisionWarningFlag = 1;
327 break;
328 }
329 if (strcmp(_PyOS_optarg, "warnall") == 0) {
330 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000331 break;
332 }
333 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000334 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000335 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000336 /* And this tells the eval loop to treat
337 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
338 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000339 break;
340 }
341 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000342 "-Q option should be `-Qold', "
343 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000344 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000345 /* NOTREACHED */
346
Guido van Rossum667d7041995-08-04 04:20:48 +0000347 case 'i':
Georg Brandl49aafc92007-03-07 00:34:46 +0000348 Py_InspectFlag++;
Guido van Rossum775af911997-02-14 19:50:32 +0000349 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000350 break;
351
Guido van Rossum7614da61997-03-03 19:14:45 +0000352 case 'O':
353 Py_OptimizeFlag++;
354 break;
355
Georg Brandl2da0fce2008-01-07 17:09:35 +0000356 case 'B':
357 Py_DontWriteBytecodeFlag++;
358 break;
359
Guido van Rossum7922bd71997-08-29 22:34:47 +0000360 case 'S':
361 Py_NoSiteFlag++;
362 break;
363
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000364 case 'E':
365 Py_IgnoreEnvironmentFlag++;
366 break;
367
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000368 case 't':
369 Py_TabcheckFlag++;
370 break;
371
Guido van Rossum667d7041995-08-04 04:20:48 +0000372 case 'u':
373 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000374 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000375 break;
376
377 case 'v':
378 Py_VerboseFlag++;
379 break;
380
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000381#ifdef RISCOS
382 case 'w':
383 Py_RISCOSWimpFlag = 1;
384 break;
385#endif
386
Guido van Rossuma075ce11997-12-05 21:56:45 +0000387 case 'x':
388 skipfirstline = 1;
389 break;
390
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000391 case 'U':
392 Py_UnicodeFlag++;
393 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000394 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000395 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000396 help++;
397 break;
398 case 'V':
399 version++;
400 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000401
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000402 case 'W':
403 PySys_AddWarnOption(_PyOS_optarg);
404 break;
405
Guido van Rossum667d7041995-08-04 04:20:48 +0000406 /* This space reserved for other options */
407
408 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000409 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000410 /*NOTREACHED*/
411
412 }
413 }
414
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000415 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000416 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000417
418 if (version) {
419 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000420 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000421 }
422
Georg Brandl49aafc92007-03-07 00:34:46 +0000423 if (!Py_InspectFlag &&
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000424 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
Georg Brandl49aafc92007-03-07 00:34:46 +0000425 Py_InspectFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000426 if (!saw_unbuffered_flag &&
427 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
428 unbuffered = 1;
429
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000430 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000431 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000432 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000433#ifdef __VMS
434 filename = decc$translate_vms(argv[_PyOS_optind]);
435 if (filename == (char *)0 || filename == (char *)-1)
436 filename = argv[_PyOS_optind];
437
438#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000439 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000440#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000441 }
442
443 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
444
Guido van Rossum667d7041995-08-04 04:20:48 +0000445 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000446#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000447 _setmode(fileno(stdin), O_BINARY);
448 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000449#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000450#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000451 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
452 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
453 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000454#else /* !HAVE_SETVBUF */
455 setbuf(stdin, (char *)NULL);
456 setbuf(stdout, (char *)NULL);
457 setbuf(stderr, (char *)NULL);
458#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000459 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000460 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000461#ifdef MS_WINDOWS
462 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000463 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000464 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000465#else /* !MS_WINDOWS */
466#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000467 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
468 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000469#endif /* HAVE_SETVBUF */
470#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000471 /* Leave stderr alone - it should be unbuffered anyway. */
472 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000473#ifdef __VMS
474 else {
475 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
476 }
477#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000478
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000479#ifdef __APPLE__
480 /* On MacOS X, when the Python interpreter is embedded in an
481 application bundle, it gets executed by a bootstrapping script
482 that does os.execve() with an argv[0] that's different from the
483 actual Python executable. This is needed to keep the Finder happy,
484 or rather, to work around Apple's overly strict requirements of
485 the process name. However, we still need a usable sys.executable,
486 so the actual executable path is passed in an environment variable.
487 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
488 script. */
489 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
490 Py_SetProgramName(p);
491 else
492 Py_SetProgramName(argv[0]);
493#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000494 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000495#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000496 Py_Initialize();
497
Guido van Rossum667d7041995-08-04 04:20:48 +0000498 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000499 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000500 fprintf(stderr, "Python %s on %s\n",
501 Py_GetVersion(), Py_GetPlatform());
502 if (!Py_NoSiteFlag)
503 fprintf(stderr, "%s\n", COPYRIGHT);
504 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000505
Guido van Rossum667d7041995-08-04 04:20:48 +0000506 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000507 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
508 _PyOS_optind--;
509 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000510 }
511
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000512 if (module != NULL) {
Nick Coghlan81f444b2006-06-12 10:17:11 +0000513 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
514 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000515 _PyOS_optind--;
Nick Coghlan81f444b2006-06-12 10:17:11 +0000516 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000517 }
518
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000519 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000520
Georg Brandl49aafc92007-03-07 00:34:46 +0000521 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000522 isatty(fileno(stdin))) {
523 PyObject *v;
524 v = PyImport_ImportModule("readline");
525 if (v == NULL)
526 PyErr_Clear();
527 else
528 Py_DECREF(v);
529 }
530
Guido van Rossum667d7041995-08-04 04:20:48 +0000531 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000532 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000533 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000534 } else if (module) {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000535 sts = RunModule(module, 1);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000536 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000537 }
538 else {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000539
Guido van Rossum775af911997-02-14 19:50:32 +0000540 if (filename == NULL && stdin_is_interactive) {
Georg Brandl49aafc92007-03-07 00:34:46 +0000541 Py_InspectFlag = 0; /* do exit on SystemExit */
Martin v. Löwis6caea372003-11-18 19:46:25 +0000542 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000543 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000544 /* XXX */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000545
546 sts = -1; /* keep track of whether we've already run __main__ */
547
548 if (filename != NULL) {
549 sts = RunMainFromImporter(filename);
550 }
551
552 if (sts==-1 && filename!=NULL) {
553 if ((fp = fopen(filename, "r")) == NULL) {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000554 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
555 argv[0], filename, errno, strerror(errno));
Brett Cannon10ed0f52008-03-18 15:35:58 +0000556
Nick Coghlan327a39b2007-11-18 11:56:28 +0000557 return 2;
558 }
559 else if (skipfirstline) {
560 int ch;
561 /* Push back first newline so line numbers
562 remain the same */
563 while ((ch = getc(fp)) != EOF) {
564 if (ch == '\n') {
565 (void)ungetc(ch, fp);
566 break;
567 }
568 }
569 }
570 {
571 /* XXX: does this work on Win/Win64? (see posix_fstat) */
572 struct stat sb;
573 if (fstat(fileno(fp), &sb) == 0 &&
574 S_ISDIR(sb.st_mode)) {
575 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
Christian Heimes5cc3f262008-01-18 08:53:45 +0000576 fclose(fp);
Nick Coghlan327a39b2007-11-18 11:56:28 +0000577 return 1;
578 }
579 }
580 }
581
582 if (sts==-1) {
583 sts = PyRun_AnyFileExFlags(
584 fp,
585 filename == NULL ? "<stdin>" : filename,
586 filename != NULL, &cf) != 0;
587 }
588
Guido van Rossum667d7041995-08-04 04:20:48 +0000589 }
590
Barry Warsawd86dcd32003-06-29 17:07:06 +0000591 /* Check this environment variable at the end, to give programs the
592 * opportunity to set it from Python.
593 */
Georg Brandl49aafc92007-03-07 00:34:46 +0000594 if (!Py_InspectFlag &&
Barry Warsawd86dcd32003-06-29 17:07:06 +0000595 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
596 {
Georg Brandl49aafc92007-03-07 00:34:46 +0000597 Py_InspectFlag = 1;
Barry Warsawd86dcd32003-06-29 17:07:06 +0000598 }
599
Georg Brandl49aafc92007-03-07 00:34:46 +0000600 if (Py_InspectFlag && stdin_is_interactive &&
601 (filename != NULL || command != NULL || module != NULL)) {
602 Py_InspectFlag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000603 /* XXX */
604 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Georg Brandl49aafc92007-03-07 00:34:46 +0000605 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000606
Martin v. Löwis7b7c9d42007-01-04 21:06:12 +0000607 WaitForThreadShutdown();
608
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000609 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000610#ifdef RISCOS
Fred Drake5134a542002-10-17 20:37:50 +0000611 if (Py_RISCOSWimpFlag)
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000612 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
613#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000614
615#ifdef __INSURE__
616 /* Insure++ is a memory analysis tool that aids in discovering
617 * memory leaks and other memory problems. On Python exit, the
618 * interned string dictionary is flagged as being in use at exit
619 * (which it is). Under normal circumstances, this is fine because
620 * the memory will be automatically reclaimed by the system. Under
621 * memory debugging, it's a huge source of useless noise, so we
622 * trade off slower shutdown for less distraction in the memory
623 * reports. -baw
624 */
625 _Py_ReleaseInternedStrings();
626#endif /* __INSURE__ */
627
Guido van Rossum05f7c501997-08-02 03:00:42 +0000628 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000629}
630
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000631/* this is gonna seem *real weird*, but if you put some other code between
632 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
633 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000634
Guido van Rossum667d7041995-08-04 04:20:48 +0000635/* Make the *original* argc/argv available to other modules.
636 This is rare, but it is needed by the secureware extension. */
637
638void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000639Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000640{
641 *argc = orig_argc;
642 *argv = orig_argv;
643}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000644
645#ifdef __cplusplus
646}
647#endif
648