blob: 3e347dc8e243c6e86609f743c6ac09b6254ab3fc [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"
Guido van Rossum667d7041995-08-04 04:20:48 +00005
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00006#include <locale.h>
7
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00008#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +00009#include <windows.h>
Steve Dowerbfce0f92016-12-28 15:41:09 -080010#ifdef HAVE_IO_H
11#include <io.h>
12#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000013#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000014#include <fcntl.h>
15#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000016#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000017
Martin v. Löwis945362c2007-08-30 14:57:25 +000018#ifdef _MSC_VER
19#include <crtdbg.h>
20#endif
21
Jesus Ceaab70e2a2012-10-05 01:48:08 +020022#if defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000023#define PYTHONHOMEHELP "<prefix>\\lib"
24#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000025#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000026#endif
27
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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000034#ifdef __cplusplus
35extern "C" {
36#endif
37
Guido van Rossumac56b031996-07-21 02:33:38 +000038/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000039static wchar_t **orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000040static int orig_argc;
41
Guido van Rossumbceccf52001-04-10 22:07:43 +000042/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020043#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000044
Guido van Rossumbceccf52001-04-10 22:07:43 +000045#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000046
Guido van Rossum667d7041995-08-04 04:20:48 +000047/* Short usage message (with %s for argv0) */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020048static const char usage_line[] =
Martin v. Löwis790465f2008-04-05 20:41:37 +000049"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000050
51/* Long usage message, split into parts < 512 bytes */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020052static const char usage_1[] = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000053Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000054-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
55 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Xiang Zhang0710d752017-03-11 13:02:52 +080056-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000057-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000058-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000059-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000060-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000061";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020062static const char usage_2[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000063-i : inspect interactively after running script; forces a prompt even\n\
64 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020065-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000066-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000067-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000068-OO : remove doc-strings in addition to the -O optimizations\n\
Georg Brandl9d871192010-12-04 10:47:18 +000069-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +000070-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000071-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000072";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020073static const char usage_3[] = "\
Ezio Melotti61b0c672013-07-25 05:04:02 +020074-u : unbuffered binary stdout and stderr, stdin always buffered;\n\
75 also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000076 see man page for details on internal buffering relating to '-u'\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000077-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
78 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000079-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +090080 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000081-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +000082 also PYTHONWARNINGS=arg\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\
Antoine Pitrou9583cac2010-10-21 13:42:28 +000084-X opt : set implementation-specific option\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000085";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020086static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000087file : program read from script file\n\
88- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000089arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000090Other environment variables:\n\
91PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020092PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000093 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000094";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020095static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020096"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +000097" The default module search path uses %s.\n"
98"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
99"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be8072016-03-14 12:04:26 +0100100"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
101static const char usage_6[] =
102"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
103" to seed the hashes of str, bytes and datetime objects. It can also be\n"
104" set to an integer in the range [0,4294967295] to get hash values with a\n"
105" predictable seed.\n"
106"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
107" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000108" hooks.\n"
Stéphane Wirtel7d1017d2017-06-12 13:30:33 +0200109"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000110" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
111" locale coercion and locale compatibility warnings on stderr.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000112
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000113static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200114usage(int exitcode, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 FILE *f = exitcode ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 fprintf(f, usage_line, program);
119 if (exitcode)
120 fprintf(f, "Try `python -h' for more information.\n");
121 else {
122 fputs(usage_1, f);
123 fputs(usage_2, f);
124 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200125 fprintf(f, usage_4, (wint_t)DELIM);
126 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100127 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 return exitcode;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000130}
131
Martin v. Löwis6caea372003-11-18 19:46:25 +0000132static void RunStartupFile(PyCompilerFlags *cf)
133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 char *startup = Py_GETENV("PYTHONSTARTUP");
135 if (startup != NULL && startup[0] != '\0') {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200136 FILE *fp = _Py_fopen(startup, "r");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 if (fp != NULL) {
138 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
139 PyErr_Clear();
140 fclose(fp);
141 } else {
142 int save_errno;
143
144 save_errno = errno;
145 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
146 errno = save_errno;
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300147 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 startup);
149 PyErr_Print();
150 PyErr_Clear();
151 }
152 }
Martin v. Löwis6caea372003-11-18 19:46:25 +0000153}
154
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200155static void RunInteractiveHook(void)
156{
157 PyObject *sys, *hook, *result;
158 sys = PyImport_ImportModule("sys");
159 if (sys == NULL)
160 goto error;
161 hook = PyObject_GetAttrString(sys, "__interactivehook__");
162 Py_DECREF(sys);
163 if (hook == NULL)
164 PyErr_Clear();
165 else {
Victor Stinnera5ed5f02016-12-06 18:45:50 +0100166 result = _PyObject_CallNoArg(hook);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200167 Py_DECREF(hook);
168 if (result == NULL)
169 goto error;
170 else
171 Py_DECREF(result);
172 }
173 return;
174
175error:
176 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
177 PyErr_Print();
178 PyErr_Clear();
179}
180
Thomas Woutersa9773292006-04-21 09:43:23 +0000181
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000182static int RunModule(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 PyObject *module, *runpy, *runmodule, *runargs, *result;
185 runpy = PyImport_ImportModule("runpy");
186 if (runpy == NULL) {
187 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200188 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 return -1;
190 }
191 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
192 if (runmodule == NULL) {
193 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200194 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 Py_DECREF(runpy);
196 return -1;
197 }
198 module = PyUnicode_FromWideChar(modname, wcslen(modname));
199 if (module == NULL) {
200 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200201 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 Py_DECREF(runpy);
203 Py_DECREF(runmodule);
204 return -1;
205 }
206 runargs = Py_BuildValue("(Oi)", module, set_argv0);
207 if (runargs == NULL) {
208 fprintf(stderr,
209 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200210 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 Py_DECREF(runpy);
212 Py_DECREF(runmodule);
213 Py_DECREF(module);
214 return -1;
215 }
216 result = PyObject_Call(runmodule, runargs, NULL);
217 if (result == NULL) {
218 PyErr_Print();
219 }
220 Py_DECREF(runpy);
221 Py_DECREF(runmodule);
222 Py_DECREF(module);
223 Py_DECREF(runargs);
224 if (result == NULL) {
225 return -1;
226 }
227 Py_DECREF(result);
228 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000229}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000230
Nick Coghland2977a32017-03-12 20:38:32 +1000231static PyObject *
232AsImportPathEntry(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000233{
Nick Coghland2977a32017-03-12 20:38:32 +1000234 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000235
Nick Coghland2977a32017-03-12 20:38:32 +1000236 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
237 if (sys_path0 == NULL)
Victor Stinner4726e402010-10-06 23:24:57 +0000238 goto error;
239
Nick Coghland2977a32017-03-12 20:38:32 +1000240 importer = PyImport_GetImporter(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000241 if (importer == NULL)
242 goto error;
243
Brett Cannonaa936422012-04-27 15:30:58 -0400244 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000245 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000246 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000247 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 }
Victor Stinner4726e402010-10-06 23:24:57 +0000249 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000250 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000251
Nick Coghland2977a32017-03-12 20:38:32 +1000252error:
253 Py_XDECREF(sys_path0);
254 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
255 PyErr_Print();
256 PyErr_Clear();
257 return NULL;
258}
259
260
261static int
262RunMainFromImporter(PyObject *sys_path0)
263{
264 PyObject *sys_path;
265 int sts;
266
267 /* Assume sys_path0 has already been checked by AsImportPathEntry,
268 * so put it in sys.path[0] and import __main__ */
Victor Stinnerbd303c12013-11-07 23:07:29 +0100269 sys_path = PySys_GetObject("path");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200270 if (sys_path == NULL) {
271 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
Victor Stinner4726e402010-10-06 23:24:57 +0000272 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200273 }
Nick Coghland2977a32017-03-12 20:38:32 +1000274 sts = PyList_Insert(sys_path, 0, sys_path0);
Steve Dower6d46ae72017-02-04 15:39:21 -0800275 if (sts) {
Nick Coghland2977a32017-03-12 20:38:32 +1000276 sys_path0 = NULL;
Victor Stinner4726e402010-10-06 23:24:57 +0000277 goto error;
278 }
Victor Stinner4726e402010-10-06 23:24:57 +0000279
280 sts = RunModule(L"__main__", 0);
281 return sts != 0;
282
283error:
Nick Coghland2977a32017-03-12 20:38:32 +1000284 Py_XDECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000285 PyErr_Print();
286 return 1;
Christian Heimes9cd17752007-11-18 19:35:23 +0000287}
288
Victor Stinnera62207c2010-08-07 10:57:17 +0000289static int
290run_command(wchar_t *command, PyCompilerFlags *cf)
291{
292 PyObject *unicode, *bytes;
293 int ret;
294
295 unicode = PyUnicode_FromWideChar(command, -1);
296 if (unicode == NULL)
297 goto error;
298 bytes = PyUnicode_AsUTF8String(unicode);
299 Py_DECREF(unicode);
300 if (bytes == NULL)
301 goto error;
302 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
303 Py_DECREF(bytes);
304 return ret != 0;
305
306error:
Victor Stinner398356b2010-08-18 22:23:22 +0000307 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000308 PyErr_Print();
309 return 1;
310}
311
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000312static int
313run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
314{
315 PyObject *unicode, *bytes = NULL;
316 char *filename_str;
317 int run;
318
319 /* call pending calls like signal handlers (SIGINT) */
320 if (Py_MakePendingCalls() == -1) {
321 PyErr_Print();
322 return 1;
323 }
324
325 if (filename) {
326 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
327 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000328 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000329 Py_DECREF(unicode);
330 }
331 if (bytes != NULL)
332 filename_str = PyBytes_AsString(bytes);
333 else {
334 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000335 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000336 }
337 }
338 else
339 filename_str = "<stdin>";
340
341 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
342 Py_XDECREF(bytes);
343 return run != 0;
344}
345
Christian Heimes9cd17752007-11-18 19:35:23 +0000346
Guido van Rossum667d7041995-08-04 04:20:48 +0000347/* Main program */
348
Eric Snow6b4be192017-05-22 21:36:03 -0700349/*TODO: Add arg processing to PEP 432 as a new configuration setup API
350 */
351typedef struct {
352 wchar_t *filename; /* Trailing arg without -c or -m */
353 wchar_t *command; /* -c argument */
354 wchar_t *module; /* -m argument */
355 PyObject *warning_options; /* -W options */
356 PyObject *extra_options; /* -X options */
357 int print_help; /* -h, -? options */
358 int print_version; /* -V option */
359 int bytes_warning; /* Py_BytesWarningFlag */
360 int debug; /* Py_DebugFlag */
361 int inspect; /* Py_InspectFlag */
362 int interactive; /* Py_InteractiveFlag */
363 int isolated; /* Py_IsolatedFlag */
364 int optimization_level; /* Py_OptimizeFlag */
365 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag */
366 int no_user_site_directory; /* Py_NoUserSiteDirectory */
367 int no_site_import; /* Py_NoSiteFlag */
368 int use_unbuffered_io; /* Py_UnbufferedStdioFlag */
369 int verbosity; /* Py_VerboseFlag */
370 int quiet_flag; /* Py_QuietFlag */
371 int skip_first_line; /* -x option */
372} _Py_CommandLineDetails;
373
374#define _Py_CommandLineDetails_INIT \
375 {NULL, NULL, NULL, NULL, NULL, \
376 0, 0, 0, 0, 0, 0, 0, 0, \
377 0, 0, 0, 0, 0, 0, 0}
378
379static int
380read_command_line(int argc, wchar_t **argv, _Py_CommandLineDetails *cmdline)
Guido van Rossum667d7041995-08-04 04:20:48 +0000381{
Antoine Pitrou69994412014-04-29 00:56:08 +0200382 PyObject *warning_option = NULL;
Eric Snow6b4be192017-05-22 21:36:03 -0700383 wchar_t *command = NULL;
384 wchar_t *module = NULL;
Eric Snowe0918ec2017-05-23 12:26:17 -0700385 int c;
Eric Snow6b4be192017-05-22 21:36:03 -0700386
Antoine Pitrou86838b02012-02-21 19:03:47 +0100387 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
390 if (c == 'c') {
391 size_t len;
392 /* -c is the last option; following arguments
393 that look like options are left for the
394 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 len = wcslen(_PyOS_optarg) + 1 + 1;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200397 command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 if (command == NULL)
399 Py_FatalError(
400 "not enough memory to copy -c argument");
401 wcscpy(command, _PyOS_optarg);
402 command[len - 2] = '\n';
403 command[len - 1] = 0;
Eric Snow6b4be192017-05-22 21:36:03 -0700404 cmdline->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 break;
406 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 if (c == 'm') {
409 /* -m is the last option; following arguments
410 that look like options are left for the
411 module to interpret. */
412 module = _PyOS_optarg;
Eric Snow6b4be192017-05-22 21:36:03 -0700413 cmdline->module = module;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 break;
415 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 switch (c) {
418 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700419 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700423 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700427 cmdline->inspect++;
428 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000430
Christian Heimesad73a9c2013-08-10 16:36:18 +0200431 case 'I':
Eric Snow6b4be192017-05-22 21:36:03 -0700432 cmdline->isolated++;
433 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200434 break;
435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700439 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700443 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700447 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700451 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 case 'E':
Eric Snow6b4be192017-05-22 21:36:03 -0700455 /* Handled prior to core initialization */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 case 't':
459 /* ignored for backwards compatibility */
460 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700463 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700467 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 case 'x':
Eric Snow6b4be192017-05-22 21:36:03 -0700471 cmdline->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 case 'h':
475 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700476 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700480 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 case 'W':
Eric Snow6b4be192017-05-22 21:36:03 -0700484 if (cmdline->warning_options == NULL)
485 cmdline->warning_options = PyList_New(0);
486 if (cmdline->warning_options == NULL)
Antoine Pitrou69994412014-04-29 00:56:08 +0200487 Py_FatalError("failure in handling of -W argument");
488 warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
489 if (warning_option == NULL)
490 Py_FatalError("failure in handling of -W argument");
Eric Snow6b4be192017-05-22 21:36:03 -0700491 if (PyList_Append(cmdline->warning_options, warning_option) == -1)
Christian Heimes27527072016-09-09 00:08:35 +0200492 Py_FatalError("failure in handling of -W argument");
Antoine Pitrou69994412014-04-29 00:56:08 +0200493 Py_DECREF(warning_option);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000495
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000496 case 'X':
Eric Snow6b4be192017-05-22 21:36:03 -0700497 /* TODO: Delay addition of X options to sys module */
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000498 PySys_AddXOption(_PyOS_optarg);
499 break;
500
Georg Brandl9d871192010-12-04 10:47:18 +0000501 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700502 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000503 break;
504
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100505 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500506 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100507 break;
508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 default:
Eric Snow6b4be192017-05-22 21:36:03 -0700512 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 }
516 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000517
Eric Snow6b4be192017-05-22 21:36:03 -0700518 if (command == NULL && module == NULL && _PyOS_optind < argc &&
519 wcscmp(argv[_PyOS_optind], L"-") != 0)
520 {
521 cmdline->filename = argv[_PyOS_optind];
522 }
523 return 0;
524}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000525
Eric Snow6b4be192017-05-22 21:36:03 -0700526static int
527apply_command_line_and_environment(_Py_CommandLineDetails *cmdline)
528{
529 char *p;
530 Py_BytesWarningFlag = cmdline->bytes_warning;
531 Py_DebugFlag = cmdline->debug;
532 Py_InspectFlag = cmdline->inspect;
533 Py_InteractiveFlag = cmdline->interactive;
534 Py_IsolatedFlag = cmdline->isolated;
535 Py_OptimizeFlag = cmdline->optimization_level;
536 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
537 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
538 Py_NoSiteFlag = cmdline->no_site_import;
539 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
540 Py_VerboseFlag = cmdline->verbosity;
541 Py_QuietFlag = cmdline->quiet_flag;
542
543 if (!Py_InspectFlag &&
544 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') {
545 Py_InspectFlag = 1;
546 cmdline->inspect = 1;
547 }
548 if (!cmdline->use_unbuffered_io &&
549 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') {
550 Py_UnbufferedStdioFlag = 1;
551 cmdline->use_unbuffered_io = 1;
552 }
553
554 if (!Py_NoUserSiteDirectory &&
555 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0') {
556 Py_NoUserSiteDirectory = 1;
557 cmdline->no_user_site_directory = 1;
558 }
559
560 /* TODO: Apply PYTHONWARNINGS & -W options to sys module here */
561 /* TODO: Apply -X options to sys module here */
562 return 0;
563}
564
565int
566Py_Main(int argc, wchar_t **argv)
567{
568 int c;
569 int sts;
570 FILE *fp = stdin;
571 char *p;
572#ifdef MS_WINDOWS
573 wchar_t *wp;
574#endif
575 int stdin_is_interactive = 0;
576 _Py_CommandLineDetails cmdline = _Py_CommandLineDetails_INIT;
Eric Snow1abcf672017-05-23 21:46:51 -0700577 _PyCoreConfig core_config = _PyCoreConfig_INIT;
Eric Snow6b4be192017-05-22 21:36:03 -0700578 PyCompilerFlags cf;
579 PyObject *main_importer_path = NULL;
580
581 cf.cf_flags = 0;
582
583 orig_argc = argc; /* For Py_GetArgcArgv() */
584 orig_argv = argv;
585
586 /* Hash randomization needed early for all string operations
587 (including -W and -X options). */
588 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
589 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
590 if (c == 'm' || c == 'c') {
591 /* -c / -m is the last option: following arguments are
592 not interpreter options. */
593 break;
594 }
595 if (c == 'E' || c == 'I') {
Eric Snow1abcf672017-05-23 21:46:51 -0700596 core_config.ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700597 break;
598 }
599 }
600
Eric Snow1abcf672017-05-23 21:46:51 -0700601 /* Initialize the core language runtime */
602 Py_IgnoreEnvironmentFlag = core_config.ignore_environment;
603 core_config._disable_importlib = 0;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600604 core_config.allocator = Py_GETENV("PYTHONMALLOC");
Eric Snow1abcf672017-05-23 21:46:51 -0700605 _Py_InitializeCore(&core_config);
606
Eric Snow6b4be192017-05-22 21:36:03 -0700607 /* Reprocess the command line with the language runtime available */
608 if (read_command_line(argc, argv, &cmdline)) {
609 return usage(2, argv[0]);
610 }
611
612 if (cmdline.print_help) {
613 return usage(0, argv[0]);
614 }
615
616 if (cmdline.print_version) {
617 printf("Python %s\n", cmdline.print_version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 return 0;
619 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000620
Eric Snow6b4be192017-05-22 21:36:03 -0700621 PySys_ResetWarnOptions();
622 apply_command_line_and_environment(&cmdline);
Christian Heimes8dc226f2008-05-06 23:45:46 +0000623
Philip Jenveye53de3d2010-04-14 03:01:39 +0000624#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
626 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800627 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000628
Victor Stinner1a7425f2013-07-07 16:25:15 +0200629 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 if (buf == NULL)
631 Py_FatalError(
632 "not enough memory to copy PYTHONWARNINGS");
633 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800634 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800636 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 PySys_AddWarnOption(warning);
638 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200639 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000641#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
643 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000644 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 /* settle for strtok here as there's no one standard
647 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200648 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (buf == NULL)
650 Py_FatalError(
651 "not enough memory to copy PYTHONWARNINGS");
652 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200653 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 setlocale(LC_ALL, "");
655 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000656#ifdef __APPLE__
657 /* Use utf-8 on Mac OS X */
658 unicode = PyUnicode_FromString(p);
659#else
Victor Stinner1b579672011-12-17 05:47:23 +0100660 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000661#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100662 if (unicode == NULL) {
663 /* ignore errors */
664 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000665 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100666 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000667 PySys_AddWarnOptionUnicode(unicode);
668 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 }
670 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200671 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200672 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000674#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700675 if (cmdline.warning_options != NULL) {
Antoine Pitrou69994412014-04-29 00:56:08 +0200676 Py_ssize_t i;
Eric Snow6b4be192017-05-22 21:36:03 -0700677 for (i = 0; i < PyList_GET_SIZE(cmdline.warning_options); i++) {
678 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(cmdline.warning_options, i));
Antoine Pitrou69994412014-04-29 00:56:08 +0200679 }
Eric Snow1abcf672017-05-23 21:46:51 -0700680 Py_DECREF(cmdline.warning_options);
Antoine Pitrou69994412014-04-29 00:56:08 +0200681 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000684
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000685#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000686 /* don't translate newlines (\r\n <=> \n) */
687 _setmode(fileno(stdin), O_BINARY);
688 _setmode(fileno(stdout), O_BINARY);
689 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000690#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000691
692 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000693#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
695 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
696 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000697#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 setbuf(stdin, (char *)NULL);
699 setbuf(stdout, (char *)NULL);
700 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000701#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 }
703 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000704#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 /* Doesn't have to have line-buffered -- use unbuffered */
706 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
707 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000708#else /* !MS_WINDOWS */
709#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
711 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000712#endif /* HAVE_SETVBUF */
713#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 /* Leave stderr alone - it should be unbuffered anyway. */
715 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000716
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000717#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 /* On MacOS X, when the Python interpreter is embedded in an
719 application bundle, it gets executed by a bootstrapping script
720 that does os.execve() with an argv[0] that's different from the
721 actual Python executable. This is needed to keep the Finder happy,
722 or rather, to work around Apple's overly strict requirements of
723 the process name. However, we still need a usable sys.executable,
724 so the actual executable path is passed in an environment variable.
725 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
726 script. */
727 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
728 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200729 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000730
Victor Stinner1a7425f2013-07-07 16:25:15 +0200731 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 if (buffer == NULL) {
733 Py_FatalError(
734 "not enough memory to copy PYTHONEXECUTABLE");
735 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000736
Brett Cannonb94767f2011-02-22 20:15:44 +0000737 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 Py_SetProgramName(buffer);
739 /* buffer is now handed off - do not free */
740 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100741#ifdef WITH_NEXT_FRAMEWORK
742 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
743
744 if (pyvenv_launcher && *pyvenv_launcher) {
745 /* Used by Mac/Tools/pythonw.c to forward
746 * the argv0 of the stub executable
747 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200748 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100749
750 if (wbuf == NULL) {
751 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
752 }
753 Py_SetProgramName(wbuf);
754
755 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000756 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100757 */
758 } else {
759 Py_SetProgramName(argv[0]);
760 }
761#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000765#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000767#endif
Eric Snowc7ec9982017-05-23 23:00:52 -0700768 /* Replaces previous call to Py_Initialize()
769 *
770 * TODO: Move environment queries (etc) into Py_ReadConfig
771 */
772 {
773 _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
774
775 /* TODO: Moar config options! */
776 config.install_signal_handlers = 1;
777 /* TODO: Print any exceptions raised by these operations */
778 if (_Py_ReadMainInterpreterConfig(&config))
779 Py_FatalError("Py_Main: Py_ReadMainInterpreterConfig failed");
780 if (_Py_InitializeMainInterpreter(&config))
781 Py_FatalError("Py_Main: Py_InitializeMainInterpreter failed");
782 }
Guido van Rossumed52aac1997-07-19 19:20:32 +0000783
Eric Snow1abcf672017-05-23 21:46:51 -0700784 /* TODO: Move this to _PyRun_PrepareMain */
Georg Brandl8aa7e992010-12-28 18:30:18 +0000785 if (!Py_QuietFlag && (Py_VerboseFlag ||
Eric Snow6b4be192017-05-22 21:36:03 -0700786 (cmdline.command == NULL && cmdline.filename == NULL &&
787 cmdline.module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 fprintf(stderr, "Python %s on %s\n",
789 Py_GetVersion(), Py_GetPlatform());
790 if (!Py_NoSiteFlag)
791 fprintf(stderr, "%s\n", COPYRIGHT);
792 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000793
Eric Snow1abcf672017-05-23 21:46:51 -0700794 /* TODO: Move this to _Py_InitializeMainInterpreter */
Eric Snow6b4be192017-05-22 21:36:03 -0700795 if (cmdline.command != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
797 _PyOS_optind--;
798 argv[_PyOS_optind] = L"-c";
799 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000800
Eric Snow6b4be192017-05-22 21:36:03 -0700801 if (cmdline.module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000802 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000804 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000806
Eric Snow6b4be192017-05-22 21:36:03 -0700807 if (cmdline.filename != NULL) {
808 main_importer_path = AsImportPathEntry(cmdline.filename);
Nick Coghland2977a32017-03-12 20:38:32 +1000809 }
810
811 if (main_importer_path != NULL) {
812 /* Let RunMainFromImporter adjust sys.path[0] later */
813 PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0);
814 } else {
815 /* Use config settings to decide whether or not to update sys.path[0] */
816 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
817 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000818
Eric Snow6b4be192017-05-22 21:36:03 -0700819 if ((Py_InspectFlag || (cmdline.command == NULL &&
820 cmdline.filename == NULL &&
821 cmdline.module == NULL)) &&
822 isatty(fileno(stdin)) &&
823 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 PyObject *v;
825 v = PyImport_ImportModule("readline");
826 if (v == NULL)
827 PyErr_Clear();
828 else
829 Py_DECREF(v);
830 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000831
Eric Snow6b4be192017-05-22 21:36:03 -0700832 if (cmdline.command) {
833 sts = run_command(cmdline.command, &cf);
834 PyMem_RawFree(cmdline.command);
835 } else if (cmdline.module) {
836 sts = (RunModule(cmdline.module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 }
838 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000839
Eric Snow6b4be192017-05-22 21:36:03 -0700840 if (cmdline.filename == NULL && stdin_is_interactive) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 Py_InspectFlag = 0; /* do exit on SystemExit */
842 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200843 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 }
845 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000848
Nick Coghland2977a32017-03-12 20:38:32 +1000849 if (main_importer_path != NULL) {
850 sts = RunMainFromImporter(main_importer_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000852
Eric Snow6b4be192017-05-22 21:36:03 -0700853 if (sts==-1 && cmdline.filename != NULL) {
854 fp = _Py_wfopen(cmdline.filename, L"r");
Victor Stinner9a6692f2010-10-14 10:51:24 +0000855 if (fp == NULL) {
856 char *cfilename_buffer;
857 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100858 int err = errno;
Eric Snow6b4be192017-05-22 21:36:03 -0700859 cfilename_buffer = Py_EncodeLocale(cmdline.filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000860 if (cfilename_buffer != NULL)
861 cfilename = cfilename_buffer;
862 else
863 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100865 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000866 if (cfilename_buffer)
867 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 return 2;
869 }
Eric Snow6b4be192017-05-22 21:36:03 -0700870 else if (cmdline.skip_first_line) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 int ch;
872 /* Push back first newline so line numbers
873 remain the same */
874 while ((ch = getc(fp)) != EOF) {
875 if (ch == '\n') {
876 (void)ungetc(ch, fp);
877 break;
878 }
879 }
880 }
881 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800882 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200883 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200885 fprintf(stderr,
886 "%ls: '%ls' is a directory, cannot continue\n",
Eric Snow6b4be192017-05-22 21:36:03 -0700887 argv[0], cmdline.filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 fclose(fp);
889 return 1;
890 }
891 }
892 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000893
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000894 if (sts == -1)
Eric Snow6b4be192017-05-22 21:36:03 -0700895 sts = run_file(fp, cmdline.filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 /* Check this environment variable at the end, to give programs the
899 * opportunity to set it from Python.
900 */
901 if (!Py_InspectFlag &&
902 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
903 {
904 Py_InspectFlag = 1;
905 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 if (Py_InspectFlag && stdin_is_interactive &&
Eric Snow6b4be192017-05-22 21:36:03 -0700908 (cmdline.filename != NULL || cmdline.command != NULL || cmdline.module != NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200910 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 /* XXX */
912 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
913 }
914
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000915 if (Py_FinalizeEx() < 0) {
916 /* Value unlikely to be confused with a non-error exit status or
917 other special meaning */
918 sts = 120;
919 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000920
921#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 /* Insure++ is a memory analysis tool that aids in discovering
923 * memory leaks and other memory problems. On Python exit, the
924 * interned string dictionaries are flagged as being in use at exit
925 * (which it is). Under normal circumstances, this is fine because
926 * the memory will be automatically reclaimed by the system. Under
927 * memory debugging, it's a huge source of useless noise, so we
928 * trade off slower shutdown for less distraction in the memory
929 * reports. -baw
930 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000932#endif /* __INSURE__ */
933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000935}
936
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000937/* this is gonna seem *real weird*, but if you put some other code between
938 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
939 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000940
Guido van Rossum667d7041995-08-04 04:20:48 +0000941/* Make the *original* argc/argv available to other modules.
942 This is rare, but it is needed by the secureware extension. */
943
944void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000945Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 *argc = orig_argc;
948 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000949}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000950
951#ifdef __cplusplus
952}
953#endif