blob: e86211331047ee68898d2a2cbe38346aa58737ec [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
Eric Snow6b4be192017-05-22 21:36:03 -0700525static int
526apply_command_line_and_environment(_Py_CommandLineDetails *cmdline)
527{
528 char *p;
529 Py_BytesWarningFlag = cmdline->bytes_warning;
530 Py_DebugFlag = cmdline->debug;
531 Py_InspectFlag = cmdline->inspect;
532 Py_InteractiveFlag = cmdline->interactive;
533 Py_IsolatedFlag = cmdline->isolated;
534 Py_OptimizeFlag = cmdline->optimization_level;
535 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
536 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
537 Py_NoSiteFlag = cmdline->no_site_import;
538 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
539 Py_VerboseFlag = cmdline->verbosity;
540 Py_QuietFlag = cmdline->quiet_flag;
541
542 if (!Py_InspectFlag &&
543 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') {
544 Py_InspectFlag = 1;
545 cmdline->inspect = 1;
546 }
547 if (!cmdline->use_unbuffered_io &&
548 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') {
549 Py_UnbufferedStdioFlag = 1;
550 cmdline->use_unbuffered_io = 1;
551 }
552
553 if (!Py_NoUserSiteDirectory &&
554 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0') {
555 Py_NoUserSiteDirectory = 1;
556 cmdline->no_user_site_directory = 1;
557 }
558
559 /* TODO: Apply PYTHONWARNINGS & -W options to sys module here */
560 /* TODO: Apply -X options to sys module here */
561 return 0;
562}
563
564int
565Py_Main(int argc, wchar_t **argv)
566{
567 int c;
568 int sts;
569 FILE *fp = stdin;
570 char *p;
571#ifdef MS_WINDOWS
572 wchar_t *wp;
573#endif
574 int stdin_is_interactive = 0;
575 _Py_CommandLineDetails cmdline = _Py_CommandLineDetails_INIT;
Eric Snow1abcf672017-05-23 21:46:51 -0700576 _PyCoreConfig core_config = _PyCoreConfig_INIT;
Eric Snow6b4be192017-05-22 21:36:03 -0700577 PyCompilerFlags cf;
578 PyObject *main_importer_path = NULL;
579
580 cf.cf_flags = 0;
581
582 orig_argc = argc; /* For Py_GetArgcArgv() */
583 orig_argv = argv;
584
585 /* Hash randomization needed early for all string operations
586 (including -W and -X options). */
587 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
588 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
589 if (c == 'm' || c == 'c') {
590 /* -c / -m is the last option: following arguments are
591 not interpreter options. */
592 break;
593 }
594 if (c == 'E' || c == 'I') {
Eric Snow1abcf672017-05-23 21:46:51 -0700595 core_config.ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700596 break;
597 }
598 }
599
Eric Snow1abcf672017-05-23 21:46:51 -0700600 /* Initialize the core language runtime */
601 Py_IgnoreEnvironmentFlag = core_config.ignore_environment;
602 core_config._disable_importlib = 0;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600603 core_config.allocator = Py_GETENV("PYTHONMALLOC");
Eric Snow1abcf672017-05-23 21:46:51 -0700604 _Py_InitializeCore(&core_config);
605
Eric Snow6b4be192017-05-22 21:36:03 -0700606 /* Reprocess the command line with the language runtime available */
607 if (read_command_line(argc, argv, &cmdline)) {
608 return usage(2, argv[0]);
609 }
610
611 if (cmdline.print_help) {
612 return usage(0, argv[0]);
613 }
614
615 if (cmdline.print_version) {
616 printf("Python %s\n", cmdline.print_version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return 0;
618 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000619
Eric Snow6b4be192017-05-22 21:36:03 -0700620 PySys_ResetWarnOptions();
621 apply_command_line_and_environment(&cmdline);
Christian Heimes8dc226f2008-05-06 23:45:46 +0000622
Philip Jenveye53de3d2010-04-14 03:01:39 +0000623#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
625 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800626 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000627
Victor Stinner1a7425f2013-07-07 16:25:15 +0200628 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 if (buf == NULL)
630 Py_FatalError(
631 "not enough memory to copy PYTHONWARNINGS");
632 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800633 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800635 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 PySys_AddWarnOption(warning);
637 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200638 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000640#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
642 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000643 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* settle for strtok here as there's no one standard
646 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200647 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 if (buf == NULL)
649 Py_FatalError(
650 "not enough memory to copy PYTHONWARNINGS");
651 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200652 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 setlocale(LC_ALL, "");
654 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000655#ifdef __APPLE__
656 /* Use utf-8 on Mac OS X */
657 unicode = PyUnicode_FromString(p);
658#else
Victor Stinner1b579672011-12-17 05:47:23 +0100659 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000660#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100661 if (unicode == NULL) {
662 /* ignore errors */
663 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000664 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100665 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000666 PySys_AddWarnOptionUnicode(unicode);
667 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 }
669 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200670 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200671 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000673#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700674 if (cmdline.warning_options != NULL) {
Antoine Pitrou69994412014-04-29 00:56:08 +0200675 Py_ssize_t i;
Eric Snow6b4be192017-05-22 21:36:03 -0700676 for (i = 0; i < PyList_GET_SIZE(cmdline.warning_options); i++) {
677 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(cmdline.warning_options, i));
Antoine Pitrou69994412014-04-29 00:56:08 +0200678 }
Eric Snow1abcf672017-05-23 21:46:51 -0700679 Py_DECREF(cmdline.warning_options);
Antoine Pitrou69994412014-04-29 00:56:08 +0200680 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000683
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000684#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000685 /* don't translate newlines (\r\n <=> \n) */
686 _setmode(fileno(stdin), O_BINARY);
687 _setmode(fileno(stdout), O_BINARY);
688 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000689#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000690
691 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000692#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
694 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
695 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000696#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 setbuf(stdin, (char *)NULL);
698 setbuf(stdout, (char *)NULL);
699 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000700#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 }
702 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000703#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 /* Doesn't have to have line-buffered -- use unbuffered */
705 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
706 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000707#else /* !MS_WINDOWS */
708#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
710 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000711#endif /* HAVE_SETVBUF */
712#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 /* Leave stderr alone - it should be unbuffered anyway. */
714 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000715
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000716#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* On MacOS X, when the Python interpreter is embedded in an
718 application bundle, it gets executed by a bootstrapping script
719 that does os.execve() with an argv[0] that's different from the
720 actual Python executable. This is needed to keep the Finder happy,
721 or rather, to work around Apple's overly strict requirements of
722 the process name. However, we still need a usable sys.executable,
723 so the actual executable path is passed in an environment variable.
724 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
725 script. */
726 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
727 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200728 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000729
Victor Stinner1a7425f2013-07-07 16:25:15 +0200730 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 if (buffer == NULL) {
732 Py_FatalError(
733 "not enough memory to copy PYTHONEXECUTABLE");
734 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000735
Brett Cannonb94767f2011-02-22 20:15:44 +0000736 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 Py_SetProgramName(buffer);
738 /* buffer is now handed off - do not free */
739 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100740#ifdef WITH_NEXT_FRAMEWORK
741 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
742
743 if (pyvenv_launcher && *pyvenv_launcher) {
744 /* Used by Mac/Tools/pythonw.c to forward
745 * the argv0 of the stub executable
746 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200747 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100748
749 if (wbuf == NULL) {
750 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
751 }
752 Py_SetProgramName(wbuf);
753
754 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000755 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100756 */
757 } else {
758 Py_SetProgramName(argv[0]);
759 }
760#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000764#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000766#endif
Eric Snowc7ec9982017-05-23 23:00:52 -0700767 /* Replaces previous call to Py_Initialize()
768 *
769 * TODO: Move environment queries (etc) into Py_ReadConfig
770 */
771 {
772 _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
773
774 /* TODO: Moar config options! */
775 config.install_signal_handlers = 1;
776 /* TODO: Print any exceptions raised by these operations */
777 if (_Py_ReadMainInterpreterConfig(&config))
778 Py_FatalError("Py_Main: Py_ReadMainInterpreterConfig failed");
779 if (_Py_InitializeMainInterpreter(&config))
780 Py_FatalError("Py_Main: Py_InitializeMainInterpreter failed");
781 }
Guido van Rossumed52aac1997-07-19 19:20:32 +0000782
Eric Snow1abcf672017-05-23 21:46:51 -0700783 /* TODO: Move this to _PyRun_PrepareMain */
Georg Brandl8aa7e992010-12-28 18:30:18 +0000784 if (!Py_QuietFlag && (Py_VerboseFlag ||
Eric Snow6b4be192017-05-22 21:36:03 -0700785 (cmdline.command == NULL && cmdline.filename == NULL &&
786 cmdline.module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 fprintf(stderr, "Python %s on %s\n",
788 Py_GetVersion(), Py_GetPlatform());
789 if (!Py_NoSiteFlag)
790 fprintf(stderr, "%s\n", COPYRIGHT);
791 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000792
Eric Snow1abcf672017-05-23 21:46:51 -0700793 /* TODO: Move this to _Py_InitializeMainInterpreter */
Eric Snow6b4be192017-05-22 21:36:03 -0700794 if (cmdline.command != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
796 _PyOS_optind--;
797 argv[_PyOS_optind] = L"-c";
798 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000799
Eric Snow6b4be192017-05-22 21:36:03 -0700800 if (cmdline.module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000801 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000803 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000805
Eric Snow6b4be192017-05-22 21:36:03 -0700806 if (cmdline.filename != NULL) {
807 main_importer_path = AsImportPathEntry(cmdline.filename);
Nick Coghland2977a32017-03-12 20:38:32 +1000808 }
809
810 if (main_importer_path != NULL) {
811 /* Let RunMainFromImporter adjust sys.path[0] later */
812 PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0);
813 } else {
814 /* Use config settings to decide whether or not to update sys.path[0] */
815 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
816 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000817
Eric Snow6b4be192017-05-22 21:36:03 -0700818 if ((Py_InspectFlag || (cmdline.command == NULL &&
819 cmdline.filename == NULL &&
820 cmdline.module == NULL)) &&
821 isatty(fileno(stdin)) &&
822 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 PyObject *v;
824 v = PyImport_ImportModule("readline");
825 if (v == NULL)
826 PyErr_Clear();
827 else
828 Py_DECREF(v);
829 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000830
Eric Snow6b4be192017-05-22 21:36:03 -0700831 if (cmdline.command) {
832 sts = run_command(cmdline.command, &cf);
833 PyMem_RawFree(cmdline.command);
834 } else if (cmdline.module) {
835 sts = (RunModule(cmdline.module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 }
837 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000838
Eric Snow6b4be192017-05-22 21:36:03 -0700839 if (cmdline.filename == NULL && stdin_is_interactive) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 Py_InspectFlag = 0; /* do exit on SystemExit */
841 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200842 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 }
844 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000847
Nick Coghland2977a32017-03-12 20:38:32 +1000848 if (main_importer_path != NULL) {
849 sts = RunMainFromImporter(main_importer_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000851
Eric Snow6b4be192017-05-22 21:36:03 -0700852 if (sts==-1 && cmdline.filename != NULL) {
853 fp = _Py_wfopen(cmdline.filename, L"r");
Victor Stinner9a6692f2010-10-14 10:51:24 +0000854 if (fp == NULL) {
855 char *cfilename_buffer;
856 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100857 int err = errno;
Eric Snow6b4be192017-05-22 21:36:03 -0700858 cfilename_buffer = Py_EncodeLocale(cmdline.filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000859 if (cfilename_buffer != NULL)
860 cfilename = cfilename_buffer;
861 else
862 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100864 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000865 if (cfilename_buffer)
866 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 return 2;
868 }
Eric Snow6b4be192017-05-22 21:36:03 -0700869 else if (cmdline.skip_first_line) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 int ch;
871 /* Push back first newline so line numbers
872 remain the same */
873 while ((ch = getc(fp)) != EOF) {
874 if (ch == '\n') {
875 (void)ungetc(ch, fp);
876 break;
877 }
878 }
879 }
880 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800881 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200882 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200884 fprintf(stderr,
885 "%ls: '%ls' is a directory, cannot continue\n",
Eric Snow6b4be192017-05-22 21:36:03 -0700886 argv[0], cmdline.filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 fclose(fp);
888 return 1;
889 }
890 }
891 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000892
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000893 if (sts == -1)
Eric Snow6b4be192017-05-22 21:36:03 -0700894 sts = run_file(fp, cmdline.filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 /* Check this environment variable at the end, to give programs the
898 * opportunity to set it from Python.
899 */
900 if (!Py_InspectFlag &&
901 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
902 {
903 Py_InspectFlag = 1;
904 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 if (Py_InspectFlag && stdin_is_interactive &&
Eric Snow6b4be192017-05-22 21:36:03 -0700907 (cmdline.filename != NULL || cmdline.command != NULL || cmdline.module != NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200909 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 /* XXX */
911 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
912 }
913
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000914 if (Py_FinalizeEx() < 0) {
915 /* Value unlikely to be confused with a non-error exit status or
916 other special meaning */
917 sts = 120;
918 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000919
920#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 /* Insure++ is a memory analysis tool that aids in discovering
922 * memory leaks and other memory problems. On Python exit, the
923 * interned string dictionaries are flagged as being in use at exit
924 * (which it is). Under normal circumstances, this is fine because
925 * the memory will be automatically reclaimed by the system. Under
926 * memory debugging, it's a huge source of useless noise, so we
927 * trade off slower shutdown for less distraction in the memory
928 * reports. -baw
929 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000931#endif /* __INSURE__ */
932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000934}
935
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000936/* this is gonna seem *real weird*, but if you put some other code between
937 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
938 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000939
Guido van Rossum667d7041995-08-04 04:20:48 +0000940/* Make the *original* argc/argv available to other modules.
941 This is rare, but it is needed by the secureware extension. */
942
943void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000944Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 *argc = orig_argc;
947 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000948}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000949
950#ifdef __cplusplus
951}
952#endif