blob: e2bfdb4458368643234abd87f321d2a76264ca94 [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"
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00005#include "import.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00006
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00007#ifdef __VMS
Martin v. Löwis7a924e62003-03-05 14:15:21 +00008#include <unixlib.h>
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00009#endif
10
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +000011#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +000012#include <windows.h>
Thomas Wouters477c8d52006-05-27 19:21:47 +000013#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000014#include <fcntl.h>
Martin v. Löwis790465f2008-04-05 20:41:37 +000015#define PATH_MAX MAXPATHLEN
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000016#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000017#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000018
Martin v. Löwis945362c2007-08-30 14:57:25 +000019#ifdef _MSC_VER
20#include <crtdbg.h>
21#endif
22
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000023#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000024#define PYTHONHOMEHELP "<prefix>\\lib"
25#else
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000026#if defined(PYOS_OS2) && defined(PYCC_GCC)
27#define PYTHONHOMEHELP "<prefix>/Lib"
28#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000029#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000030#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000031#endif
Guido van Rossuma075ce11997-12-05 21:56:45 +000032
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000033#include "pygetopt.h"
34
Guido van Rossuma22865e2000-09-05 04:41:18 +000035#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000036 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
37 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000038
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000039#ifdef __cplusplus
40extern "C" {
41#endif
42
Guido van Rossumac56b031996-07-21 02:33:38 +000043/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000044static wchar_t **orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000045static int orig_argc;
46
Guido van Rossumbceccf52001-04-10 22:07:43 +000047/* command line options */
Christian Heimes8dc226f2008-05-06 23:45:46 +000048#define BASE_OPTS L"bBc:dEhiJm:OsStuvVW:xX?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000049
Guido van Rossumbceccf52001-04-10 22:07:43 +000050#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000051
Guido van Rossum667d7041995-08-04 04:20:48 +000052/* Short usage message (with %s for argv0) */
53static char *usage_line =
Martin v. Löwis790465f2008-04-05 20:41:37 +000054"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000055
56/* Long usage message, split into parts < 512 bytes */
Guido van Rossum393661d2001-08-31 17:40:15 +000057static char *usage_1 = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000058Options and arguments (and corresponding environment variables):\n\
Guido van Rossum98297ee2007-11-06 21:34:58 +000059-b : issue warnings about str(bytes_instance), str(buffer_instance)\n\
60 and comparing bytes/buffer with str. (-bb: issue errors)\n\
Christian Heimes790c8232008-01-07 21:14:23 +000061-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000062-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000063-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000064-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000065-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000066";
67static char *usage_2 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000068-i : inspect interactively after running script; forces a prompt even\n\
69 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000070-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000071-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000072-OO : remove doc-strings in addition to the -O optimizations\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +000073-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000074-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000075";
76static char *usage_3 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000077-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000078 see man page for details on internal buffering relating to '-u'\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000079-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
80 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000081-V : print the Python version number and exit (also --version)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000082-W arg : warning control; arg is action:message:category:module:lineno\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000083-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000084";
Guido van Rossum393661d2001-08-31 17:40:15 +000085static char *usage_4 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000086file : program read from script file\n\
87- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000088arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000089Other environment variables:\n\
90PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000091PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000092 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000093";
94static char *usage_5 = "\
Guido van Rossuma075ce11997-12-05 21:56:45 +000095PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
96 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +000097PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Martin v. Löwis0f599892008-06-02 11:13:03 +000098PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000099";
100
Martin v. Löwis790465f2008-04-05 20:41:37 +0000101#ifndef MS_WINDOWS
102static FILE*
103_wfopen(const wchar_t *path, const wchar_t *mode)
104{
105 char cpath[PATH_MAX];
106 char cmode[10];
107 size_t r;
108 r = wcstombs(cpath, path, PATH_MAX);
109 if (r == (size_t)-1 || r >= PATH_MAX) {
110 errno = EINVAL;
111 return NULL;
112 }
113 r = wcstombs(cmode, mode, 10);
114 if (r == (size_t)-1 || r >= 10) {
115 errno = EINVAL;
116 return NULL;
117 }
118 return fopen(cpath, cmode);
119}
120#endif
121
Guido van Rossum667d7041995-08-04 04:20:48 +0000122
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000123static int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000124usage(int exitcode, wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000125{
Guido van Rossum393661d2001-08-31 17:40:15 +0000126 FILE *f = exitcode ? stderr : stdout;
127
128 fprintf(f, usage_line, program);
129 if (exitcode)
130 fprintf(f, "Try `python -h' for more information.\n");
131 else {
132 fprintf(f, usage_1);
133 fprintf(f, usage_2);
134 fprintf(f, usage_3);
Christian Heimes790c8232008-01-07 21:14:23 +0000135 fprintf(f, usage_4, DELIM);
136 fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
Guido van Rossum393661d2001-08-31 17:40:15 +0000137 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000138#if defined(__VMS)
139 if (exitcode == 0) {
140 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000141 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000142 }
143 else {
144 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000145 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000146 }
147#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000148 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000149#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000150 /*NOTREACHED*/
151}
152
Martin v. Löwis6caea372003-11-18 19:46:25 +0000153static void RunStartupFile(PyCompilerFlags *cf)
154{
155 char *startup = Py_GETENV("PYTHONSTARTUP");
156 if (startup != NULL && startup[0] != '\0') {
157 FILE *fp = fopen(startup, "r");
158 if (fp != NULL) {
159 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
160 PyErr_Clear();
161 fclose(fp);
Christian Heimese69a08e2007-11-14 16:21:32 +0000162 } else {
163 int save_errno;
164
165 save_errno = errno;
166 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
167 errno = save_errno;
168 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
169 startup);
170 PyErr_Print();
171 PyErr_Clear();
Martin v. Löwis6caea372003-11-18 19:46:25 +0000172 }
173 }
174}
175
Thomas Woutersa9773292006-04-21 09:43:23 +0000176
Christian Heimes9cd17752007-11-18 19:35:23 +0000177static int RunModule(char *module, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000178{
Thomas Woutersa9773292006-04-21 09:43:23 +0000179 PyObject *runpy, *runmodule, *runargs, *result;
180 runpy = PyImport_ImportModule("runpy");
181 if (runpy == NULL) {
182 fprintf(stderr, "Could not import runpy module\n");
183 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000184 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000185 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
Thomas Woutersa9773292006-04-21 09:43:23 +0000186 if (runmodule == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000187 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Thomas Woutersa9773292006-04-21 09:43:23 +0000188 Py_DECREF(runpy);
189 return -1;
190 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000191 runargs = Py_BuildValue("(si)", module, set_argv0);
Thomas Woutersa9773292006-04-21 09:43:23 +0000192 if (runargs == NULL) {
193 fprintf(stderr,
Thomas Woutersed03b412007-08-28 21:37:11 +0000194 "Could not create arguments for runpy._run_module_as_main\n");
Thomas Woutersa9773292006-04-21 09:43:23 +0000195 Py_DECREF(runpy);
196 Py_DECREF(runmodule);
197 return -1;
198 }
199 result = PyObject_Call(runmodule, runargs, NULL);
200 if (result == NULL) {
201 PyErr_Print();
202 }
203 Py_DECREF(runpy);
204 Py_DECREF(runmodule);
205 Py_DECREF(runargs);
206 if (result == NULL) {
207 return -1;
208 }
209 Py_DECREF(result);
210 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000211}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000212
Martin v. Löwis790465f2008-04-05 20:41:37 +0000213static int RunMainFromImporter(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000214{
215 PyObject *argv0 = NULL, *importer = NULL;
216
Martin v. Löwis790465f2008-04-05 20:41:37 +0000217 if ((argv0 = PyUnicode_FromWideChar(filename,wcslen(filename))) &&
Guido van Rossum74c29c72007-11-19 18:36:41 +0000218 (importer = PyImport_GetImporter(argv0)) &&
219 (importer->ob_type != &PyNullImporter_Type))
Christian Heimes9cd17752007-11-18 19:35:23 +0000220 {
221 /* argv0 is usable as an import source, so
222 put it in sys.path[0] and import __main__ */
223 PyObject *sys_path = NULL;
Guido van Rossum74c29c72007-11-19 18:36:41 +0000224 if ((sys_path = PySys_GetObject("path")) &&
225 !PyList_SetItem(sys_path, 0, argv0))
226 {
Christian Heimes9cd17752007-11-18 19:35:23 +0000227 Py_INCREF(argv0);
Guido van Rossum74c29c72007-11-19 18:36:41 +0000228 Py_DECREF(importer);
Christian Heimes9cd17752007-11-18 19:35:23 +0000229 sys_path = NULL;
230 return RunModule("__main__", 0) != 0;
231 }
232 }
Guido van Rossum74c29c72007-11-19 18:36:41 +0000233 Py_XDECREF(argv0);
234 Py_XDECREF(importer);
235 if (PyErr_Occurred()) {
236 PyErr_Print();
237 return 1;
238 }
239 else {
240 return -1;
241 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000242}
243
244
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000245/* Wait until threading._shutdown completes, provided
246 the threading module was imported in the first place.
247 The shutdown routine will wait until all non-daemon
248 "threading" threads have completed. */
249#include "abstract.h"
250static void
251WaitForThreadShutdown(void)
252{
253#ifdef WITH_THREAD
254 PyObject *result;
255 PyThreadState *tstate = PyThreadState_GET();
256 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
257 "threading");
258 if (threading == NULL) {
259 /* threading not imported */
260 PyErr_Clear();
261 return;
262 }
263 result = PyObject_CallMethod(threading, "_shutdown", "");
264 if (result == NULL)
265 PyErr_WriteUnraisable(threading);
266 else
267 Py_DECREF(result);
268 Py_DECREF(threading);
269#endif
270}
271
Guido van Rossum667d7041995-08-04 04:20:48 +0000272/* Main program */
273
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000274int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000275Py_Main(int argc, wchar_t **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000276{
277 int c;
278 int sts;
279 char *command = NULL;
Martin v. Löwis790465f2008-04-05 20:41:37 +0000280 wchar_t *filename = NULL;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000281 char *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000282 FILE *fp = stdin;
283 char *p;
Guido van Rossum667d7041995-08-04 04:20:48 +0000284 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000285 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000286 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000287 int help = 0;
288 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000289 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000290 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000291
Guido van Rossum393661d2001-08-31 17:40:15 +0000292 cf.cf_flags = 0;
293
Guido van Rossumac56b031996-07-21 02:33:38 +0000294 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000295 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000296
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000297 PySys_ResetWarnOptions();
298
Guido van Rossumbceccf52001-04-10 22:07:43 +0000299 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000300 if (c == 'c') {
Martin v. Löwis790465f2008-04-05 20:41:37 +0000301 size_t r1 = wcslen(_PyOS_optarg) + 2;
302 size_t r2;
Guido van Rossum667d7041995-08-04 04:20:48 +0000303 /* -c is the last option; following arguments
304 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000305 command to interpret. */
Martin v. Löwis790465f2008-04-05 20:41:37 +0000306 command = (char *)malloc(r1);
Guido van Rossum667d7041995-08-04 04:20:48 +0000307 if (command == NULL)
308 Py_FatalError(
309 "not enough memory to copy -c argument");
Martin v. Löwis790465f2008-04-05 20:41:37 +0000310 r2 = wcstombs(command, _PyOS_optarg, r1);
311 if (r2 > r1-2)
312 Py_FatalError(
313 "not enough memory to copy -c argument");
Guido van Rossum667d7041995-08-04 04:20:48 +0000314 strcat(command, "\n");
315 break;
316 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000317
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000318 if (c == 'm') {
319 /* -m is the last option; following arguments
320 that look like options are left for the
321 module to interpret. */
Martin v. Löwis790465f2008-04-05 20:41:37 +0000322 size_t r1 = wcslen(_PyOS_optarg) + 1;
323 size_t r2;
324 module = (char *)malloc(r1);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000325 if (module == NULL)
326 Py_FatalError(
327 "not enough memory to copy -m argument");
Martin v. Löwis790465f2008-04-05 20:41:37 +0000328 r2 = wcstombs(module, _PyOS_optarg, r1);
329 if (r2 >= r1)
330 Py_FatalError(
331 "not enough memory to copy -m argument");
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000332 break;
333 }
334
Guido van Rossum667d7041995-08-04 04:20:48 +0000335 switch (c) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000336 case 'b':
337 Py_BytesWarningFlag++;
338 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000339
340 case 'd':
341 Py_DebugFlag++;
342 break;
343
344 case 'i':
Guido van Rossumd8faa362007-04-27 19:54:29 +0000345 Py_InspectFlag++;
Guido van Rossum775af911997-02-14 19:50:32 +0000346 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000347 break;
348
Christian Heimes33fe8092008-04-13 13:53:33 +0000349 /* case 'J': reserved for Jython */
350
Guido van Rossum7614da61997-03-03 19:14:45 +0000351 case 'O':
352 Py_OptimizeFlag++;
353 break;
354
Christian Heimes790c8232008-01-07 21:14:23 +0000355 case 'B':
356 Py_DontWriteBytecodeFlag++;
357 break;
358
Christian Heimes8dc226f2008-05-06 23:45:46 +0000359 case 's':
360 Py_NoUserSiteDirectory++;
361 break;
362
Guido van Rossum7922bd71997-08-29 22:34:47 +0000363 case 'S':
364 Py_NoSiteFlag++;
365 break;
366
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000367 case 'E':
368 Py_IgnoreEnvironmentFlag++;
369 break;
370
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000371 case 't':
Georg Brandle1b5ac62008-06-04 13:06:58 +0000372 /* ignored for backwards compatibility */
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000373 break;
374
Guido van Rossum667d7041995-08-04 04:20:48 +0000375 case 'u':
376 unbuffered++;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000377 saw_unbuffered_flag = 1;
Guido van Rossum667d7041995-08-04 04:20:48 +0000378 break;
379
380 case 'v':
381 Py_VerboseFlag++;
382 break;
383
Guido van Rossuma075ce11997-12-05 21:56:45 +0000384 case 'x':
385 skipfirstline = 1;
386 break;
387
Neal Norwitz32dde222008-04-15 06:43:13 +0000388 /* case 'X': reserved for implementation-specific arguments */
Christian Heimes33fe8092008-04-13 13:53:33 +0000389
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000390 case 'h':
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391 case '?':
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000392 help++;
393 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000394
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000395 case 'V':
396 version++;
397 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000398
Martin v. Löwis790465f2008-04-05 20:41:37 +0000399 case 'W':
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000400 PySys_AddWarnOption(_PyOS_optarg);
401 break;
402
Guido van Rossum667d7041995-08-04 04:20:48 +0000403 /* This space reserved for other options */
404
405 default:
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000406 return usage(2, argv[0]);
Guido van Rossum667d7041995-08-04 04:20:48 +0000407 /*NOTREACHED*/
408
409 }
410 }
411
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000412 if (help)
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000413 return usage(0, argv[0]);
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000414
415 if (version) {
416 fprintf(stderr, "Python %s\n", PY_VERSION);
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000417 return 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000418 }
419
Guido van Rossumd8faa362007-04-27 19:54:29 +0000420 if (!Py_InspectFlag &&
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000421 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000422 Py_InspectFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000423 if (!saw_unbuffered_flag &&
424 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
425 unbuffered = 1;
426
Christian Heimes8dc226f2008-05-06 23:45:46 +0000427 if (!Py_NoUserSiteDirectory &&
428 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
429 Py_NoUserSiteDirectory = 1;
430
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000431 if (command == NULL && module == NULL && _PyOS_optind < argc &&
Martin v. Löwis790465f2008-04-05 20:41:37 +0000432 wcscmp(argv[_PyOS_optind], L"-") != 0)
Guido van Rossum775af911997-02-14 19:50:32 +0000433 {
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000434#ifdef __VMS
435 filename = decc$translate_vms(argv[_PyOS_optind]);
436 if (filename == (char *)0 || filename == (char *)-1)
437 filename = argv[_PyOS_optind];
438
439#else
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000440 filename = argv[_PyOS_optind];
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000441#endif
Guido van Rossum775af911997-02-14 19:50:32 +0000442 }
443
444 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
445
Guido van Rossum667d7041995-08-04 04:20:48 +0000446 if (unbuffered) {
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000447#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000448 _setmode(fileno(stdin), O_BINARY);
449 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000450#endif
Guido van Rossum22ffac11998-03-06 15:30:39 +0000451#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000452 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
453 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
454 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000455#else /* !HAVE_SETVBUF */
456 setbuf(stdin, (char *)NULL);
457 setbuf(stdout, (char *)NULL);
458 setbuf(stderr, (char *)NULL);
459#endif /* !HAVE_SETVBUF */
Guido van Rossum667d7041995-08-04 04:20:48 +0000460 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000461 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000462#ifdef MS_WINDOWS
463 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000464 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000465 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000466#else /* !MS_WINDOWS */
467#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000468 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
469 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000470#endif /* HAVE_SETVBUF */
471#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000472 /* Leave stderr alone - it should be unbuffered anyway. */
473 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000474#ifdef __VMS
475 else {
476 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
477 }
478#endif /* __VMS */
Guido van Rossum667d7041995-08-04 04:20:48 +0000479
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000480#ifdef __APPLE__
481 /* On MacOS X, when the Python interpreter is embedded in an
482 application bundle, it gets executed by a bootstrapping script
483 that does os.execve() with an argv[0] that's different from the
484 actual Python executable. This is needed to keep the Finder happy,
485 or rather, to work around Apple's overly strict requirements of
486 the process name. However, we still need a usable sys.executable,
487 so the actual executable path is passed in an environment variable.
488 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
489 script. */
490 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0')
491 Py_SetProgramName(p);
492 else
493 Py_SetProgramName(argv[0]);
494#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000495 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000496#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000497 Py_Initialize();
498
Guido van Rossum667d7041995-08-04 04:20:48 +0000499 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000500 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000501 fprintf(stderr, "Python %s on %s\n",
502 Py_GetVersion(), Py_GetPlatform());
503 if (!Py_NoSiteFlag)
504 fprintf(stderr, "%s\n", COPYRIGHT);
505 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000506
Guido van Rossum667d7041995-08-04 04:20:48 +0000507 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000508 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
509 _PyOS_optind--;
Martin v. Löwis790465f2008-04-05 20:41:37 +0000510 argv[_PyOS_optind] = L"-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000511 }
512
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000513 if (module != NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000514 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
515 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000516 _PyOS_optind--;
Martin v. Löwis790465f2008-04-05 20:41:37 +0000517 argv[_PyOS_optind] = L"-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000518 }
519
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000520 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000521
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000523 isatty(fileno(stdin))) {
524 PyObject *v;
525 v = PyImport_ImportModule("readline");
526 if (v == NULL)
527 PyErr_Clear();
528 else
529 Py_DECREF(v);
530 }
531
Guido van Rossum667d7041995-08-04 04:20:48 +0000532 if (command) {
Guido van Rossum393661d2001-08-31 17:40:15 +0000533 sts = PyRun_SimpleStringFlags(command, &cf) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000534 free(command);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000535 } else if (module) {
Christian Heimes9cd17752007-11-18 19:35:23 +0000536 sts = RunModule(module, 1);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000537 free(module);
Guido van Rossum667d7041995-08-04 04:20:48 +0000538 }
539 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000540
Guido van Rossum775af911997-02-14 19:50:32 +0000541 if (filename == NULL && stdin_is_interactive) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000542 Py_InspectFlag = 0; /* do exit on SystemExit */
Martin v. Löwis6caea372003-11-18 19:46:25 +0000543 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000544 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000545 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000546
547 sts = -1; /* keep track of whether we've already run __main__ */
548
549 if (filename != NULL) {
550 sts = RunMainFromImporter(filename);
551 }
552
553 if (sts==-1 && filename!=NULL) {
Martin v. Löwis790465f2008-04-05 20:41:37 +0000554 if ((fp = _wfopen(filename, L"r")) == NULL) {
Martin v. Löwis99ddc8c2008-04-06 17:57:16 +0000555 fprintf(stderr, "%ls: can't open file '%ls': [Errno %d] %s\n",
Christian Heimes9cd17752007-11-18 19:35:23 +0000556 argv[0], filename, errno, strerror(errno));
Christian Heimesada8c3b2008-03-18 18:26:33 +0000557
Christian Heimes9cd17752007-11-18 19:35:23 +0000558 return 2;
559 }
560 else if (skipfirstline) {
561 int ch;
562 /* Push back first newline so line numbers
563 remain the same */
564 while ((ch = getc(fp)) != EOF) {
565 if (ch == '\n') {
566 (void)ungetc(ch, fp);
567 break;
568 }
569 }
570 }
571 {
572 /* XXX: does this work on Win/Win64? (see posix_fstat) */
573 struct stat sb;
574 if (fstat(fileno(fp), &sb) == 0 &&
575 S_ISDIR(sb.st_mode)) {
Martin v. Löwis790465f2008-04-05 20:41:37 +0000576 fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename);
Christian Heimes679db4a2008-01-18 09:56:22 +0000577 fclose(fp);
Christian Heimes9cd17752007-11-18 19:35:23 +0000578 return 1;
579 }
580 }
581 }
582
583 if (sts==-1) {
Martin v. Löwis790465f2008-04-05 20:41:37 +0000584 char cfilename[PATH_MAX];
585 char *p_cfilename = "<stdin>";
586 if (filename) {
587 size_t r = wcstombs(cfilename, filename, PATH_MAX);
588 p_cfilename = cfilename;
589 if (r == (size_t)-1 || r >= PATH_MAX)
590 p_cfilename = "<decoding error>";
591 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000592 sts = PyRun_AnyFileExFlags(
593 fp,
Martin v. Löwis790465f2008-04-05 20:41:37 +0000594 p_cfilename,
Christian Heimes9cd17752007-11-18 19:35:23 +0000595 filename != NULL, &cf) != 0;
596 }
597
Guido van Rossum667d7041995-08-04 04:20:48 +0000598 }
599
Barry Warsawd86dcd32003-06-29 17:07:06 +0000600 /* Check this environment variable at the end, to give programs the
601 * opportunity to set it from Python.
602 */
Guido van Rossumd8faa362007-04-27 19:54:29 +0000603 if (!Py_InspectFlag &&
Barry Warsawd86dcd32003-06-29 17:07:06 +0000604 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
605 {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000606 Py_InspectFlag = 1;
Barry Warsawd86dcd32003-06-29 17:07:06 +0000607 }
608
Guido van Rossumd8faa362007-04-27 19:54:29 +0000609 if (Py_InspectFlag && stdin_is_interactive &&
610 (filename != NULL || command != NULL || module != NULL)) {
611 Py_InspectFlag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000612 /* XXX */
613 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000614 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000615
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000616 WaitForThreadShutdown();
617
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000618 Py_Finalize();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000619
620#ifdef __INSURE__
621 /* Insure++ is a memory analysis tool that aids in discovering
622 * memory leaks and other memory problems. On Python exit, the
Walter Dörwald16807132007-05-25 13:52:07 +0000623 * interned string dictionaries are flagged as being in use at exit
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000624 * (which it is). Under normal circumstances, this is fine because
625 * the memory will be automatically reclaimed by the system. Under
626 * memory debugging, it's a huge source of useless noise, so we
627 * trade off slower shutdown for less distraction in the memory
628 * reports. -baw
629 */
630 _Py_ReleaseInternedStrings();
Walter Dörwald16807132007-05-25 13:52:07 +0000631 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000632#endif /* __INSURE__ */
633
Guido van Rossum05f7c501997-08-02 03:00:42 +0000634 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000635}
636
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000637/* this is gonna seem *real weird*, but if you put some other code between
638 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
639 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000640
Guido van Rossum667d7041995-08-04 04:20:48 +0000641/* Make the *original* argc/argv available to other modules.
642 This is rare, but it is needed by the secureware extension. */
643
644void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000645Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000646{
647 *argc = orig_argc;
648 *argv = orig_argv;
649}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000650
651#ifdef __cplusplus
652}
653#endif