blob: 846ecb6170d86e7bf108e3c20ab2e36109954468 [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[] = "\
Berker Peksag7f580972017-10-13 15:16:31 +030074-u : force the stdout and stderr streams to be unbuffered;\n\
75 this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000076-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
77 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000078-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +090079 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000080-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +000081 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000082-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +000083-X opt : set implementation-specific option\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000084";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020085static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000086file : program read from script file\n\
87- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000088arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000089Other environment variables:\n\
90PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020091PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000092 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000093";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020094static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020095"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +000096" The default module search path uses %s.\n"
97"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
98"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be807c2016-03-14 12:04:26 +010099"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
100static const char usage_6[] =
101"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
102" to seed the hashes of str, bytes and datetime objects. It can also be\n"
103" set to an integer in the range [0,4294967295] to get hash values with a\n"
104" predictable seed.\n"
105"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
106" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000107" hooks.\n"
Stéphane Wirtel7d1017d2017-06-12 13:30:33 +0200108"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000109" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
110" locale coercion and locale compatibility warnings on stderr.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000111
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000112static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200113usage(int exitcode, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 FILE *f = exitcode ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 fprintf(f, usage_line, program);
118 if (exitcode)
119 fprintf(f, "Try `python -h' for more information.\n");
120 else {
121 fputs(usage_1, f);
122 fputs(usage_2, f);
123 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200124 fprintf(f, usage_4, (wint_t)DELIM);
125 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100126 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 return exitcode;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000129}
130
Martin v. Löwis6caea372003-11-18 19:46:25 +0000131static void RunStartupFile(PyCompilerFlags *cf)
132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 char *startup = Py_GETENV("PYTHONSTARTUP");
134 if (startup != NULL && startup[0] != '\0') {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200135 FILE *fp = _Py_fopen(startup, "r");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 if (fp != NULL) {
137 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
138 PyErr_Clear();
139 fclose(fp);
140 } else {
141 int save_errno;
142
143 save_errno = errno;
144 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
145 errno = save_errno;
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300146 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 startup);
148 PyErr_Print();
149 PyErr_Clear();
150 }
151 }
Martin v. Löwis6caea372003-11-18 19:46:25 +0000152}
153
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200154static void RunInteractiveHook(void)
155{
156 PyObject *sys, *hook, *result;
157 sys = PyImport_ImportModule("sys");
158 if (sys == NULL)
159 goto error;
160 hook = PyObject_GetAttrString(sys, "__interactivehook__");
161 Py_DECREF(sys);
162 if (hook == NULL)
163 PyErr_Clear();
164 else {
Victor Stinnera5ed5f02016-12-06 18:45:50 +0100165 result = _PyObject_CallNoArg(hook);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200166 Py_DECREF(hook);
167 if (result == NULL)
168 goto error;
169 else
170 Py_DECREF(result);
171 }
172 return;
173
174error:
175 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
176 PyErr_Print();
177 PyErr_Clear();
178}
179
Thomas Woutersa9773292006-04-21 09:43:23 +0000180
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000181static int RunModule(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 PyObject *module, *runpy, *runmodule, *runargs, *result;
184 runpy = PyImport_ImportModule("runpy");
185 if (runpy == NULL) {
186 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200187 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 return -1;
189 }
190 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
191 if (runmodule == NULL) {
192 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200193 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 Py_DECREF(runpy);
195 return -1;
196 }
197 module = PyUnicode_FromWideChar(modname, wcslen(modname));
198 if (module == NULL) {
199 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200200 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 Py_DECREF(runpy);
202 Py_DECREF(runmodule);
203 return -1;
204 }
205 runargs = Py_BuildValue("(Oi)", module, set_argv0);
206 if (runargs == NULL) {
207 fprintf(stderr,
208 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200209 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 Py_DECREF(runpy);
211 Py_DECREF(runmodule);
212 Py_DECREF(module);
213 return -1;
214 }
215 result = PyObject_Call(runmodule, runargs, NULL);
216 if (result == NULL) {
217 PyErr_Print();
218 }
219 Py_DECREF(runpy);
220 Py_DECREF(runmodule);
221 Py_DECREF(module);
222 Py_DECREF(runargs);
223 if (result == NULL) {
224 return -1;
225 }
226 Py_DECREF(result);
227 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000228}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000229
Nick Coghland2977a32017-03-12 20:38:32 +1000230static PyObject *
231AsImportPathEntry(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000232{
Nick Coghland2977a32017-03-12 20:38:32 +1000233 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000234
Nick Coghland2977a32017-03-12 20:38:32 +1000235 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
236 if (sys_path0 == NULL)
Victor Stinner4726e402010-10-06 23:24:57 +0000237 goto error;
238
Nick Coghland2977a32017-03-12 20:38:32 +1000239 importer = PyImport_GetImporter(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000240 if (importer == NULL)
241 goto error;
242
Brett Cannonaa936422012-04-27 15:30:58 -0400243 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000244 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000245 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000246 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 }
Victor Stinner4726e402010-10-06 23:24:57 +0000248 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000249 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000250
Nick Coghland2977a32017-03-12 20:38:32 +1000251error:
252 Py_XDECREF(sys_path0);
253 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
254 PyErr_Print();
255 PyErr_Clear();
256 return NULL;
257}
258
259
260static int
261RunMainFromImporter(PyObject *sys_path0)
262{
263 PyObject *sys_path;
264 int sts;
265
266 /* Assume sys_path0 has already been checked by AsImportPathEntry,
267 * so put it in sys.path[0] and import __main__ */
Victor Stinnerbd303c12013-11-07 23:07:29 +0100268 sys_path = PySys_GetObject("path");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200269 if (sys_path == NULL) {
270 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
Victor Stinner4726e402010-10-06 23:24:57 +0000271 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200272 }
Nick Coghland2977a32017-03-12 20:38:32 +1000273 sts = PyList_Insert(sys_path, 0, sys_path0);
Steve Dower6d46ae72017-02-04 15:39:21 -0800274 if (sts) {
Nick Coghland2977a32017-03-12 20:38:32 +1000275 sys_path0 = NULL;
Victor Stinner4726e402010-10-06 23:24:57 +0000276 goto error;
277 }
Victor Stinner4726e402010-10-06 23:24:57 +0000278
279 sts = RunModule(L"__main__", 0);
280 return sts != 0;
281
282error:
Nick Coghland2977a32017-03-12 20:38:32 +1000283 Py_XDECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000284 PyErr_Print();
285 return 1;
Christian Heimes9cd17752007-11-18 19:35:23 +0000286}
287
Victor Stinnera62207c2010-08-07 10:57:17 +0000288static int
289run_command(wchar_t *command, PyCompilerFlags *cf)
290{
291 PyObject *unicode, *bytes;
292 int ret;
293
294 unicode = PyUnicode_FromWideChar(command, -1);
295 if (unicode == NULL)
296 goto error;
297 bytes = PyUnicode_AsUTF8String(unicode);
298 Py_DECREF(unicode);
299 if (bytes == NULL)
300 goto error;
301 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
302 Py_DECREF(bytes);
303 return ret != 0;
304
305error:
Victor Stinner398356b2010-08-18 22:23:22 +0000306 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000307 PyErr_Print();
308 return 1;
309}
310
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000311static int
312run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
313{
314 PyObject *unicode, *bytes = NULL;
315 char *filename_str;
316 int run;
317
318 /* call pending calls like signal handlers (SIGINT) */
319 if (Py_MakePendingCalls() == -1) {
320 PyErr_Print();
321 return 1;
322 }
323
324 if (filename) {
325 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
326 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000327 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000328 Py_DECREF(unicode);
329 }
330 if (bytes != NULL)
331 filename_str = PyBytes_AsString(bytes);
332 else {
333 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000334 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000335 }
336 }
337 else
338 filename_str = "<stdin>";
339
340 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
341 Py_XDECREF(bytes);
342 return run != 0;
343}
344
Christian Heimes9cd17752007-11-18 19:35:23 +0000345
Guido van Rossum667d7041995-08-04 04:20:48 +0000346/* Main program */
347
Eric Snow6b4be192017-05-22 21:36:03 -0700348/*TODO: Add arg processing to PEP 432 as a new configuration setup API
349 */
350typedef struct {
351 wchar_t *filename; /* Trailing arg without -c or -m */
352 wchar_t *command; /* -c argument */
353 wchar_t *module; /* -m argument */
354 PyObject *warning_options; /* -W options */
355 PyObject *extra_options; /* -X options */
356 int print_help; /* -h, -? options */
357 int print_version; /* -V option */
358 int bytes_warning; /* Py_BytesWarningFlag */
359 int debug; /* Py_DebugFlag */
360 int inspect; /* Py_InspectFlag */
361 int interactive; /* Py_InteractiveFlag */
362 int isolated; /* Py_IsolatedFlag */
363 int optimization_level; /* Py_OptimizeFlag */
364 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag */
365 int no_user_site_directory; /* Py_NoUserSiteDirectory */
366 int no_site_import; /* Py_NoSiteFlag */
367 int use_unbuffered_io; /* Py_UnbufferedStdioFlag */
368 int verbosity; /* Py_VerboseFlag */
369 int quiet_flag; /* Py_QuietFlag */
370 int skip_first_line; /* -x option */
371} _Py_CommandLineDetails;
372
373#define _Py_CommandLineDetails_INIT \
374 {NULL, NULL, NULL, NULL, NULL, \
375 0, 0, 0, 0, 0, 0, 0, 0, \
376 0, 0, 0, 0, 0, 0, 0}
377
378static int
379read_command_line(int argc, wchar_t **argv, _Py_CommandLineDetails *cmdline)
Guido van Rossum667d7041995-08-04 04:20:48 +0000380{
Antoine Pitrou69994412014-04-29 00:56:08 +0200381 PyObject *warning_option = NULL;
Eric Snow6b4be192017-05-22 21:36:03 -0700382 wchar_t *command = NULL;
383 wchar_t *module = NULL;
Eric Snowe0918ec2017-05-23 12:26:17 -0700384 int c;
Eric Snow6b4be192017-05-22 21:36:03 -0700385
Antoine Pitrou86838b02012-02-21 19:03:47 +0100386 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
389 if (c == 'c') {
390 size_t len;
391 /* -c is the last option; following arguments
392 that look like options are left for the
393 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 len = wcslen(_PyOS_optarg) + 1 + 1;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200396 command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 if (command == NULL)
398 Py_FatalError(
399 "not enough memory to copy -c argument");
400 wcscpy(command, _PyOS_optarg);
401 command[len - 2] = '\n';
402 command[len - 1] = 0;
Eric Snow6b4be192017-05-22 21:36:03 -0700403 cmdline->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 break;
405 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 if (c == 'm') {
408 /* -m is the last option; following arguments
409 that look like options are left for the
410 module to interpret. */
411 module = _PyOS_optarg;
Eric Snow6b4be192017-05-22 21:36:03 -0700412 cmdline->module = module;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 break;
414 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 switch (c) {
417 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700418 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700422 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700426 cmdline->inspect++;
427 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000429
Christian Heimesad73a9c2013-08-10 16:36:18 +0200430 case 'I':
Eric Snow6b4be192017-05-22 21:36:03 -0700431 cmdline->isolated++;
432 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200433 break;
434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700438 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700442 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700446 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700450 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 case 'E':
Eric Snow6b4be192017-05-22 21:36:03 -0700454 /* Handled prior to core initialization */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 case 't':
458 /* ignored for backwards compatibility */
459 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700462 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700466 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 case 'x':
Eric Snow6b4be192017-05-22 21:36:03 -0700470 cmdline->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 case 'h':
474 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700475 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700479 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 case 'W':
Eric Snow6b4be192017-05-22 21:36:03 -0700483 if (cmdline->warning_options == NULL)
484 cmdline->warning_options = PyList_New(0);
485 if (cmdline->warning_options == NULL)
Antoine Pitrou69994412014-04-29 00:56:08 +0200486 Py_FatalError("failure in handling of -W argument");
487 warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
488 if (warning_option == NULL)
489 Py_FatalError("failure in handling of -W argument");
Eric Snow6b4be192017-05-22 21:36:03 -0700490 if (PyList_Append(cmdline->warning_options, warning_option) == -1)
Christian Heimes27527072016-09-09 00:08:35 +0200491 Py_FatalError("failure in handling of -W argument");
Antoine Pitrou69994412014-04-29 00:56:08 +0200492 Py_DECREF(warning_option);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000494
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000495 case 'X':
Eric Snow6b4be192017-05-22 21:36:03 -0700496 /* TODO: Delay addition of X options to sys module */
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000497 PySys_AddXOption(_PyOS_optarg);
498 break;
499
Georg Brandl9d871192010-12-04 10:47:18 +0000500 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700501 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000502 break;
503
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100504 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500505 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100506 break;
507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 default:
Eric Snow6b4be192017-05-22 21:36:03 -0700511 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 }
515 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000516
Eric Snow6b4be192017-05-22 21:36:03 -0700517 if (command == NULL && module == NULL && _PyOS_optind < argc &&
518 wcscmp(argv[_PyOS_optind], L"-") != 0)
519 {
520 cmdline->filename = argv[_PyOS_optind];
521 }
522 return 0;
523}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000524
Nick Coghland7ac0612017-10-25 12:11:26 +1000525static void
526maybe_set_flag(int *flag, int value)
527{
528 /* Helper to set flag variables from command line options
529 * - uses the higher of the two values if they're both set
530 * - otherwise leaves the flag unset
531 */
532 if (*flag < value) {
533 *flag = value;
534 }
535}
536
Eric Snow6b4be192017-05-22 21:36:03 -0700537static int
538apply_command_line_and_environment(_Py_CommandLineDetails *cmdline)
539{
Nick Coghland7ac0612017-10-25 12:11:26 +1000540 maybe_set_flag(&Py_BytesWarningFlag, cmdline->bytes_warning);
541 maybe_set_flag(&Py_DebugFlag, cmdline->debug);
542 maybe_set_flag(&Py_InspectFlag, cmdline->inspect);
543 maybe_set_flag(&Py_InteractiveFlag, cmdline->interactive);
544 maybe_set_flag(&Py_IsolatedFlag, cmdline->isolated);
545 maybe_set_flag(&Py_OptimizeFlag, cmdline->optimization_level);
546 maybe_set_flag(&Py_DontWriteBytecodeFlag, cmdline->dont_write_bytecode);
547 maybe_set_flag(&Py_NoUserSiteDirectory, cmdline->no_user_site_directory);
548 maybe_set_flag(&Py_NoSiteFlag, cmdline->no_site_import);
549 maybe_set_flag(&Py_UnbufferedStdioFlag, cmdline->use_unbuffered_io);
550 maybe_set_flag(&Py_VerboseFlag, cmdline->verbosity);
551 maybe_set_flag(&Py_QuietFlag, cmdline->quiet_flag);
Eric Snow6b4be192017-05-22 21:36:03 -0700552
553 /* TODO: Apply PYTHONWARNINGS & -W options to sys module here */
554 /* TODO: Apply -X options to sys module here */
555 return 0;
556}
557
558int
559Py_Main(int argc, wchar_t **argv)
560{
561 int c;
562 int sts;
563 FILE *fp = stdin;
564 char *p;
565#ifdef MS_WINDOWS
566 wchar_t *wp;
567#endif
568 int stdin_is_interactive = 0;
569 _Py_CommandLineDetails cmdline = _Py_CommandLineDetails_INIT;
Eric Snow1abcf672017-05-23 21:46:51 -0700570 _PyCoreConfig core_config = _PyCoreConfig_INIT;
Eric Snow6b4be192017-05-22 21:36:03 -0700571 PyCompilerFlags cf;
572 PyObject *main_importer_path = NULL;
573
574 cf.cf_flags = 0;
575
576 orig_argc = argc; /* For Py_GetArgcArgv() */
577 orig_argv = argv;
578
579 /* Hash randomization needed early for all string operations
580 (including -W and -X options). */
581 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
582 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
583 if (c == 'm' || c == 'c') {
584 /* -c / -m is the last option: following arguments are
585 not interpreter options. */
586 break;
587 }
588 if (c == 'E' || c == 'I') {
Eric Snow1abcf672017-05-23 21:46:51 -0700589 core_config.ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700590 break;
591 }
592 }
593
Eric Snow1abcf672017-05-23 21:46:51 -0700594 /* Initialize the core language runtime */
595 Py_IgnoreEnvironmentFlag = core_config.ignore_environment;
596 core_config._disable_importlib = 0;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600597 core_config.allocator = Py_GETENV("PYTHONMALLOC");
Eric Snow1abcf672017-05-23 21:46:51 -0700598 _Py_InitializeCore(&core_config);
599
Eric Snow6b4be192017-05-22 21:36:03 -0700600 /* Reprocess the command line with the language runtime available */
601 if (read_command_line(argc, argv, &cmdline)) {
602 return usage(2, argv[0]);
603 }
604
605 if (cmdline.print_help) {
606 return usage(0, argv[0]);
607 }
608
609 if (cmdline.print_version) {
610 printf("Python %s\n", cmdline.print_version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return 0;
612 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000613
Eric Snow6b4be192017-05-22 21:36:03 -0700614 PySys_ResetWarnOptions();
615 apply_command_line_and_environment(&cmdline);
Christian Heimes8dc226f2008-05-06 23:45:46 +0000616
Philip Jenveye53de3d2010-04-14 03:01:39 +0000617#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
619 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800620 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000621
Victor Stinner1a7425f2013-07-07 16:25:15 +0200622 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 if (buf == NULL)
624 Py_FatalError(
625 "not enough memory to copy PYTHONWARNINGS");
626 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800627 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800629 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 PySys_AddWarnOption(warning);
631 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200632 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000634#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
636 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000637 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* settle for strtok here as there's no one standard
640 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200641 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 if (buf == NULL)
643 Py_FatalError(
644 "not enough memory to copy PYTHONWARNINGS");
645 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200646 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 setlocale(LC_ALL, "");
648 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000649#ifdef __APPLE__
650 /* Use utf-8 on Mac OS X */
651 unicode = PyUnicode_FromString(p);
652#else
Victor Stinner1b579672011-12-17 05:47:23 +0100653 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000654#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100655 if (unicode == NULL) {
656 /* ignore errors */
657 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000658 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100659 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000660 PySys_AddWarnOptionUnicode(unicode);
661 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 }
663 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200664 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200665 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000667#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700668 if (cmdline.warning_options != NULL) {
Antoine Pitrou69994412014-04-29 00:56:08 +0200669 Py_ssize_t i;
Eric Snow6b4be192017-05-22 21:36:03 -0700670 for (i = 0; i < PyList_GET_SIZE(cmdline.warning_options); i++) {
671 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(cmdline.warning_options, i));
Antoine Pitrou69994412014-04-29 00:56:08 +0200672 }
Eric Snow1abcf672017-05-23 21:46:51 -0700673 Py_DECREF(cmdline.warning_options);
Antoine Pitrou69994412014-04-29 00:56:08 +0200674 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000677
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000678#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000679 /* don't translate newlines (\r\n <=> \n) */
680 _setmode(fileno(stdin), O_BINARY);
681 _setmode(fileno(stdout), O_BINARY);
682 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000683#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000684
685 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000686#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
688 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
689 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000690#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 setbuf(stdin, (char *)NULL);
692 setbuf(stdout, (char *)NULL);
693 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000694#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 }
696 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000697#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 /* Doesn't have to have line-buffered -- use unbuffered */
699 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
700 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000701#else /* !MS_WINDOWS */
702#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
704 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000705#endif /* HAVE_SETVBUF */
706#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 /* Leave stderr alone - it should be unbuffered anyway. */
708 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000709
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000710#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 /* On MacOS X, when the Python interpreter is embedded in an
712 application bundle, it gets executed by a bootstrapping script
713 that does os.execve() with an argv[0] that's different from the
714 actual Python executable. This is needed to keep the Finder happy,
715 or rather, to work around Apple's overly strict requirements of
716 the process name. However, we still need a usable sys.executable,
717 so the actual executable path is passed in an environment variable.
718 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
719 script. */
720 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
721 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200722 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000723
Victor Stinner1a7425f2013-07-07 16:25:15 +0200724 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 if (buffer == NULL) {
726 Py_FatalError(
727 "not enough memory to copy PYTHONEXECUTABLE");
728 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000729
Brett Cannonb94767f2011-02-22 20:15:44 +0000730 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 Py_SetProgramName(buffer);
732 /* buffer is now handed off - do not free */
733 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100734#ifdef WITH_NEXT_FRAMEWORK
735 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
736
737 if (pyvenv_launcher && *pyvenv_launcher) {
738 /* Used by Mac/Tools/pythonw.c to forward
739 * the argv0 of the stub executable
740 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200741 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100742
743 if (wbuf == NULL) {
744 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
745 }
746 Py_SetProgramName(wbuf);
747
748 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000749 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100750 */
751 } else {
752 Py_SetProgramName(argv[0]);
753 }
754#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000758#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000760#endif
Eric Snowc7ec9982017-05-23 23:00:52 -0700761 /* Replaces previous call to Py_Initialize()
762 *
763 * TODO: Move environment queries (etc) into Py_ReadConfig
764 */
765 {
766 _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
767
768 /* TODO: Moar config options! */
769 config.install_signal_handlers = 1;
770 /* TODO: Print any exceptions raised by these operations */
771 if (_Py_ReadMainInterpreterConfig(&config))
772 Py_FatalError("Py_Main: Py_ReadMainInterpreterConfig failed");
773 if (_Py_InitializeMainInterpreter(&config))
774 Py_FatalError("Py_Main: Py_InitializeMainInterpreter failed");
775 }
Guido van Rossumed52aac1997-07-19 19:20:32 +0000776
Eric Snow1abcf672017-05-23 21:46:51 -0700777 /* TODO: Move this to _PyRun_PrepareMain */
Georg Brandl8aa7e992010-12-28 18:30:18 +0000778 if (!Py_QuietFlag && (Py_VerboseFlag ||
Eric Snow6b4be192017-05-22 21:36:03 -0700779 (cmdline.command == NULL && cmdline.filename == NULL &&
780 cmdline.module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 fprintf(stderr, "Python %s on %s\n",
782 Py_GetVersion(), Py_GetPlatform());
783 if (!Py_NoSiteFlag)
784 fprintf(stderr, "%s\n", COPYRIGHT);
785 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000786
Eric Snow1abcf672017-05-23 21:46:51 -0700787 /* TODO: Move this to _Py_InitializeMainInterpreter */
Eric Snow6b4be192017-05-22 21:36:03 -0700788 if (cmdline.command != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
790 _PyOS_optind--;
791 argv[_PyOS_optind] = L"-c";
792 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000793
Eric Snow6b4be192017-05-22 21:36:03 -0700794 if (cmdline.module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000795 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000797 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000799
Eric Snow6b4be192017-05-22 21:36:03 -0700800 if (cmdline.filename != NULL) {
801 main_importer_path = AsImportPathEntry(cmdline.filename);
Nick Coghland2977a32017-03-12 20:38:32 +1000802 }
803
804 if (main_importer_path != NULL) {
805 /* Let RunMainFromImporter adjust sys.path[0] later */
806 PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0);
807 } else {
808 /* Use config settings to decide whether or not to update sys.path[0] */
809 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
810 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000811
Eric Snow6b4be192017-05-22 21:36:03 -0700812 if ((Py_InspectFlag || (cmdline.command == NULL &&
813 cmdline.filename == NULL &&
814 cmdline.module == NULL)) &&
815 isatty(fileno(stdin)) &&
816 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 PyObject *v;
818 v = PyImport_ImportModule("readline");
819 if (v == NULL)
820 PyErr_Clear();
821 else
822 Py_DECREF(v);
823 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000824
Eric Snow6b4be192017-05-22 21:36:03 -0700825 if (cmdline.command) {
826 sts = run_command(cmdline.command, &cf);
827 PyMem_RawFree(cmdline.command);
828 } else if (cmdline.module) {
829 sts = (RunModule(cmdline.module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 }
831 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000832
Eric Snow6b4be192017-05-22 21:36:03 -0700833 if (cmdline.filename == NULL && stdin_is_interactive) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 Py_InspectFlag = 0; /* do exit on SystemExit */
835 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200836 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 }
838 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000841
Nick Coghland2977a32017-03-12 20:38:32 +1000842 if (main_importer_path != NULL) {
843 sts = RunMainFromImporter(main_importer_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000845
Eric Snow6b4be192017-05-22 21:36:03 -0700846 if (sts==-1 && cmdline.filename != NULL) {
847 fp = _Py_wfopen(cmdline.filename, L"r");
Victor Stinner9a6692f2010-10-14 10:51:24 +0000848 if (fp == NULL) {
849 char *cfilename_buffer;
850 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100851 int err = errno;
Eric Snow6b4be192017-05-22 21:36:03 -0700852 cfilename_buffer = Py_EncodeLocale(cmdline.filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000853 if (cfilename_buffer != NULL)
854 cfilename = cfilename_buffer;
855 else
856 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100858 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000859 if (cfilename_buffer)
860 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 return 2;
862 }
Eric Snow6b4be192017-05-22 21:36:03 -0700863 else if (cmdline.skip_first_line) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 int ch;
865 /* Push back first newline so line numbers
866 remain the same */
867 while ((ch = getc(fp)) != EOF) {
868 if (ch == '\n') {
869 (void)ungetc(ch, fp);
870 break;
871 }
872 }
873 }
874 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800875 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200876 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200878 fprintf(stderr,
879 "%ls: '%ls' is a directory, cannot continue\n",
Eric Snow6b4be192017-05-22 21:36:03 -0700880 argv[0], cmdline.filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 fclose(fp);
882 return 1;
883 }
884 }
885 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000886
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000887 if (sts == -1)
Eric Snow6b4be192017-05-22 21:36:03 -0700888 sts = run_file(fp, cmdline.filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 /* Check this environment variable at the end, to give programs the
892 * opportunity to set it from Python.
893 */
894 if (!Py_InspectFlag &&
895 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
896 {
897 Py_InspectFlag = 1;
898 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 if (Py_InspectFlag && stdin_is_interactive &&
Eric Snow6b4be192017-05-22 21:36:03 -0700901 (cmdline.filename != NULL || cmdline.command != NULL || cmdline.module != NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200903 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 /* XXX */
905 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
906 }
907
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000908 if (Py_FinalizeEx() < 0) {
909 /* Value unlikely to be confused with a non-error exit status or
910 other special meaning */
911 sts = 120;
912 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000913
914#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 /* Insure++ is a memory analysis tool that aids in discovering
916 * memory leaks and other memory problems. On Python exit, the
917 * interned string dictionaries are flagged as being in use at exit
918 * (which it is). Under normal circumstances, this is fine because
919 * the memory will be automatically reclaimed by the system. Under
920 * memory debugging, it's a huge source of useless noise, so we
921 * trade off slower shutdown for less distraction in the memory
922 * reports. -baw
923 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000925#endif /* __INSURE__ */
926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000928}
929
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000930/* this is gonna seem *real weird*, but if you put some other code between
931 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
932 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000933
Guido van Rossum667d7041995-08-04 04:20:48 +0000934/* Make the *original* argc/argv available to other modules.
935 This is rare, but it is needed by the secureware extension. */
936
937void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000938Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 *argc = orig_argc;
941 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000942}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000943
944#ifdef __cplusplus
945}
946#endif