blob: 08b22760de1125b1b91124654466bb8d16ec459b [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 Stinner34be807c2016-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 char *pymalloc = Py_GETENV("PYTHONMALLOC");
602 if (_PyMem_SetupAllocators(pymalloc) < 0) {
603 fprintf(stderr,
604 "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", pymalloc);
605 exit(1);
606 }
607
608 /* Initialize the core language runtime */
609 Py_IgnoreEnvironmentFlag = core_config.ignore_environment;
610 core_config._disable_importlib = 0;
611 _Py_InitializeCore(&core_config);
612
Eric Snow6b4be192017-05-22 21:36:03 -0700613 /* Reprocess the command line with the language runtime available */
614 if (read_command_line(argc, argv, &cmdline)) {
615 return usage(2, argv[0]);
616 }
617
618 if (cmdline.print_help) {
619 return usage(0, argv[0]);
620 }
621
622 if (cmdline.print_version) {
623 printf("Python %s\n", cmdline.print_version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 return 0;
625 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000626
Eric Snow6b4be192017-05-22 21:36:03 -0700627 PySys_ResetWarnOptions();
628 apply_command_line_and_environment(&cmdline);
Christian Heimes8dc226f2008-05-06 23:45:46 +0000629
Philip Jenveye53de3d2010-04-14 03:01:39 +0000630#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
632 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800633 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000634
Victor Stinner1a7425f2013-07-07 16:25:15 +0200635 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 if (buf == NULL)
637 Py_FatalError(
638 "not enough memory to copy PYTHONWARNINGS");
639 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800640 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800642 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 PySys_AddWarnOption(warning);
644 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200645 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000647#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
649 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000650 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 /* settle for strtok here as there's no one standard
653 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200654 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 if (buf == NULL)
656 Py_FatalError(
657 "not enough memory to copy PYTHONWARNINGS");
658 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200659 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 setlocale(LC_ALL, "");
661 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000662#ifdef __APPLE__
663 /* Use utf-8 on Mac OS X */
664 unicode = PyUnicode_FromString(p);
665#else
Victor Stinner1b579672011-12-17 05:47:23 +0100666 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000667#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100668 if (unicode == NULL) {
669 /* ignore errors */
670 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000671 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100672 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000673 PySys_AddWarnOptionUnicode(unicode);
674 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 }
676 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200677 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200678 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000680#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700681 if (cmdline.warning_options != NULL) {
Antoine Pitrou69994412014-04-29 00:56:08 +0200682 Py_ssize_t i;
Eric Snow6b4be192017-05-22 21:36:03 -0700683 for (i = 0; i < PyList_GET_SIZE(cmdline.warning_options); i++) {
684 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(cmdline.warning_options, i));
Antoine Pitrou69994412014-04-29 00:56:08 +0200685 }
Eric Snow1abcf672017-05-23 21:46:51 -0700686 Py_DECREF(cmdline.warning_options);
Antoine Pitrou69994412014-04-29 00:56:08 +0200687 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000690
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000691#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000692 /* don't translate newlines (\r\n <=> \n) */
693 _setmode(fileno(stdin), O_BINARY);
694 _setmode(fileno(stdout), O_BINARY);
695 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000696#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000697
698 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000699#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
701 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
702 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000703#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 setbuf(stdin, (char *)NULL);
705 setbuf(stdout, (char *)NULL);
706 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000707#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 }
709 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000710#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 /* Doesn't have to have line-buffered -- use unbuffered */
712 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
713 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000714#else /* !MS_WINDOWS */
715#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
717 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000718#endif /* HAVE_SETVBUF */
719#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 /* Leave stderr alone - it should be unbuffered anyway. */
721 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000722
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000723#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 /* On MacOS X, when the Python interpreter is embedded in an
725 application bundle, it gets executed by a bootstrapping script
726 that does os.execve() with an argv[0] that's different from the
727 actual Python executable. This is needed to keep the Finder happy,
728 or rather, to work around Apple's overly strict requirements of
729 the process name. However, we still need a usable sys.executable,
730 so the actual executable path is passed in an environment variable.
731 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
732 script. */
733 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
734 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200735 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000736
Victor Stinner1a7425f2013-07-07 16:25:15 +0200737 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 if (buffer == NULL) {
739 Py_FatalError(
740 "not enough memory to copy PYTHONEXECUTABLE");
741 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000742
Brett Cannonb94767f2011-02-22 20:15:44 +0000743 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 Py_SetProgramName(buffer);
745 /* buffer is now handed off - do not free */
746 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100747#ifdef WITH_NEXT_FRAMEWORK
748 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
749
750 if (pyvenv_launcher && *pyvenv_launcher) {
751 /* Used by Mac/Tools/pythonw.c to forward
752 * the argv0 of the stub executable
753 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200754 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100755
756 if (wbuf == NULL) {
757 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
758 }
759 Py_SetProgramName(wbuf);
760
761 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000762 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100763 */
764 } else {
765 Py_SetProgramName(argv[0]);
766 }
767#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000771#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000773#endif
Eric Snowc7ec9982017-05-23 23:00:52 -0700774 /* Replaces previous call to Py_Initialize()
775 *
776 * TODO: Move environment queries (etc) into Py_ReadConfig
777 */
778 {
779 _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
780
781 /* TODO: Moar config options! */
782 config.install_signal_handlers = 1;
783 /* TODO: Print any exceptions raised by these operations */
784 if (_Py_ReadMainInterpreterConfig(&config))
785 Py_FatalError("Py_Main: Py_ReadMainInterpreterConfig failed");
786 if (_Py_InitializeMainInterpreter(&config))
787 Py_FatalError("Py_Main: Py_InitializeMainInterpreter failed");
788 }
Guido van Rossumed52aac1997-07-19 19:20:32 +0000789
Eric Snow1abcf672017-05-23 21:46:51 -0700790 /* TODO: Move this to _PyRun_PrepareMain */
Georg Brandl8aa7e992010-12-28 18:30:18 +0000791 if (!Py_QuietFlag && (Py_VerboseFlag ||
Eric Snow6b4be192017-05-22 21:36:03 -0700792 (cmdline.command == NULL && cmdline.filename == NULL &&
793 cmdline.module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 fprintf(stderr, "Python %s on %s\n",
795 Py_GetVersion(), Py_GetPlatform());
796 if (!Py_NoSiteFlag)
797 fprintf(stderr, "%s\n", COPYRIGHT);
798 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000799
Eric Snow1abcf672017-05-23 21:46:51 -0700800 /* TODO: Move this to _Py_InitializeMainInterpreter */
Eric Snow6b4be192017-05-22 21:36:03 -0700801 if (cmdline.command != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
803 _PyOS_optind--;
804 argv[_PyOS_optind] = L"-c";
805 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000806
Eric Snow6b4be192017-05-22 21:36:03 -0700807 if (cmdline.module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000808 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000810 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000812
Eric Snow6b4be192017-05-22 21:36:03 -0700813 if (cmdline.filename != NULL) {
814 main_importer_path = AsImportPathEntry(cmdline.filename);
Nick Coghland2977a32017-03-12 20:38:32 +1000815 }
816
817 if (main_importer_path != NULL) {
818 /* Let RunMainFromImporter adjust sys.path[0] later */
819 PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0);
820 } else {
821 /* Use config settings to decide whether or not to update sys.path[0] */
822 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
823 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000824
Eric Snow6b4be192017-05-22 21:36:03 -0700825 if ((Py_InspectFlag || (cmdline.command == NULL &&
826 cmdline.filename == NULL &&
827 cmdline.module == NULL)) &&
828 isatty(fileno(stdin)) &&
829 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 PyObject *v;
831 v = PyImport_ImportModule("readline");
832 if (v == NULL)
833 PyErr_Clear();
834 else
835 Py_DECREF(v);
836 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000837
Eric Snow6b4be192017-05-22 21:36:03 -0700838 if (cmdline.command) {
839 sts = run_command(cmdline.command, &cf);
840 PyMem_RawFree(cmdline.command);
841 } else if (cmdline.module) {
842 sts = (RunModule(cmdline.module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 }
844 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000845
Eric Snow6b4be192017-05-22 21:36:03 -0700846 if (cmdline.filename == NULL && stdin_is_interactive) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 Py_InspectFlag = 0; /* do exit on SystemExit */
848 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200849 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 }
851 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000854
Nick Coghland2977a32017-03-12 20:38:32 +1000855 if (main_importer_path != NULL) {
856 sts = RunMainFromImporter(main_importer_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000858
Eric Snow6b4be192017-05-22 21:36:03 -0700859 if (sts==-1 && cmdline.filename != NULL) {
860 fp = _Py_wfopen(cmdline.filename, L"r");
Victor Stinner9a6692f2010-10-14 10:51:24 +0000861 if (fp == NULL) {
862 char *cfilename_buffer;
863 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100864 int err = errno;
Eric Snow6b4be192017-05-22 21:36:03 -0700865 cfilename_buffer = Py_EncodeLocale(cmdline.filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000866 if (cfilename_buffer != NULL)
867 cfilename = cfilename_buffer;
868 else
869 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100871 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000872 if (cfilename_buffer)
873 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 return 2;
875 }
Eric Snow6b4be192017-05-22 21:36:03 -0700876 else if (cmdline.skip_first_line) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 int ch;
878 /* Push back first newline so line numbers
879 remain the same */
880 while ((ch = getc(fp)) != EOF) {
881 if (ch == '\n') {
882 (void)ungetc(ch, fp);
883 break;
884 }
885 }
886 }
887 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800888 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200889 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200891 fprintf(stderr,
892 "%ls: '%ls' is a directory, cannot continue\n",
Eric Snow6b4be192017-05-22 21:36:03 -0700893 argv[0], cmdline.filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 fclose(fp);
895 return 1;
896 }
897 }
898 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000899
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000900 if (sts == -1)
Eric Snow6b4be192017-05-22 21:36:03 -0700901 sts = run_file(fp, cmdline.filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 /* Check this environment variable at the end, to give programs the
905 * opportunity to set it from Python.
906 */
907 if (!Py_InspectFlag &&
908 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
909 {
910 Py_InspectFlag = 1;
911 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 if (Py_InspectFlag && stdin_is_interactive &&
Eric Snow6b4be192017-05-22 21:36:03 -0700914 (cmdline.filename != NULL || cmdline.command != NULL || cmdline.module != NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200916 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 /* XXX */
918 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
919 }
920
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000921 if (Py_FinalizeEx() < 0) {
922 /* Value unlikely to be confused with a non-error exit status or
923 other special meaning */
924 sts = 120;
925 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000926
927#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 /* Insure++ is a memory analysis tool that aids in discovering
929 * memory leaks and other memory problems. On Python exit, the
930 * interned string dictionaries are flagged as being in use at exit
931 * (which it is). Under normal circumstances, this is fine because
932 * the memory will be automatically reclaimed by the system. Under
933 * memory debugging, it's a huge source of useless noise, so we
934 * trade off slower shutdown for less distraction in the memory
935 * reports. -baw
936 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000938#endif /* __INSURE__ */
939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000941}
942
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000943/* this is gonna seem *real weird*, but if you put some other code between
944 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
945 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000946
Guido van Rossum667d7041995-08-04 04:20:48 +0000947/* Make the *original* argc/argv available to other modules.
948 This is rare, but it is needed by the secureware extension. */
949
950void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000951Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 *argc = orig_argc;
954 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000955}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000956
957#ifdef __cplusplus
958}
959#endif