blob: a13d1663825db380bfc87e1cd223f41ae44609b7 [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{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000110 FILE *f = exitcode ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000111
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000112 fprintf(f, usage_line, program);
113 if (exitcode)
114 fprintf(f, "Try `python -h' for more information.\n");
115 else {
116 fputs(usage_1, f);
117 fputs(usage_2, f);
118 fputs(usage_3, f);
119 fprintf(f, usage_4, DELIM);
120 fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
121 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000122#if defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000123 if (exitcode == 0) {
124 /* suppress 'error' message */
125 return 1;
126 }
127 else {
128 /* STS$M_INHIB_MSG + SS$_ABORT */
129 return 0x1000002c;
130 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000131#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000132 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000133#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000134 /*NOTREACHED*/
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000135}
136
Martin v. Löwis6caea372003-11-18 19:46:25 +0000137static void RunStartupFile(PyCompilerFlags *cf)
138{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000139 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);
146 } 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();
155 }
156 }
Martin v. Löwis6caea372003-11-18 19:46:25 +0000157}
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{
Antoine Pitrouc83ea132010-05-09 14:46:46 +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;
167 }
168 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
169 if (runmodule == NULL) {
170 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
171 Py_DECREF(runpy);
172 return -1;
173 }
174 runargs = Py_BuildValue("(si)", module, set_argv0);
175 if (runargs == NULL) {
176 fprintf(stderr,
177 "Could not create arguments for runpy._run_module_as_main\n");
178 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{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000198 PyObject *argv0 = NULL, *importer = NULL;
Nick Coghlan327a39b2007-11-18 11:56:28 +0000199
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000200 if ((argv0 = PyString_FromString(filename)) &&
201 (importer = PyImport_GetImporter(argv0)) &&
202 (importer->ob_type != &PyNullImporter_Type))
203 {
204 /* argv0 is usable as an import source, so
205 put it in sys.path[0] and import __main__ */
206 PyObject *sys_path = NULL;
207 if ((sys_path = PySys_GetObject("path")) &&
208 !PyList_SetItem(sys_path, 0, argv0))
209 {
210 Py_INCREF(argv0);
211 Py_DECREF(importer);
212 sys_path = NULL;
213 return RunModule("__main__", 0) != 0;
214 }
215 }
216 Py_XDECREF(argv0);
217 Py_XDECREF(importer);
218 if (PyErr_Occurred()) {
219 PyErr_Print();
220 return 1;
221 }
222 return -1;
Nick Coghlan327a39b2007-11-18 11:56:28 +0000223}
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{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000231 int c;
232 int sts;
233 char *command = NULL;
234 char *filename = NULL;
235 char *module = NULL;
236 FILE *fp = stdin;
237 char *p;
238 int unbuffered = 0;
239 int skipfirstline = 0;
240 int stdin_is_interactive = 0;
241 int help = 0;
242 int version = 0;
243 int saw_unbuffered_flag = 0;
244 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000245
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000246 cf.cf_flags = 0;
Guido van Rossum393661d2001-08-31 17:40:15 +0000247
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000248 orig_argc = argc; /* For Py_GetArgcArgv() */
249 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000250
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000251#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000252 Py_RISCOSWimpFlag = 0;
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000253#endif
254
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000255 PySys_ResetWarnOptions();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000256
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000257 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
258 if (c == 'c') {
259 /* -c is the last option; following arguments
260 that look like options are left for the
261 command to interpret. */
262 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
263 if (command == NULL)
264 Py_FatalError(
265 "not enough memory to copy -c argument");
266 strcpy(command, _PyOS_optarg);
267 strcat(command, "\n");
268 break;
269 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000270
Antoine Pitrouc83ea132010-05-09 14:46:46 +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. */
275 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
276 if (module == NULL)
277 Py_FatalError(
278 "not enough memory to copy -m argument");
279 strcpy(module, _PyOS_optarg);
280 break;
281 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000282
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000283 switch (c) {
284 case 'b':
285 Py_BytesWarningFlag++;
286 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000287
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000288 case 'd':
289 Py_DebugFlag++;
290 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000291
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 case '3':
293 Py_Py3kWarningFlag++;
294 if (!Py_DivisionWarningFlag)
295 Py_DivisionWarningFlag = 1;
296 break;
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000297
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000298 case 'Q':
299 if (strcmp(_PyOS_optarg, "old") == 0) {
300 Py_DivisionWarningFlag = 0;
301 break;
302 }
303 if (strcmp(_PyOS_optarg, "warn") == 0) {
304 Py_DivisionWarningFlag = 1;
305 break;
306 }
307 if (strcmp(_PyOS_optarg, "warnall") == 0) {
308 Py_DivisionWarningFlag = 2;
309 break;
310 }
311 if (strcmp(_PyOS_optarg, "new") == 0) {
312 /* This only affects __main__ */
313 cf.cf_flags |= CO_FUTURE_DIVISION;
314 /* And this tells the eval loop to treat
315 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
316 _Py_QnewFlag = 1;
317 break;
318 }
319 fprintf(stderr,
320 "-Q option should be `-Qold', "
321 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
322 return usage(2, argv[0]);
323 /* NOTREACHED */
Guido van Rossum393661d2001-08-31 17:40:15 +0000324
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000325 case 'i':
326 Py_InspectFlag++;
327 Py_InteractiveFlag++;
328 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000329
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000330 /* case 'J': reserved for Jython */
Christian Heimes7a98d272008-04-12 13:03:03 +0000331
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000332 case 'O':
333 Py_OptimizeFlag++;
334 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000335
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000336 case 'B':
337 Py_DontWriteBytecodeFlag++;
338 break;
Georg Brandl2da0fce2008-01-07 17:09:35 +0000339
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000340 case 's':
341 Py_NoUserSiteDirectory++;
342 break;
Christian Heimesaf748c32008-05-06 22:41:46 +0000343
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000344 case 'S':
345 Py_NoSiteFlag++;
346 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000347
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000348 case 'E':
349 Py_IgnoreEnvironmentFlag++;
350 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000351
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000352 case 't':
353 Py_TabcheckFlag++;
354 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000355
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000356 case 'u':
357 unbuffered++;
358 saw_unbuffered_flag = 1;
359 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000360
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000361 case 'v':
362 Py_VerboseFlag++;
363 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000364
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000365#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 case 'w':
367 Py_RISCOSWimpFlag = 1;
368 break;
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000369#endif
370
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000371 case 'x':
372 skipfirstline = 1;
373 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000374
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000375 /* case 'X': reserved for implementation-specific arguments */
Christian Heimes7a98d272008-04-12 13:03:03 +0000376
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000377 case 'U':
378 Py_UnicodeFlag++;
379 break;
380 case 'h':
381 case '?':
382 help++;
383 break;
384 case 'V':
385 version++;
386 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000387
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000388 case 'W':
389 PySys_AddWarnOption(_PyOS_optarg);
390 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000391
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000392 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000393
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000394 default:
395 return usage(2, argv[0]);
396 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000397
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000398 }
399 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000400
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000401 if (help)
402 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000403
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000404 if (version) {
405 fprintf(stderr, "Python %s\n", PY_VERSION);
406 return 0;
407 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000408
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000409 if (Py_Py3kWarningFlag && !Py_TabcheckFlag)
410 /* -3 implies -t (but not -tt) */
411 Py_TabcheckFlag = 1;
Georg Brandl3c4a5462009-04-12 12:08:12 +0000412
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000413 if (!Py_InspectFlag &&
414 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
415 Py_InspectFlag = 1;
416 if (!saw_unbuffered_flag &&
417 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
418 unbuffered = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000419
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000420 if (!Py_NoUserSiteDirectory &&
421 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
422 Py_NoUserSiteDirectory = 1;
Christian Heimesaf748c32008-05-06 22:41:46 +0000423
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000424 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
425 char *buf, *warning;
Philip Jenveycdd98fb2010-04-10 20:27:15 +0000426
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000427 buf = (char *)malloc(strlen(p) + 1);
428 if (buf == NULL)
429 Py_FatalError(
430 "not enough memory to copy PYTHONWARNINGS");
431 strcpy(buf, p);
432 for (warning = strtok(buf, ",");
433 warning != NULL;
434 warning = strtok(NULL, ","))
435 PySys_AddWarnOption(warning);
436 free(buf);
437 }
Philip Jenveyaebbaeb2010-04-06 23:24:45 +0000438
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000439 if (command == NULL && module == NULL && _PyOS_optind < argc &&
440 strcmp(argv[_PyOS_optind], "-") != 0)
441 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000442#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000443 filename = decc$translate_vms(argv[_PyOS_optind]);
444 if (filename == (char *)0 || filename == (char *)-1)
445 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000446
447#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000448 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000449#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000450 }
Guido van Rossum775af911997-02-14 19:50:32 +0000451
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000452 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000453
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000454 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000455#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000456 _setmode(fileno(stdin), O_BINARY);
457 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000458#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000459#ifdef HAVE_SETVBUF
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000460 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
461 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
462 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000463#else /* !HAVE_SETVBUF */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000464 setbuf(stdin, (char *)NULL);
465 setbuf(stdout, (char *)NULL);
466 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000467#endif /* !HAVE_SETVBUF */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000468 }
469 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000470#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000471 /* Doesn't have to have line-buffered -- use unbuffered */
472 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
473 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000474#else /* !MS_WINDOWS */
475#ifdef HAVE_SETVBUF
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000476 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
477 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000478#endif /* HAVE_SETVBUF */
479#endif /* !MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000480 /* Leave stderr alone - it should be unbuffered anyway. */
481 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000482#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000483 else {
484 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
485 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000486#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000487
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000488#ifdef __APPLE__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000489 /* On MacOS X, when the Python interpreter is embedded in an
490 application bundle, it gets executed by a bootstrapping script
491 that does os.execve() with an argv[0] that's different from the
492 actual Python executable. This is needed to keep the Finder happy,
493 or rather, to work around Apple's overly strict requirements of
494 the process name. However, we still need a usable sys.executable,
495 so the actual executable path is passed in an environment variable.
496 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
497 script. */
498 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
499 Py_SetProgramName(p);
500 else
501 Py_SetProgramName(argv[0]);
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000502#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000503 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000504#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000505 Py_Initialize();
Guido van Rossumed52aac1997-07-19 19:20:32 +0000506
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000507 if (Py_VerboseFlag ||
508 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
509 fprintf(stderr, "Python %s on %s\n",
510 Py_GetVersion(), Py_GetPlatform());
511 if (!Py_NoSiteFlag)
512 fprintf(stderr, "%s\n", COPYRIGHT);
513 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000514
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000515 if (command != NULL) {
516 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
517 _PyOS_optind--;
518 argv[_PyOS_optind] = "-c";
519 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000520
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000521 if (module != NULL) {
Nick Coghlan8842c352010-06-13 06:50:39 +0000522 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
523 so that PySys_SetArgv correctly sets sys.path[0] to ''
524 rather than looking for a file called "-m". See
525 tracker issue #8202 for details. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000526 _PyOS_optind--;
Nick Coghlan8842c352010-06-13 06:50:39 +0000527 argv[_PyOS_optind] = "-c";
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000528 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000529
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000531
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
533 isatty(fileno(stdin))) {
534 PyObject *v;
535 v = PyImport_ImportModule("readline");
536 if (v == NULL)
537 PyErr_Clear();
538 else
539 Py_DECREF(v);
540 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000541
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000542 if (command) {
543 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
544 free(command);
545 } else if (module) {
546 sts = RunModule(module, 1);
547 free(module);
548 }
549 else {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000550
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000551 if (filename == NULL && stdin_is_interactive) {
552 Py_InspectFlag = 0; /* do exit on SystemExit */
553 RunStartupFile(&cf);
554 }
555 /* XXX */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000556
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000557 sts = -1; /* keep track of whether we've already run __main__ */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000558
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000559 if (filename != NULL) {
560 sts = RunMainFromImporter(filename);
561 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000562
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 if (sts==-1 && filename!=NULL) {
564 if ((fp = fopen(filename, "r")) == NULL) {
565 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
566 argv[0], filename, errno, strerror(errno));
Brett Cannon10ed0f52008-03-18 15:35:58 +0000567
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000568 return 2;
569 }
570 else if (skipfirstline) {
571 int ch;
572 /* Push back first newline so line numbers
573 remain the same */
574 while ((ch = getc(fp)) != EOF) {
575 if (ch == '\n') {
576 (void)ungetc(ch, fp);
577 break;
578 }
579 }
580 }
581 {
582 /* XXX: does this work on Win/Win64? (see posix_fstat) */
583 struct stat sb;
584 if (fstat(fileno(fp), &sb) == 0 &&
585 S_ISDIR(sb.st_mode)) {
586 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
587 fclose(fp);
588 return 1;
589 }
590 }
591 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000592
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000593 if (sts==-1) {
594 /* call pending calls like signal handlers (SIGINT) */
595 if (Py_MakePendingCalls() == -1) {
596 PyErr_Print();
597 sts = 1;
598 } else {
599 sts = PyRun_AnyFileExFlags(
600 fp,
601 filename == NULL ? "<stdin>" : filename,
602 filename != NULL, &cf) != 0;
603 }
604 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000605
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000607
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000608 /* Check this environment variable at the end, to give programs the
609 * opportunity to set it from Python.
610 */
611 if (!Py_InspectFlag &&
612 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
613 {
614 Py_InspectFlag = 1;
615 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000616
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000617 if (Py_InspectFlag && stdin_is_interactive &&
618 (filename != NULL || command != NULL || module != NULL)) {
619 Py_InspectFlag = 0;
620 /* XXX */
621 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
622 }
623
624 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000625#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000626 if (Py_RISCOSWimpFlag)
627 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000628#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000629
630#ifdef __INSURE__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000631 /* Insure++ is a memory analysis tool that aids in discovering
632 * memory leaks and other memory problems. On Python exit, the
633 * interned string dictionary is flagged as being in use at exit
634 * (which it is). Under normal circumstances, this is fine because
635 * the memory will be automatically reclaimed by the system. Under
636 * memory debugging, it's a huge source of useless noise, so we
637 * trade off slower shutdown for less distraction in the memory
638 * reports. -baw
639 */
640 _Py_ReleaseInternedStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000641#endif /* __INSURE__ */
642
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000643 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000644}
645
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000646/* this is gonna seem *real weird*, but if you put some other code between
647 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
648 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000649
Guido van Rossum667d7041995-08-04 04:20:48 +0000650/* Make the *original* argc/argv available to other modules.
651 This is rare, but it is needed by the secureware extension. */
652
653void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000654Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000655{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 *argc = orig_argc;
657 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000658}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000659
660#ifdef __cplusplus
661}
662#endif
663