blob: ef9b24508ca22fba776e3e98ca24f29c26cd9f7f [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 */
Barry Warsaw1e13eb02012-02-20 20:42:21 -050043#define BASE_OPTS "3bBc:dEhiJm:OQ:RsStuUvVW: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\
Barry Warsaw1e13eb02012-02-20 20:42:21 -050074-R : use a pseudo-random salt to make hash() values of various types be\n\
75 unpredictable between separate invocations of the interpreter, as\n\
76 a defense against denial-of-service attacks\n\
Guido van Rossum1832de42001-09-04 03:51:09 +000077-Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\
Christian Heimesaf748c32008-05-06 22:41:46 +000078-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000079-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000080-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000081";
82static char *usage_3 = "\
Georg Brandl2da0fce2008-01-07 17:09:35 +000083-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000084 see man page for details on internal buffering relating to '-u'\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000085-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
86 can be supplied multiple times to increase verbosity\n\
Georg Brandl9dceedb2006-07-12 15:31:17 +000087-V : print the Python version number and exit (also --version)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000088-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenveyaebbaeb2010-04-06 23:24:45 +000089 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000090-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Georg Brandl2da0fce2008-01-07 17:09:35 +000091";
92static char *usage_4 = "\
Benjamin Petersonf902a942009-01-09 03:07:27 +000093-3 : warn about Python 3.x incompatibilities that 2to3 cannot trivially fix\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000094file : program read from script file\n\
95- : program read from stdin (default; interactive mode if a tty)\n\
Andrew M. Kuchlinge2782bb2006-09-14 11:28:50 +000096arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000097Other environment variables:\n\
98PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000099PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000100 default module search path. The result is sys.path.\n\
Georg Brandl2da0fce2008-01-07 17:09:35 +0000101";
102static char *usage_5 = "\
Guido van Rossuma075ce11997-12-05 21:56:45 +0000103PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
104 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +0000105PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Martin v. Löwis99815892008-06-01 07:20:46 +0000106PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000107";
Barry Warsaw1e13eb02012-02-20 20:42:21 -0500108static char *usage_6 = "\
Georg Brandl3aec5682012-02-21 22:36:27 +0100109PYTHONHASHSEED: if this variable is set to 'random', the effect is the same\n\
110 as specifying the -R option: a random value is used to seed the hashes of\n\
111 str, bytes and datetime objects. It can also be set to an integer\n\
Barry Warsaw1e13eb02012-02-20 20:42:21 -0500112 in the range [0,4294967295] to get hash values with a predictable seed.\n\
113";
Guido van Rossum667d7041995-08-04 04:20:48 +0000114
115
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000116static int
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000117usage(int exitcode, char* program)
118{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000119 FILE *f = exitcode ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000120
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000121 fprintf(f, usage_line, program);
122 if (exitcode)
123 fprintf(f, "Try `python -h' for more information.\n");
124 else {
125 fputs(usage_1, f);
126 fputs(usage_2, f);
127 fputs(usage_3, f);
128 fprintf(f, usage_4, DELIM);
129 fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
Barry Warsaw1e13eb02012-02-20 20:42:21 -0500130 fputs(usage_6, f);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000131 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000132#if defined(__VMS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000133 if (exitcode == 0) {
134 /* suppress 'error' message */
135 return 1;
136 }
137 else {
138 /* STS$M_INHIB_MSG + SS$_ABORT */
139 return 0x1000002c;
140 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000141#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000142 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000143#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000144 /*NOTREACHED*/
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000145}
146
Martin v. Löwis6caea372003-11-18 19:46:25 +0000147static void RunStartupFile(PyCompilerFlags *cf)
148{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000149 char *startup = Py_GETENV("PYTHONSTARTUP");
150 if (startup != NULL && startup[0] != '\0') {
151 FILE *fp = fopen(startup, "r");
152 if (fp != NULL) {
153 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
154 PyErr_Clear();
155 fclose(fp);
156 } else {
157 int save_errno;
158 save_errno = errno;
159 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
160 errno = save_errno;
161 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
162 startup);
163 PyErr_Print();
164 PyErr_Clear();
165 }
166 }
Martin v. Löwis6caea372003-11-18 19:46:25 +0000167}
168
Nick Coghlane2ebb2d2006-03-15 11:00:26 +0000169
Nick Coghlan327a39b2007-11-18 11:56:28 +0000170static int RunModule(char *module, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000171{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000172 PyObject *runpy, *runmodule, *runargs, *result;
173 runpy = PyImport_ImportModule("runpy");
174 if (runpy == NULL) {
175 fprintf(stderr, "Could not import runpy module\n");
176 return -1;
177 }
178 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
179 if (runmodule == NULL) {
180 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
181 Py_DECREF(runpy);
182 return -1;
183 }
184 runargs = Py_BuildValue("(si)", module, set_argv0);
185 if (runargs == NULL) {
186 fprintf(stderr,
187 "Could not create arguments for runpy._run_module_as_main\n");
188 Py_DECREF(runpy);
189 Py_DECREF(runmodule);
190 return -1;
191 }
192 result = PyObject_Call(runmodule, runargs, NULL);
193 if (result == NULL) {
194 PyErr_Print();
195 }
196 Py_DECREF(runpy);
197 Py_DECREF(runmodule);
198 Py_DECREF(runargs);
199 if (result == NULL) {
200 return -1;
201 }
202 Py_DECREF(result);
203 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000204}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000205
Nick Coghlan327a39b2007-11-18 11:56:28 +0000206static int RunMainFromImporter(char *filename)
207{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000208 PyObject *argv0 = NULL, *importer = NULL;
Nick Coghlan327a39b2007-11-18 11:56:28 +0000209
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000210 if ((argv0 = PyString_FromString(filename)) &&
211 (importer = PyImport_GetImporter(argv0)) &&
212 (importer->ob_type != &PyNullImporter_Type))
213 {
214 /* argv0 is usable as an import source, so
215 put it in sys.path[0] and import __main__ */
216 PyObject *sys_path = NULL;
217 if ((sys_path = PySys_GetObject("path")) &&
218 !PyList_SetItem(sys_path, 0, argv0))
219 {
220 Py_INCREF(argv0);
221 Py_DECREF(importer);
222 sys_path = NULL;
223 return RunModule("__main__", 0) != 0;
224 }
225 }
226 Py_XDECREF(argv0);
227 Py_XDECREF(importer);
228 if (PyErr_Occurred()) {
229 PyErr_Print();
230 return 1;
231 }
232 return -1;
Nick Coghlan327a39b2007-11-18 11:56:28 +0000233}
234
235
Guido van Rossum667d7041995-08-04 04:20:48 +0000236/* Main program */
237
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000238int
Fredrik Lundh620f3772000-07-09 20:42:34 +0000239Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000240{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000241 int c;
242 int sts;
243 char *command = NULL;
244 char *filename = NULL;
245 char *module = NULL;
246 FILE *fp = stdin;
247 char *p;
248 int unbuffered = 0;
249 int skipfirstline = 0;
250 int stdin_is_interactive = 0;
251 int help = 0;
252 int version = 0;
253 int saw_unbuffered_flag = 0;
254 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000255
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000256 cf.cf_flags = 0;
Guido van Rossum393661d2001-08-31 17:40:15 +0000257
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000258 orig_argc = argc; /* For Py_GetArgcArgv() */
259 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000260
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000261#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000262 Py_RISCOSWimpFlag = 0;
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000263#endif
264
Antoine Pitroucc3fa882012-02-21 20:42:48 +0100265 /* Hash randomization needed early for all string operations
266 (including -W and -X options). */
Ezio Melottiec6486d2012-11-23 18:46:11 +0200267 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
Antoine Pitroucc3fa882012-02-21 20:42:48 +0100268 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
269 if (c == 'm' || c == 'c') {
270 /* -c / -m is the last option: following arguments are
271 not interpreter options. */
272 break;
273 }
274 switch (c) {
275 case 'E':
276 Py_IgnoreEnvironmentFlag++;
277 break;
278 case 'R':
279 Py_HashRandomizationFlag++;
280 break;
281 }
282 }
283 /* The variable is only tested for existence here; _PyRandom_Init will
284 check its value further. */
285 if (!Py_HashRandomizationFlag &&
286 (p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
287 Py_HashRandomizationFlag = 1;
288
289 _PyRandom_Init();
290
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000291 PySys_ResetWarnOptions();
Antoine Pitroucc3fa882012-02-21 20:42:48 +0100292 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000293
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000294 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
295 if (c == 'c') {
296 /* -c is the last option; following arguments
297 that look like options are left for the
298 command to interpret. */
299 command = (char *)malloc(strlen(_PyOS_optarg) + 2);
300 if (command == NULL)
301 Py_FatalError(
302 "not enough memory to copy -c argument");
303 strcpy(command, _PyOS_optarg);
304 strcat(command, "\n");
305 break;
306 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000307
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000308 if (c == 'm') {
309 /* -m is the last option; following arguments
310 that look like options are left for the
311 module to interpret. */
312 module = (char *)malloc(strlen(_PyOS_optarg) + 2);
313 if (module == NULL)
314 Py_FatalError(
315 "not enough memory to copy -m argument");
316 strcpy(module, _PyOS_optarg);
317 break;
318 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000319
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000320 switch (c) {
321 case 'b':
322 Py_BytesWarningFlag++;
323 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000324
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000325 case 'd':
326 Py_DebugFlag++;
327 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000328
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000329 case '3':
330 Py_Py3kWarningFlag++;
331 if (!Py_DivisionWarningFlag)
332 Py_DivisionWarningFlag = 1;
333 break;
Neal Norwitz8b2bfbc2007-05-23 06:35:32 +0000334
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000335 case 'Q':
336 if (strcmp(_PyOS_optarg, "old") == 0) {
337 Py_DivisionWarningFlag = 0;
338 break;
339 }
340 if (strcmp(_PyOS_optarg, "warn") == 0) {
341 Py_DivisionWarningFlag = 1;
342 break;
343 }
344 if (strcmp(_PyOS_optarg, "warnall") == 0) {
345 Py_DivisionWarningFlag = 2;
346 break;
347 }
348 if (strcmp(_PyOS_optarg, "new") == 0) {
349 /* This only affects __main__ */
350 cf.cf_flags |= CO_FUTURE_DIVISION;
351 /* And this tells the eval loop to treat
352 BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
353 _Py_QnewFlag = 1;
354 break;
355 }
356 fprintf(stderr,
357 "-Q option should be `-Qold', "
358 "`-Qwarn', `-Qwarnall', or `-Qnew' only\n");
359 return usage(2, argv[0]);
360 /* NOTREACHED */
Guido van Rossum393661d2001-08-31 17:40:15 +0000361
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000362 case 'i':
363 Py_InspectFlag++;
364 Py_InteractiveFlag++;
365 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000366
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000367 /* case 'J': reserved for Jython */
Christian Heimes7a98d272008-04-12 13:03:03 +0000368
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000369 case 'O':
370 Py_OptimizeFlag++;
371 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000372
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000373 case 'B':
374 Py_DontWriteBytecodeFlag++;
375 break;
Georg Brandl2da0fce2008-01-07 17:09:35 +0000376
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000377 case 's':
378 Py_NoUserSiteDirectory++;
379 break;
Christian Heimesaf748c32008-05-06 22:41:46 +0000380
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000381 case 'S':
382 Py_NoSiteFlag++;
383 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000384
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000385 case 'E':
Antoine Pitroucc3fa882012-02-21 20:42:48 +0100386 /* Already handled above */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000387 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000388
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000389 case 't':
390 Py_TabcheckFlag++;
391 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000392
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000393 case 'u':
394 unbuffered++;
395 saw_unbuffered_flag = 1;
396 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000397
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000398 case 'v':
399 Py_VerboseFlag++;
400 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000401
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000402#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000403 case 'w':
404 Py_RISCOSWimpFlag = 1;
405 break;
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000406#endif
407
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000408 case 'x':
409 skipfirstline = 1;
410 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000411
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000412 /* case 'X': reserved for implementation-specific arguments */
Christian Heimes7a98d272008-04-12 13:03:03 +0000413
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000414 case 'U':
415 Py_UnicodeFlag++;
416 break;
417 case 'h':
418 case '?':
419 help++;
420 break;
421 case 'V':
422 version++;
423 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000424
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000425 case 'W':
426 PySys_AddWarnOption(_PyOS_optarg);
427 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000428
Barry Warsaw1e13eb02012-02-20 20:42:21 -0500429 case 'R':
Antoine Pitroucc3fa882012-02-21 20:42:48 +0100430 /* Already handled above */
Barry Warsaw1e13eb02012-02-20 20:42:21 -0500431 break;
432
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000433 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000434
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000435 default:
436 return usage(2, argv[0]);
437 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000438
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000439 }
440 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000441
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000442 if (help)
443 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000444
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000445 if (version) {
446 fprintf(stderr, "Python %s\n", PY_VERSION);
447 return 0;
448 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000449
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000450 if (Py_Py3kWarningFlag && !Py_TabcheckFlag)
451 /* -3 implies -t (but not -tt) */
452 Py_TabcheckFlag = 1;
Georg Brandl3c4a5462009-04-12 12:08:12 +0000453
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000454 if (!Py_InspectFlag &&
455 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
456 Py_InspectFlag = 1;
457 if (!saw_unbuffered_flag &&
458 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
459 unbuffered = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000460
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000461 if (!Py_NoUserSiteDirectory &&
462 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
463 Py_NoUserSiteDirectory = 1;
Christian Heimesaf748c32008-05-06 22:41:46 +0000464
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
466 char *buf, *warning;
Philip Jenveycdd98fb2010-04-10 20:27:15 +0000467
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000468 buf = (char *)malloc(strlen(p) + 1);
469 if (buf == NULL)
470 Py_FatalError(
471 "not enough memory to copy PYTHONWARNINGS");
472 strcpy(buf, p);
473 for (warning = strtok(buf, ",");
474 warning != NULL;
475 warning = strtok(NULL, ","))
476 PySys_AddWarnOption(warning);
477 free(buf);
478 }
Philip Jenveyaebbaeb2010-04-06 23:24:45 +0000479
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000480 if (command == NULL && module == NULL && _PyOS_optind < argc &&
481 strcmp(argv[_PyOS_optind], "-") != 0)
482 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000483#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000484 filename = decc$translate_vms(argv[_PyOS_optind]);
485 if (filename == (char *)0 || filename == (char *)-1)
486 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000487
488#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000489 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000490#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000491 }
Guido van Rossum775af911997-02-14 19:50:32 +0000492
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000493 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000494
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000495 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000496#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000497 _setmode(fileno(stdin), O_BINARY);
498 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000499#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000500#ifdef HAVE_SETVBUF
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000501 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
502 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
503 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000504#else /* !HAVE_SETVBUF */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000505 setbuf(stdin, (char *)NULL);
506 setbuf(stdout, (char *)NULL);
507 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000508#endif /* !HAVE_SETVBUF */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000509 }
510 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000511#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000512 /* Doesn't have to have line-buffered -- use unbuffered */
513 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
514 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000515#else /* !MS_WINDOWS */
516#ifdef HAVE_SETVBUF
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000517 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
518 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000519#endif /* HAVE_SETVBUF */
520#endif /* !MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000521 /* Leave stderr alone - it should be unbuffered anyway. */
522 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000523#ifdef __VMS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000524 else {
525 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
526 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000527#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000528
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000529#ifdef __APPLE__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 /* On MacOS X, when the Python interpreter is embedded in an
531 application bundle, it gets executed by a bootstrapping script
532 that does os.execve() with an argv[0] that's different from the
533 actual Python executable. This is needed to keep the Finder happy,
534 or rather, to work around Apple's overly strict requirements of
535 the process name. However, we still need a usable sys.executable,
536 so the actual executable path is passed in an environment variable.
537 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
538 script. */
539 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
540 Py_SetProgramName(p);
541 else
542 Py_SetProgramName(argv[0]);
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000543#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000544 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000545#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000546 Py_Initialize();
Guido van Rossumed52aac1997-07-19 19:20:32 +0000547
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000548 if (Py_VerboseFlag ||
549 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
550 fprintf(stderr, "Python %s on %s\n",
551 Py_GetVersion(), Py_GetPlatform());
552 if (!Py_NoSiteFlag)
553 fprintf(stderr, "%s\n", COPYRIGHT);
554 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000555
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000556 if (command != NULL) {
557 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
558 _PyOS_optind--;
559 argv[_PyOS_optind] = "-c";
560 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000561
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 if (module != NULL) {
Nick Coghlan8842c352010-06-13 06:50:39 +0000563 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
564 so that PySys_SetArgv correctly sets sys.path[0] to ''
565 rather than looking for a file called "-m". See
566 tracker issue #8202 for details. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000567 _PyOS_optind--;
Nick Coghlan8842c352010-06-13 06:50:39 +0000568 argv[_PyOS_optind] = "-c";
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000569 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000570
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000571 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000572
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000573 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
574 isatty(fileno(stdin))) {
575 PyObject *v;
576 v = PyImport_ImportModule("readline");
577 if (v == NULL)
578 PyErr_Clear();
579 else
580 Py_DECREF(v);
581 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000582
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 if (command) {
584 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
585 free(command);
586 } else if (module) {
Senthil Kumaran3b30b192012-07-04 19:50:29 -0700587 sts = (RunModule(module, 1) != 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000588 free(module);
589 }
590 else {
Nick Coghlan327a39b2007-11-18 11:56:28 +0000591
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 if (filename == NULL && stdin_is_interactive) {
593 Py_InspectFlag = 0; /* do exit on SystemExit */
594 RunStartupFile(&cf);
595 }
596 /* XXX */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000597
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000598 sts = -1; /* keep track of whether we've already run __main__ */
Nick Coghlan327a39b2007-11-18 11:56:28 +0000599
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000600 if (filename != NULL) {
601 sts = RunMainFromImporter(filename);
602 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000603
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000604 if (sts==-1 && filename!=NULL) {
605 if ((fp = fopen(filename, "r")) == NULL) {
606 fprintf(stderr, "%s: can't open file '%s': [Errno %d] %s\n",
607 argv[0], filename, errno, strerror(errno));
Brett Cannon10ed0f52008-03-18 15:35:58 +0000608
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000609 return 2;
610 }
611 else if (skipfirstline) {
612 int ch;
613 /* Push back first newline so line numbers
614 remain the same */
615 while ((ch = getc(fp)) != EOF) {
616 if (ch == '\n') {
617 (void)ungetc(ch, fp);
618 break;
619 }
620 }
621 }
622 {
623 /* XXX: does this work on Win/Win64? (see posix_fstat) */
624 struct stat sb;
625 if (fstat(fileno(fp), &sb) == 0 &&
626 S_ISDIR(sb.st_mode)) {
627 fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename);
628 fclose(fp);
629 return 1;
630 }
631 }
632 }
Nick Coghlan327a39b2007-11-18 11:56:28 +0000633
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000634 if (sts==-1) {
635 /* call pending calls like signal handlers (SIGINT) */
636 if (Py_MakePendingCalls() == -1) {
637 PyErr_Print();
638 sts = 1;
639 } else {
640 sts = PyRun_AnyFileExFlags(
641 fp,
642 filename == NULL ? "<stdin>" : filename,
643 filename != NULL, &cf) != 0;
644 }
645 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000646
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000647 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000648
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000649 /* Check this environment variable at the end, to give programs the
650 * opportunity to set it from Python.
651 */
652 if (!Py_InspectFlag &&
653 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
654 {
655 Py_InspectFlag = 1;
656 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000657
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000658 if (Py_InspectFlag && stdin_is_interactive &&
659 (filename != NULL || command != NULL || module != NULL)) {
660 Py_InspectFlag = 0;
661 /* XXX */
662 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
663 }
664
665 Py_Finalize();
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000666#ifdef RISCOS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000667 if (Py_RISCOSWimpFlag)
668 fprintf(stderr, "\x0cq\x0c"); /* make frontend quit */
Guido van Rossum3ed4c152001-03-02 06:18:03 +0000669#endif
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000670
671#ifdef __INSURE__
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000672 /* Insure++ is a memory analysis tool that aids in discovering
673 * memory leaks and other memory problems. On Python exit, the
674 * interned string dictionary is flagged as being in use at exit
675 * (which it is). Under normal circumstances, this is fine because
676 * the memory will be automatically reclaimed by the system. Under
677 * memory debugging, it's a huge source of useless noise, so we
678 * trade off slower shutdown for less distraction in the memory
679 * reports. -baw
680 */
681 _Py_ReleaseInternedStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000682#endif /* __INSURE__ */
683
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000684 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000685}
686
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000687/* this is gonna seem *real weird*, but if you put some other code between
688 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
689 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000690
Guido van Rossum667d7041995-08-04 04:20:48 +0000691/* Make the *original* argc/argv available to other modules.
692 This is rare, but it is needed by the secureware extension. */
693
694void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000695Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000696{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000697 *argc = orig_argc;
698 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000699}
Anthony Baxterac6bd462006-04-13 02:06:09 +0000700
701#ifdef __cplusplus
702}
703#endif
704