blob: 8352e6672220e47e52e9d773629f80a114d67aba [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
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00007#include <locale.h>
8
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00009#ifdef __VMS
Martin v. Löwis7a924e62003-03-05 14:15:21 +000010#include <unixlib.h>
Martin v. Löwis79acb9e2002-12-06 12:48:53 +000011#endif
12
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +000013#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +000014#include <windows.h>
Thomas Wouters477c8d52006-05-27 19:21:47 +000015#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000016#include <fcntl.h>
Martin v. Löwis790465f2008-04-05 20:41:37 +000017#define PATH_MAX MAXPATHLEN
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000018#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000019#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000020
Martin v. Löwis945362c2007-08-30 14:57:25 +000021#ifdef _MSC_VER
22#include <crtdbg.h>
23#endif
24
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000025#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000026#define PYTHONHOMEHELP "<prefix>\\lib"
27#else
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000028#if defined(PYOS_OS2) && defined(PYCC_GCC)
29#define PYTHONHOMEHELP "<prefix>/Lib"
30#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000031#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000032#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +000033#endif
Guido van Rossuma075ce11997-12-05 21:56:45 +000034
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000035#include "pygetopt.h"
36
Guido van Rossuma22865e2000-09-05 04:41:18 +000037#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000038 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
39 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000040
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000041#ifdef __cplusplus
42extern "C" {
43#endif
44
Guido van Rossumac56b031996-07-21 02:33:38 +000045/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000046static wchar_t **orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000047static int orig_argc;
48
Guido van Rossumbceccf52001-04-10 22:07:43 +000049/* command line options */
Christian Heimes8dc226f2008-05-06 23:45:46 +000050#define BASE_OPTS L"bBc:dEhiJm:OsStuvVW:xX?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000051
Guido van Rossumbceccf52001-04-10 22:07:43 +000052#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000053
Guido van Rossum667d7041995-08-04 04:20:48 +000054/* Short usage message (with %s for argv0) */
55static char *usage_line =
Martin v. Löwis790465f2008-04-05 20:41:37 +000056"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000057
58/* Long usage message, split into parts < 512 bytes */
Guido van Rossum393661d2001-08-31 17:40:15 +000059static char *usage_1 = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000060Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000061-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
62 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Christian Heimes790c8232008-01-07 21:14:23 +000063-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000064-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000065-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000066-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000067-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000068";
69static char *usage_2 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000070-i : inspect interactively after running script; forces a prompt even\n\
71 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000072-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000073-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000074-OO : remove doc-strings in addition to the -O optimizations\n\
Christian Heimes8dc226f2008-05-06 23:45: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 Rossum393661d2001-08-31 17:40:15 +000077";
78static char *usage_3 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000079-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000080 see man page for details on internal buffering relating to '-u'\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000081-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
82 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000083-V : print the Python version number and exit (also --version)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000084-W arg : warning control; arg is action:message:category:module:lineno\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000085-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000086";
Guido van Rossum393661d2001-08-31 17:40:15 +000087static char *usage_4 = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000088file : program read from script file\n\
89- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000090arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000091Other environment variables:\n\
92PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000093PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000094 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000095";
96static char *usage_5 = "\
Guido van Rossuma075ce11997-12-05 21:56:45 +000097PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
98 The default module search path uses %s.\n\
Tim Peters793de092001-02-22 00:39:47 +000099PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
Martin v. Löwis0f599892008-06-02 11:13:03 +0000100PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000101";
102
Martin v. Löwis790465f2008-04-05 20:41:37 +0000103#ifndef MS_WINDOWS
104static FILE*
105_wfopen(const wchar_t *path, const wchar_t *mode)
106{
107 char cpath[PATH_MAX];
108 char cmode[10];
109 size_t r;
110 r = wcstombs(cpath, path, PATH_MAX);
111 if (r == (size_t)-1 || r >= PATH_MAX) {
112 errno = EINVAL;
113 return NULL;
114 }
115 r = wcstombs(cmode, mode, 10);
116 if (r == (size_t)-1 || r >= 10) {
117 errno = EINVAL;
118 return NULL;
119 }
120 return fopen(cpath, cmode);
121}
122#endif
123
Guido van Rossum667d7041995-08-04 04:20:48 +0000124
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000125static int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000126usage(int exitcode, wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000127{
Guido van Rossum393661d2001-08-31 17:40:15 +0000128 FILE *f = exitcode ? stderr : stdout;
129
130 fprintf(f, usage_line, program);
131 if (exitcode)
132 fprintf(f, "Try `python -h' for more information.\n");
133 else {
134 fprintf(f, usage_1);
135 fprintf(f, usage_2);
136 fprintf(f, usage_3);
Christian Heimes790c8232008-01-07 21:14:23 +0000137 fprintf(f, usage_4, DELIM);
138 fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
Guido van Rossum393661d2001-08-31 17:40:15 +0000139 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000140#if defined(__VMS)
141 if (exitcode == 0) {
142 /* suppress 'error' message */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000143 return 1;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000144 }
145 else {
146 /* STS$M_INHIB_MSG + SS$_ABORT */
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000147 return 0x1000002c;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000148 }
149#else
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000150 return exitcode;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000151#endif
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000152 /*NOTREACHED*/
153}
154
Martin v. Löwis6caea372003-11-18 19:46:25 +0000155static void RunStartupFile(PyCompilerFlags *cf)
156{
157 char *startup = Py_GETENV("PYTHONSTARTUP");
158 if (startup != NULL && startup[0] != '\0') {
159 FILE *fp = fopen(startup, "r");
160 if (fp != NULL) {
161 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
162 PyErr_Clear();
163 fclose(fp);
Christian Heimese69a08e2007-11-14 16:21:32 +0000164 } else {
165 int save_errno;
166
167 save_errno = errno;
168 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
169 errno = save_errno;
170 PyErr_SetFromErrnoWithFilename(PyExc_IOError,
171 startup);
172 PyErr_Print();
173 PyErr_Clear();
Martin v. Löwis6caea372003-11-18 19:46:25 +0000174 }
175 }
176}
177
Thomas Woutersa9773292006-04-21 09:43:23 +0000178
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000179static int RunModule(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000180{
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000181 PyObject *module, *runpy, *runmodule, *runargs, *result;
Thomas Woutersa9773292006-04-21 09:43:23 +0000182 runpy = PyImport_ImportModule("runpy");
183 if (runpy == NULL) {
184 fprintf(stderr, "Could not import runpy module\n");
185 return -1;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000186 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000187 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
Thomas Woutersa9773292006-04-21 09:43:23 +0000188 if (runmodule == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000189 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Thomas Woutersa9773292006-04-21 09:43:23 +0000190 Py_DECREF(runpy);
191 return -1;
192 }
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000193 module = PyUnicode_FromWideChar(modname, wcslen(modname));
194 if (module == NULL) {
195 fprintf(stderr, "Could not convert module name to unicode\n");
196 Py_DECREF(runpy);
197 Py_DECREF(runmodule);
198 return -1;
199 }
200 runargs = Py_BuildValue("(Oi)", module, set_argv0);
Thomas Woutersa9773292006-04-21 09:43:23 +0000201 if (runargs == NULL) {
202 fprintf(stderr,
Thomas Woutersed03b412007-08-28 21:37:11 +0000203 "Could not create arguments for runpy._run_module_as_main\n");
Thomas Woutersa9773292006-04-21 09:43:23 +0000204 Py_DECREF(runpy);
205 Py_DECREF(runmodule);
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000206 Py_DECREF(module);
Thomas Woutersa9773292006-04-21 09:43:23 +0000207 return -1;
208 }
209 result = PyObject_Call(runmodule, runargs, NULL);
210 if (result == NULL) {
211 PyErr_Print();
212 }
213 Py_DECREF(runpy);
214 Py_DECREF(runmodule);
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000215 Py_DECREF(module);
Thomas Woutersa9773292006-04-21 09:43:23 +0000216 Py_DECREF(runargs);
217 if (result == NULL) {
218 return -1;
219 }
220 Py_DECREF(result);
221 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000222}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000223
Martin v. Löwis790465f2008-04-05 20:41:37 +0000224static int RunMainFromImporter(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000225{
226 PyObject *argv0 = NULL, *importer = NULL;
227
Martin v. Löwis790465f2008-04-05 20:41:37 +0000228 if ((argv0 = PyUnicode_FromWideChar(filename,wcslen(filename))) &&
Guido van Rossum74c29c72007-11-19 18:36:41 +0000229 (importer = PyImport_GetImporter(argv0)) &&
230 (importer->ob_type != &PyNullImporter_Type))
Christian Heimes9cd17752007-11-18 19:35:23 +0000231 {
232 /* argv0 is usable as an import source, so
233 put it in sys.path[0] and import __main__ */
234 PyObject *sys_path = NULL;
Guido van Rossum74c29c72007-11-19 18:36:41 +0000235 if ((sys_path = PySys_GetObject("path")) &&
236 !PyList_SetItem(sys_path, 0, argv0))
237 {
Christian Heimes9cd17752007-11-18 19:35:23 +0000238 Py_INCREF(argv0);
Guido van Rossum74c29c72007-11-19 18:36:41 +0000239 Py_DECREF(importer);
Christian Heimes9cd17752007-11-18 19:35:23 +0000240 sys_path = NULL;
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000241 return RunModule(L"__main__", 0) != 0;
Christian Heimes9cd17752007-11-18 19:35:23 +0000242 }
243 }
Guido van Rossum74c29c72007-11-19 18:36:41 +0000244 Py_XDECREF(argv0);
245 Py_XDECREF(importer);
246 if (PyErr_Occurred()) {
247 PyErr_Print();
248 return 1;
249 }
250 else {
251 return -1;
252 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000253}
254
255
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000256/* Wait until threading._shutdown completes, provided
257 the threading module was imported in the first place.
258 The shutdown routine will wait until all non-daemon
259 "threading" threads have completed. */
260#include "abstract.h"
261static void
262WaitForThreadShutdown(void)
263{
264#ifdef WITH_THREAD
265 PyObject *result;
266 PyThreadState *tstate = PyThreadState_GET();
267 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
268 "threading");
269 if (threading == NULL) {
270 /* threading not imported */
271 PyErr_Clear();
272 return;
273 }
274 result = PyObject_CallMethod(threading, "_shutdown", "");
275 if (result == NULL)
276 PyErr_WriteUnraisable(threading);
277 else
278 Py_DECREF(result);
279 Py_DECREF(threading);
280#endif
281}
282
Guido van Rossum667d7041995-08-04 04:20:48 +0000283/* Main program */
284
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000285int
Martin v. Löwis790465f2008-04-05 20:41:37 +0000286Py_Main(int argc, wchar_t **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000287{
288 int c;
289 int sts;
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000290 wchar_t *command = NULL;
Martin v. Löwis790465f2008-04-05 20:41:37 +0000291 wchar_t *filename = NULL;
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000292 wchar_t *module = NULL;
Guido van Rossum667d7041995-08-04 04:20:48 +0000293 FILE *fp = stdin;
294 char *p;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000295 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000296 int stdin_is_interactive = 0;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000297 int help = 0;
298 int version = 0;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000299 int saw_unbuffered_flag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000300 PyCompilerFlags cf;
Guido van Rossum667d7041995-08-04 04:20:48 +0000301
Guido van Rossum393661d2001-08-31 17:40:15 +0000302 cf.cf_flags = 0;
303
Guido van Rossumac56b031996-07-21 02:33:38 +0000304 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000305 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000306
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000307 PySys_ResetWarnOptions();
308
Guido van Rossumbceccf52001-04-10 22:07:43 +0000309 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000310 if (c == 'c') {
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000311 size_t len;
Guido van Rossum667d7041995-08-04 04:20:48 +0000312 /* -c is the last option; following arguments
313 that look like options are left for the
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000314 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000315
316 len = wcslen(_PyOS_optarg) + 1 + 1;
317 command = (wchar_t *)malloc(sizeof(wchar_t) * len);
Guido van Rossum667d7041995-08-04 04:20:48 +0000318 if (command == NULL)
319 Py_FatalError(
320 "not enough memory to copy -c argument");
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000321 wcscpy(command, _PyOS_optarg);
322 command[len - 2] = '\n';
323 command[len - 1] = 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000324 break;
325 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000326
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000327 if (c == 'm') {
328 /* -m is the last option; following arguments
329 that look like options are left for the
330 module to interpret. */
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000331 module = _PyOS_optarg;
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':
Antoine Pitrou05608432009-01-09 18:53:14 +0000376 Py_UnbufferedStdioFlag = 1;
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')
Antoine Pitrou05608432009-01-09 18:53:14 +0000425 Py_UnbufferedStdioFlag = 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000426
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
Antoine Pitrou05608432009-01-09 18:53:14 +0000446 if (Py_UnbufferedStdioFlag) {
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. */
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000490 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
491 wchar_t* buffer;
492 size_t len = strlen(p);
493 size_t r;
494
495 buffer = malloc(len * sizeof(wchar_t));
496 if (buffer == NULL) {
497 Py_FatalError(
498 "not enough memory to copy PYTHONEXECUTABLE");
499 }
500
501 r = mbstowcs(buffer, p, len);
502 Py_SetProgramName(buffer);
503 /* buffer is now handed off - do not free */
504 } else {
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000505 Py_SetProgramName(argv[0]);
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000506 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000507#else
Guido van Rossumed52aac1997-07-19 19:20:32 +0000508 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000509#endif
Guido van Rossumed52aac1997-07-19 19:20:32 +0000510 Py_Initialize();
511
Guido van Rossum667d7041995-08-04 04:20:48 +0000512 if (Py_VerboseFlag ||
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000513 (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
Martin v. Löwise98922f2003-03-30 17:00:39 +0000514 fprintf(stderr, "Python %s on %s\n",
515 Py_GetVersion(), Py_GetPlatform());
516 if (!Py_NoSiteFlag)
517 fprintf(stderr, "%s\n", COPYRIGHT);
518 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000519
Guido van Rossum667d7041995-08-04 04:20:48 +0000520 if (command != NULL) {
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000521 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
522 _PyOS_optind--;
Martin v. Löwis790465f2008-04-05 20:41:37 +0000523 argv[_PyOS_optind] = L"-c";
Guido van Rossum667d7041995-08-04 04:20:48 +0000524 }
525
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000526 if (module != NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000527 /* Backup _PyOS_optind and force sys.argv[0] = '-c'
528 so that PySys_SetArgv correctly sets sys.path[0] to ''*/
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000529 _PyOS_optind--;
Martin v. Löwis790465f2008-04-05 20:41:37 +0000530 argv[_PyOS_optind] = L"-c";
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000531 }
532
Thomas Wouters2cffc7d2000-11-03 08:18:37 +0000533 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
Guido van Rossum667d7041995-08-04 04:20:48 +0000534
Guido van Rossumd8faa362007-04-27 19:54:29 +0000535 if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000536 isatty(fileno(stdin))) {
537 PyObject *v;
538 v = PyImport_ImportModule("readline");
539 if (v == NULL)
540 PyErr_Clear();
541 else
542 Py_DECREF(v);
543 }
544
Guido van Rossum667d7041995-08-04 04:20:48 +0000545 if (command) {
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000546 PyObject *commandObj = PyUnicode_FromWideChar(
547 command, wcslen(command));
Guido van Rossum05f7c501997-08-02 03:00:42 +0000548 free(command);
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000549 if (commandObj != NULL) {
550 sts = PyRun_SimpleStringFlags(
551 _PyUnicode_AsString(commandObj), &cf) != 0;
552 }
553 else {
554 PyErr_Print();
555 sts = 1;
556 }
557 Py_DECREF(commandObj);
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000558 } else if (module) {
Christian Heimes9cd17752007-11-18 19:35:23 +0000559 sts = RunModule(module, 1);
Guido van Rossum667d7041995-08-04 04:20:48 +0000560 }
561 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000562
Guido van Rossum775af911997-02-14 19:50:32 +0000563 if (filename == NULL && stdin_is_interactive) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000564 Py_InspectFlag = 0; /* do exit on SystemExit */
Martin v. Löwis6caea372003-11-18 19:46:25 +0000565 RunStartupFile(&cf);
Guido van Rossum667d7041995-08-04 04:20:48 +0000566 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000567 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000568
569 sts = -1; /* keep track of whether we've already run __main__ */
570
571 if (filename != NULL) {
572 sts = RunMainFromImporter(filename);
573 }
574
575 if (sts==-1 && filename!=NULL) {
Martin v. Löwis790465f2008-04-05 20:41:37 +0000576 if ((fp = _wfopen(filename, L"r")) == NULL) {
Amaury Forgeot d'Arcdd8059f2008-10-30 23:03:32 +0000577 char cfilename[PATH_MAX];
578 size_t r = wcstombs(cfilename, filename, PATH_MAX);
579 if (r == PATH_MAX)
580 /* cfilename is not null-terminated;
581 * forcefully null-terminating it
582 * might break the shift state */
583 strcpy(cfilename, "<file name too long>");
584 if (r == ((size_t)-1))
585 strcpy(cfilename, "<unprintable file name>");
586 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
587 argv[0], cfilename, errno, strerror(errno));
Christian Heimesada8c3b2008-03-18 18:26:33 +0000588
Christian Heimes9cd17752007-11-18 19:35:23 +0000589 return 2;
590 }
591 else if (skipfirstline) {
592 int ch;
593 /* Push back first newline so line numbers
594 remain the same */
595 while ((ch = getc(fp)) != EOF) {
596 if (ch == '\n') {
597 (void)ungetc(ch, fp);
598 break;
599 }
600 }
601 }
602 {
603 /* XXX: does this work on Win/Win64? (see posix_fstat) */
604 struct stat sb;
605 if (fstat(fileno(fp), &sb) == 0 &&
606 S_ISDIR(sb.st_mode)) {
Martin v. Löwis790465f2008-04-05 20:41:37 +0000607 fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename);
Christian Heimes679db4a2008-01-18 09:56:22 +0000608 fclose(fp);
Christian Heimes9cd17752007-11-18 19:35:23 +0000609 return 1;
610 }
611 }
612 }
613
614 if (sts==-1) {
Amaury Forgeot d'Arc374e2202009-01-01 23:05:36 +0000615 PyObject *filenameObj = NULL;
Martin v. Löwis790465f2008-04-05 20:41:37 +0000616 char *p_cfilename = "<stdin>";
617 if (filename) {
Amaury Forgeot d'Arc374e2202009-01-01 23:05:36 +0000618 filenameObj = PyUnicode_FromWideChar(
619 filename, wcslen(filename));
620 if (filenameObj != NULL)
621 p_cfilename = _PyUnicode_AsString(filenameObj);
622 else
Martin v. Löwis790465f2008-04-05 20:41:37 +0000623 p_cfilename = "<decoding error>";
624 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000625 sts = PyRun_AnyFileExFlags(
626 fp,
Martin v. Löwis790465f2008-04-05 20:41:37 +0000627 p_cfilename,
Christian Heimes9cd17752007-11-18 19:35:23 +0000628 filename != NULL, &cf) != 0;
Amaury Forgeot d'Arc374e2202009-01-01 23:05:36 +0000629 Py_XDECREF(filenameObj);
Christian Heimes9cd17752007-11-18 19:35:23 +0000630 }
631
Guido van Rossum667d7041995-08-04 04:20:48 +0000632 }
633
Barry Warsawd86dcd32003-06-29 17:07:06 +0000634 /* Check this environment variable at the end, to give programs the
635 * opportunity to set it from Python.
636 */
Guido van Rossumd8faa362007-04-27 19:54:29 +0000637 if (!Py_InspectFlag &&
Barry Warsawd86dcd32003-06-29 17:07:06 +0000638 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
639 {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000640 Py_InspectFlag = 1;
Barry Warsawd86dcd32003-06-29 17:07:06 +0000641 }
642
Guido van Rossumd8faa362007-04-27 19:54:29 +0000643 if (Py_InspectFlag && stdin_is_interactive &&
644 (filename != NULL || command != NULL || module != NULL)) {
645 Py_InspectFlag = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000646 /* XXX */
647 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000648 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000649
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000650 WaitForThreadShutdown();
651
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000652 Py_Finalize();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000653
654#ifdef __INSURE__
655 /* Insure++ is a memory analysis tool that aids in discovering
656 * memory leaks and other memory problems. On Python exit, the
Walter Dörwald16807132007-05-25 13:52:07 +0000657 * interned string dictionaries are flagged as being in use at exit
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000658 * (which it is). Under normal circumstances, this is fine because
659 * the memory will be automatically reclaimed by the system. Under
660 * memory debugging, it's a huge source of useless noise, so we
661 * trade off slower shutdown for less distraction in the memory
662 * reports. -baw
663 */
664 _Py_ReleaseInternedStrings();
Walter Dörwald16807132007-05-25 13:52:07 +0000665 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000666#endif /* __INSURE__ */
667
Guido van Rossum05f7c501997-08-02 03:00:42 +0000668 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000669}
670
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000671/* this is gonna seem *real weird*, but if you put some other code between
672 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
673 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000674
Guido van Rossum667d7041995-08-04 04:20:48 +0000675/* Make the *original* argc/argv available to other modules.
676 This is rare, but it is needed by the secureware extension. */
677
678void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000679Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000680{
681 *argc = orig_argc;
682 *argv = orig_argv;
683}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000684
685#ifdef __cplusplus
686}
687#endif