blob: 0ba01f79dbbfb4a21a10ba8021c8782b58cd7f78 [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 Heimesaf748c32008-05-06 22:41:46 +000043#define BASE_OPTS "3bBc:dEhiJm:OQ:sStuUvVW: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\
Christian Heimesaf748c32008-05-06 22:41:46 +000075-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000076-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000077-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000078";
79static char *usage_3 = "\
Georg Brandl2da0fce2008-01-07 17:09:35 +000080-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000081 see man page for details on internal buffering relating to '-u'\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000082-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
83 can be supplied multiple times to increase verbosity\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000084-V : print the Python version number and exit (also --version)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000085-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenveyaebbaeb2010-04-06 23:24:45 +000086 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000087-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Georg Brandl2da0fce2008-01-07 17:09:35 +000088";
89static char *usage_4 = "\
Benjamin Petersonf902a942009-01-09 03:07:27 +000090-3 : warn about Python 3.x incompatibilities that 2to3 cannot trivially fix\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000091file : program read from script file\n\
92- : program read from stdin (default; interactive mode if a tty)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000093arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000094Other environment variables:\n\
95PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000096PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000097 default module search path. The result is sys.path.\n\
Georg Brandl2da0fce2008-01-07 17:09:35 +000098";
99static char *usage_5 = "\
Guido van Rossuma075ce11997-12-05 21:56:45 +0000100PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
101 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +0000102PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Martin v. Löwis99815892008-06-01 07:20:46 +0000103PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000104";
105
106
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000107static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000108usage(int exitcode, char* program)
109{
Guido van Rossum393661d2001-08-31 17:40:15 +0000110 FILE *f = exitcode ? stderr : stdout;
111
112 fprintf(f, usage_line, program);
113 if (exitcode)
114 fprintf(f, "Try `python -h' for more information.\n");
115 else {
Alexandre Vassalotti0b5b8af2009-07-17 08:09:04 +0000116 fputs(usage_1, f);
117 fputs(usage_2, f);
118 fputs(usage_3, f);
Georg Brandl2da0fce2008-01-07 17:09:35 +0000119 fprintf(f, usage_4, DELIM);
120 fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
Guido van Rossum393661d2001-08-31 17:40:15 +0000121 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000122#if defined(__VMS)
123 if (exitcode == 0) {
124 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000125 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000126 }
127 else {
128 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000129 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000130 }
131#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000132 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000133#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000134 /*NOTREACHED*/
135}
136
Martin v. Löwis6caea372003-11-18 19:46:25 +0000137static void RunStartupFile(PyCompilerFlags *cf)
138{
139 char *startup = Py_GETENV("PYTHONSTARTUP");
140 if (startup != NULL && startup[0] != '\0') {
141 FILE *fp = fopen(startup, "r");
142 if (fp != NULL) {
143 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
144 PyErr_Clear();
145 fclose(fp);
Georg Brandl91e0cda2008-03-29 01:50:06 +0000146 } else {
147 int save_errno;
148 save_errno = errno;
149 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
150 errno = save_errno;
151 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
152 startup);
153 PyErr_Print();
154 PyErr_Clear();
Martin v. Löwis6caea372003-11-18 19:46:25 +0000155 }
156 }
157}
158
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000159
Nick Coghlan327a39b2007-11-18 11:56:28 +0000160static int RunModule(char *module, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000161{
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000162 PyObject *runpy, *runmodule, *runargs, *result;
163 runpy = PyImport_ImportModule("runpy");
164 if (runpy == NULL) {
165 fprintf(stderr, "Could not import runpy module\n");
166 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000167 }
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000168 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000169 if (runmodule == NULL) {
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000170 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000171 Py_DECREF(runpy);
172 return -1;
173 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000174 runargs = Py_BuildValue("(si)", module, set_argv0);
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000175 if (runargs == NULL) {
176 fprintf(stderr,
Nick Coghlan1a42ece2007-08-25 10:50:41 +0000177 "Could not create arguments for runpy._run_module_as_main\n");
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000178 Py_DECREF(runpy);
179 Py_DECREF(runmodule);
180 return -1;
181 }
182 result = PyObject_Call(runmodule, runargs, NULL);
183 if (result == NULL) {
184 PyErr_Print();
185 }
186 Py_DECREF(runpy);
187 Py_DECREF(runmodule);
188 Py_DECREF(runargs);
189 if (result == NULL) {
190 return -1;
191 }
192 Py_DECREF(result);
193 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000194}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000195
Nick Coghlan327a39b2007-11-18 11:56:28 +0000196static int RunMainFromImporter(char *filename)
197{
198 PyObject *argv0 = NULL, *importer = NULL;
199
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000200 if ((argv0 = PyString_FromString(filename)) &&
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000201 (importer = PyImport_GetImporter(argv0)) &&
202 (importer->ob_type != &PyNullImporter_Type))
Nick Coghlan327a39b2007-11-18 11:56:28 +0000203 {
204 /* argv0 is usable as an import source, so
205 put it in sys.path[0] and import __main__ */
206 PyObject *sys_path = NULL;
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000207 if ((sys_path = PySys_GetObject("path")) &&
208 !PyList_SetItem(sys_path, 0, argv0))
209 {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000210 Py_INCREF(argv0);
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000211 Py_DECREF(importer);
Nick Coghlan327a39b2007-11-18 11:56:28 +0000212 sys_path = NULL;
213 return RunModule("__main__", 0) != 0;
214 }
215 }
Nick Coghlan8c4592a2007-11-20 14:55:57 +0000216 Py_XDECREF(argv0);
217 Py_XDECREF(importer);
218 if (PyErr_Occurred()) {
219 PyErr_Print();
220 return 1;
221 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000222 return -1;
223}
224
225
Guido van Rossum667d7041995-08-04 04:20:48 +0000226/* Main program */
227
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000228int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000229Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000230{
231 int c;
232 int sts;
233 char *command = NULL;
234 char *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000235 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000236 FILE *fp = stdin;
237 char *p;
Guido van Rossum667d7041995-08-04 04:20:48 +0000238 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000239 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000240 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000241 int help = 0;
242 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000243 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000244 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000245
Guido van Rossum393661d2001-08-31 17:40:15 +0000246 cf.cf_flags = 0;
247
Guido van Rossumac56b031996-07-21 02:33:38 +0000248 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000249 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000250
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000251#ifdef RISCOS
252 Py_RISCOSWimpFlag = 0;
253#endif
254
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000255 PySys_ResetWarnOptions();
256
Guido van Rossumbceccf52001-04-10 22:07:43 +0000257 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000258 if (c == 'c') {
259 /* -c is the last option; following arguments
260 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000261 command to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000262 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
Guido van Rossum667d7041995-08-04 04:20:48 +0000263 if (command == NULL)
264 Py_FatalError(
265 "not enough memory to copy -c argument");
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000266 strcpy(command, _PyOS_optarg);
Guido van Rossum667d7041995-08-04 04:20:48 +0000267 strcat(command, "\n");
268 break;
269 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000270
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000271 if (c == 'm') {
272 /* -m is the last option; following arguments
273 that look like options are left for the
274 module to interpret. */
Anthony Baxter64182fe2006-04-11 12:14:09 +0000275 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000276 if (module == NULL)
277 Py_FatalError(
278 "not enough memory to copy -m argument");
279 strcpy(module, _PyOS_optarg);
280 break;
281 }
282
Guido van Rossum667d7041995-08-04 04:20:48 +0000283 switch (c) {
Christian Heimes1a6387e2008-03-26 12:49:49 +0000284 case 'b':
285 Py_BytesWarningFlag++;
286 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000287
288 case 'd':
289 Py_DebugFlag++;
290 break;
291
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000292 case '3':
293 Py_Py3kWarningFlag++;
Raymond Hettinger08259e82009-02-18 23:10:19 +0000294 if (!Py_DivisionWarningFlag)
295 Py_DivisionWarningFlag = 1;
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000296 break;
297
Guido van Rossum61c345f2001-09-04 03:26:15 +0000298 case 'Q':
Guido van Rossum393661d2001-08-31 17:40:15 +0000299 if (strcmp(_PyOS_optarg, "old") == 0) {
300 Py_DivisionWarningFlag = 0;
301 break;
302 }
303 if (strcmp(_PyOS_optarg, "warn") == 0) {
Guido van Rossum1832de42001-09-04 03:51:09 +0000304 Py_DivisionWarningFlag = 1;
305 break;
306 }
307 if (strcmp(_PyOS_optarg, "warnall") == 0) {
308 Py_DivisionWarningFlag = 2;
Guido van Rossum393661d2001-08-31 17:40:15 +0000309 break;
310 }
311 if (strcmp(_PyOS_optarg, "new") == 0) {
Tim Peters3caca232001-12-06 06:23:26 +0000312 /* This only affects __main__ */
Guido van Rossum393661d2001-08-31 17:40:15 +0000313 cf.cf_flags |= CO_FUTURE_DIVISION;
Tim Peters3caca232001-12-06 06:23:26 +0000314 /* And this tells the eval loop to treat
315 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
316 _Py_QnewFlag = 1;
Guido van Rossum393661d2001-08-31 17:40:15 +0000317 break;
318 }
319 fprintf(stderr,
Guido van Rossum1832de42001-09-04 03:51:09 +0000320 "-Q option should be `-Qold', "
321 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000322 return usage(2, argv[0]);
Guido van Rossum393661d2001-08-31 17:40:15 +0000323 /* NOTREACHED */
324
Guido van Rossum667d7041995-08-04 04:20:48 +0000325 case 'i':
Georg Brandl49aafc92007-03-07 00:34:46 +0000326 Py_InspectFlag++;
Guido van Rossum775af911997-02-14 19:50:32 +0000327 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000328 break;
329
Christian Heimes7a98d272008-04-12 13:03:03 +0000330 /* case 'J': reserved for Jython */
331
Guido van Rossum7614da61997-03-03 19:14:45 +0000332 case 'O':
333 Py_OptimizeFlag++;
334 break;
335
Georg Brandl2da0fce2008-01-07 17:09:35 +0000336 case 'B':
337 Py_DontWriteBytecodeFlag++;
338 break;
339
Christian Heimesaf748c32008-05-06 22:41:46 +0000340 case 's':
341 Py_NoUserSiteDirectory++;
342 break;
343
Guido van Rossum7922bd71997-08-29 22:34:47 +0000344 case 'S':
345 Py_NoSiteFlag++;
346 break;
347
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000348 case 'E':
349 Py_IgnoreEnvironmentFlag++;
350 break;
351
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000352 case 't':
353 Py_TabcheckFlag++;
354 break;
355
Guido van Rossum667d7041995-08-04 04:20:48 +0000356 case 'u':
357 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000358 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000359 break;
360
361 case 'v':
362 Py_VerboseFlag++;
363 break;
364
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000365#ifdef RISCOS
366 case 'w':
367 Py_RISCOSWimpFlag = 1;
368 break;
369#endif
370
Guido van Rossuma075ce11997-12-05 21:56:45 +0000371 case 'x':
372 skipfirstline = 1;
373 break;
374
Georg Brandl41a0a372008-04-13 20:50:29 +0000375 /* case 'X': reserved for implementation-specific arguments */
Christian Heimes7a98d272008-04-12 13:03:03 +0000376
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000377 case 'U':
378 Py_UnicodeFlag++;
379 break;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000380 case 'h':
Georg Brandl9dceedb2006-07-12 15:31:17 +0000381 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000382 help++;
383 break;
384 case 'V':
385 version++;
386 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000387
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000388 case 'W':
389 PySys_AddWarnOption(_PyOS_optarg);
390 break;
391
Guido van Rossum667d7041995-08-04 04:20:48 +0000392 /* This space reserved for other options */
393
394 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000395 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000396 /*NOTREACHED*/
397
398 }
399 }
400
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000401 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000402 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000403
404 if (version) {
405 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000406 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000407 }
408
Georg Brandl3c4a5462009-04-12 12:08:12 +0000409 if (Py_Py3kWarningFlag && !Py_TabcheckFlag)
410 /* -3 implies -t (but not -tt) */
411 Py_TabcheckFlag = 1;
412
Georg Brandl49aafc92007-03-07 00:34:46 +0000413 if (!Py_InspectFlag &&
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000414 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
Georg Brandl49aafc92007-03-07 00:34:46 +0000415 Py_InspectFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000416 if (!saw_unbuffered_flag &&
417 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
418 unbuffered = 1;
419
Christian Heimesaf748c32008-05-06 22:41:46 +0000420 if (!Py_NoUserSiteDirectory &&
421 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
422 Py_NoUserSiteDirectory = 1;
423
Philip Jenveyaebbaeb2010-04-06 23:24:45 +0000424 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0')
425 {
426 char* warning = strtok(p, ",");
427 while (warning != NULL)
428 {
429 PySys_AddWarnOption(warning);
430 warning = strtok(NULL, ",");
431 }
432 }
433
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000434 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000435 strcmp(argv[_PyOS_optind], "-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000436 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000437#ifdef __VMS
438 filename = decc$translate_vms(argv[_PyOS_optind]);
439 if (filename == (char *)0 || filename == (char *)-1)
440 filename = argv[_PyOS_optind];
441
442#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000443 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000444#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000445 }
446
447 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
448
Guido van Rossum667d7041995-08-04 04:20:48 +0000449 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000450#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000451 _setmode(fileno(stdin), O_BINARY);
452 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000453#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000454#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000455 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
456 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
457 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000458#else /* !HAVE_SETVBUF */
459 setbuf(stdin, (char *)NULL);
460 setbuf(stdout, (char *)NULL);
461 setbuf(stderr, (char *)NULL);
462#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000463 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000464 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000465#ifdef MS_WINDOWS
466 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000467 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000468 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000469#else /* !MS_WINDOWS */
470#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000471 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
472 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000473#endif /* HAVE_SETVBUF */
474#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000475 /* Leave stderr alone - it should be unbuffered anyway. */
476 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000477#ifdef __VMS
478 else {
479 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
480 }
481#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000482
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000483#ifdef __APPLE__
484 /* On MacOS X, when the Python interpreter is embedded in an
485 application bundle, it gets executed by a bootstrapping script
486 that does os.execve() with an argv[0] that's different from the
487 actual Python executable. This is needed to keep the Finder happy,
488 or rather, to work around Apple's overly strict requirements of
489 the process name. However, we still need a usable sys.executable,
490 so the actual executable path is passed in an environment variable.
491 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
492 script. */
493 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
494 Py_SetProgramName(p);
495 else
496 Py_SetProgramName(argv[0]);
497#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000498 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000499#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000500 Py_Initialize();
501
Guido van Rossum667d7041995-08-04 04:20:48 +0000502 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000503 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000504 fprintf(stderr, "Python %s on %s\n",
505 Py_GetVersion(), Py_GetPlatform());
506 if (!Py_NoSiteFlag)
507 fprintf(stderr, "%s\n", COPYRIGHT);
508 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000509
Guido van Rossum667d7041995-08-04 04:20:48 +0000510 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000511 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
512 _PyOS_optind--;
513 argv[_PyOS_optind] = "-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000514 }
515
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000516 if (module != NULL) {
Nick Coghlan81f444b2006-06-12 10:17:11 +0000517 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
518 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000519 _PyOS_optind--;
Nick Coghlan81f444b2006-06-12 10:17:11 +0000520 argv[_PyOS_optind] = "-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000521 }
522
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000523 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000524
Georg Brandl49aafc92007-03-07 00:34:46 +0000525 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000526 isatty(fileno(stdin))) {
527 PyObject *v;
528 v = PyImport_ImportModule("readline");
529 if (v == NULL)
530 PyErr_Clear();
531 else
532 Py_DECREF(v);
533 }
534
Guido van Rossum667d7041995-08-04 04:20:48 +0000535 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000536 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000537 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000538 } else if (module) {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000539 sts = RunModule(module, 1);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000540 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000541 }
542 else {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000543
Guido van Rossum775af911997-02-14 19:50:32 +0000544 if (filename == NULL && stdin_is_interactive) {
Georg Brandl49aafc92007-03-07 00:34:46 +0000545 Py_InspectFlag = 0; /* do exit on SystemExit */
Martin v. Löwis6caea372003-11-18 19:46:25 +0000546 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000547 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000548 /* XXX */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000549
550 sts = -1; /* keep track of whether we've already run __main__ */
551
552 if (filename != NULL) {
553 sts = RunMainFromImporter(filename);
554 }
555
556 if (sts==-1 && filename!=NULL) {
557 if ((fp = fopen(filename, "r")) == NULL) {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000558 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
559 argv[0], filename, errno, strerror(errno));
Brett Cannon10ed0f52008-03-18 15:35:58 +0000560
Nick Coghlan327a39b2007-11-18 11:56:28 +0000561 return 2;
562 }
563 else if (skipfirstline) {
564 int ch;
565 /* Push back first newline so line numbers
566 remain the same */
567 while ((ch = getc(fp)) != EOF) {
568 if (ch == '\n') {
569 (void)ungetc(ch, fp);
570 break;
571 }
572 }
573 }
574 {
575 /* XXX: does this work on Win/Win64? (see posix_fstat) */
576 struct stat sb;
577 if (fstat(fileno(fp), &sb) == 0 &&
578 S_ISDIR(sb.st_mode)) {
579 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
Christian Heimes5cc3f262008-01-18 08:53:45 +0000580 fclose(fp);
Nick Coghlan327a39b2007-11-18 11:56:28 +0000581 return 1;
582 }
583 }
584 }
585
586 if (sts==-1) {
Victor Stinner66644262010-03-10 22:30:19 +0000587 /* call pending calls like signal handlers (SIGINT) */
588 if (Py_MakePendingCalls() == -1) {
589 PyErr_Print();
590 sts = 1;
591 } else {
592 sts = PyRun_AnyFileExFlags(
593 fp,
594 filename == NULL ? "<stdin>" : filename,
595 filename != NULL, &cf) != 0;
596 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000597 }
598
Guido van Rossum667d7041995-08-04 04:20:48 +0000599 }
600
Barry Warsawd86dcd32003-06-29 17:07:06 +0000601 /* Check this environment variable at the end, to give programs the
602 * opportunity to set it from Python.
603 */
Georg Brandl49aafc92007-03-07 00:34:46 +0000604 if (!Py_InspectFlag &&
Barry Warsawd86dcd32003-06-29 17:07:06 +0000605 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
606 {
Georg Brandl49aafc92007-03-07 00:34:46 +0000607 Py_InspectFlag = 1;
Barry Warsawd86dcd32003-06-29 17:07:06 +0000608 }
609
Georg Brandl49aafc92007-03-07 00:34:46 +0000610 if (Py_InspectFlag && stdin_is_interactive &&
611 (filename != NULL || command != NULL || module != NULL)) {
612 Py_InspectFlag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000613 /* XXX */
614 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Georg Brandl49aafc92007-03-07 00:34:46 +0000615 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000616
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000617 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000618#ifdef RISCOS
Fred Drake5134a542002-10-17 20:37:50 +0000619 if (Py_RISCOSWimpFlag)
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000620 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
621#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000622
623#ifdef __INSURE__
624 /* Insure++ is a memory analysis tool that aids in discovering
625 * memory leaks and other memory problems. On Python exit, the
626 * interned string dictionary is flagged as being in use at exit
627 * (which it is). Under normal circumstances, this is fine because
628 * the memory will be automatically reclaimed by the system. Under
629 * memory debugging, it's a huge source of useless noise, so we
630 * trade off slower shutdown for less distraction in the memory
631 * reports. -baw
632 */
633 _Py_ReleaseInternedStrings();
634#endif /* __INSURE__ */
635
Guido van Rossum05f7c501997-08-02 03:00:42 +0000636 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000637}
638
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000639/* this is gonna seem *real weird*, but if you put some other code between
640 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
641 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000642
Guido van Rossum667d7041995-08-04 04:20:48 +0000643/* Make the *original* argc/argv available to other modules.
644 This is rare, but it is needed by the secureware extension. */
645
646void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000647Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000648{
649 *argc = orig_argc;
650 *argv = orig_argv;
651}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000652
653#ifdef __cplusplus
654}
655#endif
656