blob: 438cb2c63c90d87356ae7f8425f09170c07301a8 [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001/* Python interpreter main program */
2
3#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +00004#include "osdefs.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00005
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00006#include <locale.h>
7
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00008#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +00009#include <windows.h>
Steve Dowerbfce0f92016-12-28 15:41:09 -080010#ifdef HAVE_IO_H
11#include <io.h>
12#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000013#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000014#include <fcntl.h>
15#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000016#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000017
Martin v. Löwis945362c2007-08-30 14:57:25 +000018#ifdef _MSC_VER
19#include <crtdbg.h>
20#endif
21
Jesus Ceaab70e2a2012-10-05 01:48:08 +020022#if defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000023#define PYTHONHOMEHELP "<prefix>\\lib"
24#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000025#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000026#endif
27
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000028#include "pygetopt.h"
29
Guido van Rossuma22865e2000-09-05 04:41:18 +000030#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000031 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
32 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000033
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000034#ifdef __cplusplus
35extern "C" {
36#endif
37
Guido van Rossumac56b031996-07-21 02:33:38 +000038/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000039static wchar_t **orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000040static int orig_argc;
41
Guido van Rossumbceccf52001-04-10 22:07:43 +000042/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020043#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000044
Guido van Rossumbceccf52001-04-10 22:07:43 +000045#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000046
Guido van Rossum667d7041995-08-04 04:20:48 +000047/* Short usage message (with %s for argv0) */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020048static const char usage_line[] =
Martin v. Löwis790465f2008-04-05 20:41:37 +000049"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000050
51/* Long usage message, split into parts < 512 bytes */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020052static const char usage_1[] = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000053Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000054-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
55 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Xiang Zhang0710d752017-03-11 13:02:52 +080056-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000057-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000058-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000059-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000060-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000061";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020062static const char usage_2[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000063-i : inspect interactively after running script; forces a prompt even\n\
64 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020065-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000066-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000067-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000068-OO : remove doc-strings in addition to the -O optimizations\n\
Georg Brandl9d871192010-12-04 10:47:18 +000069-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +000070-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000071-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000072";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020073static const char usage_3[] = "\
Ezio Melotti61b0c672013-07-25 05:04:02 +020074-u : unbuffered binary stdout and stderr, stdin always buffered;\n\
75 also PYTHONUNBUFFERED=x\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000076 see man page for details on internal buffering relating to '-u'\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000077-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
78 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000079-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +090080 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000081-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +000082 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000083-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +000084-X opt : set implementation-specific option\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000085";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020086static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000087file : program read from script file\n\
88- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000089arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000090Other environment variables:\n\
91PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020092PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000093 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000094";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020095static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020096"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +000097" The default module search path uses %s.\n"
98"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
99"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be807c2016-03-14 12:04:26 +0100100"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
101static const char usage_6[] =
102"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
103" to seed the hashes of str, bytes and datetime objects. It can also be\n"
104" set to an integer in the range [0,4294967295] to get hash values with a\n"
105" predictable seed.\n"
106"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
107" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
108" hooks.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000109
Martin v. Löwis852ba7e2003-03-30 17:09:58 +0000110static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200111usage(int exitcode, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 FILE *f = exitcode ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 fprintf(f, usage_line, program);
116 if (exitcode)
117 fprintf(f, "Try `python -h' for more information.\n");
118 else {
119 fputs(usage_1, f);
120 fputs(usage_2, f);
121 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200122 fprintf(f, usage_4, (wint_t)DELIM);
123 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100124 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 return exitcode;
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000127}
128
Martin v. Löwis6caea372003-11-18 19:46:25 +0000129static void RunStartupFile(PyCompilerFlags *cf)
130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 char *startup = Py_GETENV("PYTHONSTARTUP");
132 if (startup != NULL && startup[0] != '\0') {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200133 FILE *fp = _Py_fopen(startup, "r");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 if (fp != NULL) {
135 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
136 PyErr_Clear();
137 fclose(fp);
138 } else {
139 int save_errno;
140
141 save_errno = errno;
142 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
143 errno = save_errno;
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +0300144 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 startup);
146 PyErr_Print();
147 PyErr_Clear();
148 }
149 }
Martin v. Löwis6caea372003-11-18 19:46:25 +0000150}
151
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200152static void RunInteractiveHook(void)
153{
154 PyObject *sys, *hook, *result;
155 sys = PyImport_ImportModule("sys");
156 if (sys == NULL)
157 goto error;
158 hook = PyObject_GetAttrString(sys, "__interactivehook__");
159 Py_DECREF(sys);
160 if (hook == NULL)
161 PyErr_Clear();
162 else {
Victor Stinnera5ed5f02016-12-06 18:45:50 +0100163 result = _PyObject_CallNoArg(hook);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200164 Py_DECREF(hook);
165 if (result == NULL)
166 goto error;
167 else
168 Py_DECREF(result);
169 }
170 return;
171
172error:
173 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
174 PyErr_Print();
175 PyErr_Clear();
176}
177
Thomas Woutersa9773292006-04-21 09:43:23 +0000178
Antoine Pitrou5651eaa2008-09-06 20:46:58 +0000179static int RunModule(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyObject *module, *runpy, *runmodule, *runargs, *result;
182 runpy = PyImport_ImportModule("runpy");
183 if (runpy == NULL) {
184 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200185 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 return -1;
187 }
188 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
189 if (runmodule == NULL) {
190 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200191 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 Py_DECREF(runpy);
193 return -1;
194 }
195 module = PyUnicode_FromWideChar(modname, wcslen(modname));
196 if (module == NULL) {
197 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200198 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 Py_DECREF(runpy);
200 Py_DECREF(runmodule);
201 return -1;
202 }
203 runargs = Py_BuildValue("(Oi)", module, set_argv0);
204 if (runargs == NULL) {
205 fprintf(stderr,
206 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200207 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 Py_DECREF(runpy);
209 Py_DECREF(runmodule);
210 Py_DECREF(module);
211 return -1;
212 }
213 result = PyObject_Call(runmodule, runargs, NULL);
214 if (result == NULL) {
215 PyErr_Print();
216 }
217 Py_DECREF(runpy);
218 Py_DECREF(runmodule);
219 Py_DECREF(module);
220 Py_DECREF(runargs);
221 if (result == NULL) {
222 return -1;
223 }
224 Py_DECREF(result);
225 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000226}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000227
Nick Coghland2977a32017-03-12 20:38:32 +1000228static PyObject *
229AsImportPathEntry(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000230{
Nick Coghland2977a32017-03-12 20:38:32 +1000231 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000232
Nick Coghland2977a32017-03-12 20:38:32 +1000233 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
234 if (sys_path0 == NULL)
Victor Stinner4726e402010-10-06 23:24:57 +0000235 goto error;
236
Nick Coghland2977a32017-03-12 20:38:32 +1000237 importer = PyImport_GetImporter(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000238 if (importer == NULL)
239 goto error;
240
Brett Cannonaa936422012-04-27 15:30:58 -0400241 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000242 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000243 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000244 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 }
Victor Stinner4726e402010-10-06 23:24:57 +0000246 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000247 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000248
Nick Coghland2977a32017-03-12 20:38:32 +1000249error:
250 Py_XDECREF(sys_path0);
251 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
252 PyErr_Print();
253 PyErr_Clear();
254 return NULL;
255}
256
257
258static int
259RunMainFromImporter(PyObject *sys_path0)
260{
261 PyObject *sys_path;
262 int sts;
263
264 /* Assume sys_path0 has already been checked by AsImportPathEntry,
265 * so put it in sys.path[0] and import __main__ */
Victor Stinnerbd303c12013-11-07 23:07:29 +0100266 sys_path = PySys_GetObject("path");
Victor Stinner1e53bba2013-07-16 22:26:05 +0200267 if (sys_path == NULL) {
268 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
Victor Stinner4726e402010-10-06 23:24:57 +0000269 goto error;
Victor Stinner1e53bba2013-07-16 22:26:05 +0200270 }
Nick Coghland2977a32017-03-12 20:38:32 +1000271 sts = PyList_Insert(sys_path, 0, sys_path0);
Steve Dower6d46ae72017-02-04 15:39:21 -0800272 if (sts) {
Nick Coghland2977a32017-03-12 20:38:32 +1000273 sys_path0 = NULL;
Victor Stinner4726e402010-10-06 23:24:57 +0000274 goto error;
275 }
Victor Stinner4726e402010-10-06 23:24:57 +0000276
277 sts = RunModule(L"__main__", 0);
278 return sts != 0;
279
280error:
Nick Coghland2977a32017-03-12 20:38:32 +1000281 Py_XDECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000282 PyErr_Print();
283 return 1;
Christian Heimes9cd17752007-11-18 19:35:23 +0000284}
285
Victor Stinnera62207c2010-08-07 10:57:17 +0000286static int
287run_command(wchar_t *command, PyCompilerFlags *cf)
288{
289 PyObject *unicode, *bytes;
290 int ret;
291
292 unicode = PyUnicode_FromWideChar(command, -1);
293 if (unicode == NULL)
294 goto error;
295 bytes = PyUnicode_AsUTF8String(unicode);
296 Py_DECREF(unicode);
297 if (bytes == NULL)
298 goto error;
299 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
300 Py_DECREF(bytes);
301 return ret != 0;
302
303error:
Victor Stinner398356b2010-08-18 22:23:22 +0000304 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000305 PyErr_Print();
306 return 1;
307}
308
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000309static int
310run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
311{
312 PyObject *unicode, *bytes = NULL;
313 char *filename_str;
314 int run;
315
316 /* call pending calls like signal handlers (SIGINT) */
317 if (Py_MakePendingCalls() == -1) {
318 PyErr_Print();
319 return 1;
320 }
321
322 if (filename) {
323 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
324 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000325 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000326 Py_DECREF(unicode);
327 }
328 if (bytes != NULL)
329 filename_str = PyBytes_AsString(bytes);
330 else {
331 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000332 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000333 }
334 }
335 else
336 filename_str = "<stdin>";
337
338 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
339 Py_XDECREF(bytes);
340 return run != 0;
341}
342
Christian Heimes9cd17752007-11-18 19:35:23 +0000343
Guido van Rossum667d7041995-08-04 04:20:48 +0000344/* Main program */
345
Eric Snow6b4be192017-05-22 21:36:03 -0700346/*TODO: Add arg processing to PEP 432 as a new configuration setup API
347 */
348typedef struct {
349 wchar_t *filename; /* Trailing arg without -c or -m */
350 wchar_t *command; /* -c argument */
351 wchar_t *module; /* -m argument */
352 PyObject *warning_options; /* -W options */
353 PyObject *extra_options; /* -X options */
354 int print_help; /* -h, -? options */
355 int print_version; /* -V option */
356 int bytes_warning; /* Py_BytesWarningFlag */
357 int debug; /* Py_DebugFlag */
358 int inspect; /* Py_InspectFlag */
359 int interactive; /* Py_InteractiveFlag */
360 int isolated; /* Py_IsolatedFlag */
361 int optimization_level; /* Py_OptimizeFlag */
362 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag */
363 int no_user_site_directory; /* Py_NoUserSiteDirectory */
364 int no_site_import; /* Py_NoSiteFlag */
365 int use_unbuffered_io; /* Py_UnbufferedStdioFlag */
366 int verbosity; /* Py_VerboseFlag */
367 int quiet_flag; /* Py_QuietFlag */
368 int skip_first_line; /* -x option */
369} _Py_CommandLineDetails;
370
371#define _Py_CommandLineDetails_INIT \
372 {NULL, NULL, NULL, NULL, NULL, \
373 0, 0, 0, 0, 0, 0, 0, 0, \
374 0, 0, 0, 0, 0, 0, 0}
375
376static int
377read_command_line(int argc, wchar_t **argv, _Py_CommandLineDetails *cmdline)
Guido van Rossum667d7041995-08-04 04:20:48 +0000378{
Antoine Pitrou69994412014-04-29 00:56:08 +0200379 PyObject *warning_option = NULL;
Eric Snow6b4be192017-05-22 21:36:03 -0700380 wchar_t *command = NULL;
381 wchar_t *module = NULL;
Eric Snowe0918ec2017-05-23 12:26:17 -0700382 int c;
Eric Snow6b4be192017-05-22 21:36:03 -0700383
Antoine Pitrou86838b02012-02-21 19:03:47 +0100384 _PyOS_ResetGetOpt();
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
387 if (c == 'c') {
388 size_t len;
389 /* -c is the last option; following arguments
390 that look like options are left for the
391 command to interpret. */
Amaury Forgeot d'Arc9a5499b2008-11-11 23:04:59 +0000392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 len = wcslen(_PyOS_optarg) + 1 + 1;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200394 command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 if (command == NULL)
396 Py_FatalError(
397 "not enough memory to copy -c argument");
398 wcscpy(command, _PyOS_optarg);
399 command[len - 2] = '\n';
400 command[len - 1] = 0;
Eric Snow6b4be192017-05-22 21:36:03 -0700401 cmdline->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 break;
403 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 if (c == 'm') {
406 /* -m is the last option; following arguments
407 that look like options are left for the
408 module to interpret. */
409 module = _PyOS_optarg;
Eric Snow6b4be192017-05-22 21:36:03 -0700410 cmdline->module = module;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 break;
412 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 switch (c) {
415 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700416 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700420 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700424 cmdline->inspect++;
425 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000427
Christian Heimesad73a9c2013-08-10 16:36:18 +0200428 case 'I':
Eric Snow6b4be192017-05-22 21:36:03 -0700429 cmdline->isolated++;
430 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200431 break;
432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700436 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700440 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700444 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700448 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 case 'E':
Eric Snow6b4be192017-05-22 21:36:03 -0700452 /* Handled prior to core initialization */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 case 't':
456 /* ignored for backwards compatibility */
457 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700460 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700464 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 case 'x':
Eric Snow6b4be192017-05-22 21:36:03 -0700468 cmdline->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 case 'h':
472 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700473 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700477 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 case 'W':
Eric Snow6b4be192017-05-22 21:36:03 -0700481 if (cmdline->warning_options == NULL)
482 cmdline->warning_options = PyList_New(0);
483 if (cmdline->warning_options == NULL)
Antoine Pitrou69994412014-04-29 00:56:08 +0200484 Py_FatalError("failure in handling of -W argument");
485 warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
486 if (warning_option == NULL)
487 Py_FatalError("failure in handling of -W argument");
Eric Snow6b4be192017-05-22 21:36:03 -0700488 if (PyList_Append(cmdline->warning_options, warning_option) == -1)
Christian Heimes27527072016-09-09 00:08:35 +0200489 Py_FatalError("failure in handling of -W argument");
Antoine Pitrou69994412014-04-29 00:56:08 +0200490 Py_DECREF(warning_option);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000492
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000493 case 'X':
Eric Snow6b4be192017-05-22 21:36:03 -0700494 /* TODO: Delay addition of X options to sys module */
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000495 PySys_AddXOption(_PyOS_optarg);
496 break;
497
Georg Brandl9d871192010-12-04 10:47:18 +0000498 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700499 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000500 break;
501
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100502 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500503 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100504 break;
505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 default:
Eric Snow6b4be192017-05-22 21:36:03 -0700509 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /*NOTREACHED*/
Guido van Rossum667d7041995-08-04 04:20:48 +0000511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 }
513 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000514
Eric Snow6b4be192017-05-22 21:36:03 -0700515 if (command == NULL && module == NULL && _PyOS_optind < argc &&
516 wcscmp(argv[_PyOS_optind], L"-") != 0)
517 {
518 cmdline->filename = argv[_PyOS_optind];
519 }
520 return 0;
521}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000522
Eric Snow6b4be192017-05-22 21:36:03 -0700523static int
524apply_command_line_and_environment(_Py_CommandLineDetails *cmdline)
525{
526 char *p;
527 Py_BytesWarningFlag = cmdline->bytes_warning;
528 Py_DebugFlag = cmdline->debug;
529 Py_InspectFlag = cmdline->inspect;
530 Py_InteractiveFlag = cmdline->interactive;
531 Py_IsolatedFlag = cmdline->isolated;
532 Py_OptimizeFlag = cmdline->optimization_level;
533 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
534 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
535 Py_NoSiteFlag = cmdline->no_site_import;
536 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
537 Py_VerboseFlag = cmdline->verbosity;
538 Py_QuietFlag = cmdline->quiet_flag;
539
540 if (!Py_InspectFlag &&
541 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') {
542 Py_InspectFlag = 1;
543 cmdline->inspect = 1;
544 }
545 if (!cmdline->use_unbuffered_io &&
546 (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') {
547 Py_UnbufferedStdioFlag = 1;
548 cmdline->use_unbuffered_io = 1;
549 }
550
551 if (!Py_NoUserSiteDirectory &&
552 (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0') {
553 Py_NoUserSiteDirectory = 1;
554 cmdline->no_user_site_directory = 1;
555 }
556
557 /* TODO: Apply PYTHONWARNINGS & -W options to sys module here */
558 /* TODO: Apply -X options to sys module here */
559 return 0;
560}
561
562int
563Py_Main(int argc, wchar_t **argv)
564{
565 int c;
566 int sts;
567 FILE *fp = stdin;
568 char *p;
569#ifdef MS_WINDOWS
570 wchar_t *wp;
571#endif
572 int stdin_is_interactive = 0;
573 _Py_CommandLineDetails cmdline = _Py_CommandLineDetails_INIT;
Eric Snow1abcf672017-05-23 21:46:51 -0700574 _PyCoreConfig core_config = _PyCoreConfig_INIT;
Eric Snow6b4be192017-05-22 21:36:03 -0700575 PyCompilerFlags cf;
576 PyObject *main_importer_path = NULL;
577
578 cf.cf_flags = 0;
579
580 orig_argc = argc; /* For Py_GetArgcArgv() */
581 orig_argv = argv;
582
583 /* Hash randomization needed early for all string operations
584 (including -W and -X options). */
585 _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
586 while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
587 if (c == 'm' || c == 'c') {
588 /* -c / -m is the last option: following arguments are
589 not interpreter options. */
590 break;
591 }
592 if (c == 'E' || c == 'I') {
Eric Snow1abcf672017-05-23 21:46:51 -0700593 core_config.ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700594 break;
595 }
596 }
597
Eric Snow1abcf672017-05-23 21:46:51 -0700598 char *pymalloc = Py_GETENV("PYTHONMALLOC");
599 if (_PyMem_SetupAllocators(pymalloc) < 0) {
600 fprintf(stderr,
601 "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", pymalloc);
602 exit(1);
603 }
604
605 /* Initialize the core language runtime */
606 Py_IgnoreEnvironmentFlag = core_config.ignore_environment;
607 core_config._disable_importlib = 0;
608 _Py_InitializeCore(&core_config);
609
Eric Snow6b4be192017-05-22 21:36:03 -0700610 /* Reprocess the command line with the language runtime available */
611 if (read_command_line(argc, argv, &cmdline)) {
612 return usage(2, argv[0]);
613 }
614
615 if (cmdline.print_help) {
616 return usage(0, argv[0]);
617 }
618
619 if (cmdline.print_version) {
620 printf("Python %s\n", cmdline.print_version >= 2 ? Py_GetVersion() : PY_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 return 0;
622 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000623
Eric Snow6b4be192017-05-22 21:36:03 -0700624 PySys_ResetWarnOptions();
625 apply_command_line_and_environment(&cmdline);
Christian Heimes8dc226f2008-05-06 23:45:46 +0000626
Philip Jenveye53de3d2010-04-14 03:01:39 +0000627#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
629 *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800630 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000631
Victor Stinner1a7425f2013-07-07 16:25:15 +0200632 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 if (buf == NULL)
634 Py_FatalError(
635 "not enough memory to copy PYTHONWARNINGS");
636 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800637 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800639 warning = wcstok_s(NULL, L",", &context)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 PySys_AddWarnOption(warning);
641 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200642 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000644#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
646 char *buf, *oldloc;
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000647 PyObject *unicode;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 /* settle for strtok here as there's no one standard
650 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200651 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 if (buf == NULL)
653 Py_FatalError(
654 "not enough memory to copy PYTHONWARNINGS");
655 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200656 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 setlocale(LC_ALL, "");
658 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinner5c848a82010-09-12 08:00:41 +0000659#ifdef __APPLE__
660 /* Use utf-8 on Mac OS X */
661 unicode = PyUnicode_FromString(p);
662#else
Victor Stinner1b579672011-12-17 05:47:23 +0100663 unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
Victor Stinner5c848a82010-09-12 08:00:41 +0000664#endif
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100665 if (unicode == NULL) {
666 /* ignore errors */
667 PyErr_Clear();
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000668 continue;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100669 }
Victor Stinnerc2d76fd2010-09-10 23:13:52 +0000670 PySys_AddWarnOptionUnicode(unicode);
671 Py_DECREF(unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 }
673 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200674 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200675 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000677#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700678 if (cmdline.warning_options != NULL) {
Antoine Pitrou69994412014-04-29 00:56:08 +0200679 Py_ssize_t i;
Eric Snow6b4be192017-05-22 21:36:03 -0700680 for (i = 0; i < PyList_GET_SIZE(cmdline.warning_options); i++) {
681 PySys_AddWarnOptionUnicode(PyList_GET_ITEM(cmdline.warning_options, i));
Antoine Pitrou69994412014-04-29 00:56:08 +0200682 }
Eric Snow1abcf672017-05-23 21:46:51 -0700683 Py_DECREF(cmdline.warning_options);
Antoine Pitrou69994412014-04-29 00:56:08 +0200684 }
Philip Jenvey0805ca32010-04-07 04:04:10 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
Guido van Rossum775af911997-02-14 19:50:32 +0000687
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000688#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000689 /* don't translate newlines (\r\n <=> \n) */
690 _setmode(fileno(stdin), O_BINARY);
691 _setmode(fileno(stdout), O_BINARY);
692 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000693#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000694
695 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000696#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
698 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
699 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000700#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 setbuf(stdin, (char *)NULL);
702 setbuf(stdout, (char *)NULL);
703 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000704#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 }
706 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000707#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 /* Doesn't have to have line-buffered -- use unbuffered */
709 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
710 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000711#else /* !MS_WINDOWS */
712#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
714 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000715#endif /* HAVE_SETVBUF */
716#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* Leave stderr alone - it should be unbuffered anyway. */
718 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000719
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000720#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 /* On MacOS X, when the Python interpreter is embedded in an
722 application bundle, it gets executed by a bootstrapping script
723 that does os.execve() with an argv[0] that's different from the
724 actual Python executable. This is needed to keep the Finder happy,
725 or rather, to work around Apple's overly strict requirements of
726 the process name. However, we still need a usable sys.executable,
727 so the actual executable path is passed in an environment variable.
728 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
729 script. */
730 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
731 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200732 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000733
Victor Stinner1a7425f2013-07-07 16:25:15 +0200734 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if (buffer == NULL) {
736 Py_FatalError(
737 "not enough memory to copy PYTHONEXECUTABLE");
738 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000739
Brett Cannonb94767f2011-02-22 20:15:44 +0000740 mbstowcs(buffer, p, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 Py_SetProgramName(buffer);
742 /* buffer is now handed off - do not free */
743 } else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100744#ifdef WITH_NEXT_FRAMEWORK
745 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
746
747 if (pyvenv_launcher && *pyvenv_launcher) {
748 /* Used by Mac/Tools/pythonw.c to forward
749 * the argv0 of the stub executable
750 */
Victor Stinnerf6a271a2014-08-01 12:28:48 +0200751 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
Vinay Sajip90db6612012-07-17 17:33:46 +0100752
753 if (wbuf == NULL) {
754 Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
755 }
756 Py_SetProgramName(wbuf);
757
758 /* Don't free wbuf, the argument to Py_SetProgramName
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000759 * must remain valid until Py_FinalizeEx is called.
Vinay Sajip90db6612012-07-17 17:33:46 +0100760 */
761 } else {
762 Py_SetProgramName(argv[0]);
763 }
764#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 Py_SetProgramName(argv[0]);
Vinay Sajip90db6612012-07-17 17:33:46 +0100766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 }
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000768#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 Py_SetProgramName(argv[0]);
Jack Jansenfbd861b2003-03-05 16:00:15 +0000770#endif
Eric Snowc7ec9982017-05-23 23:00:52 -0700771 /* Replaces previous call to Py_Initialize()
772 *
773 * TODO: Move environment queries (etc) into Py_ReadConfig
774 */
775 {
776 _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
777
778 /* TODO: Moar config options! */
779 config.install_signal_handlers = 1;
780 /* TODO: Print any exceptions raised by these operations */
781 if (_Py_ReadMainInterpreterConfig(&config))
782 Py_FatalError("Py_Main: Py_ReadMainInterpreterConfig failed");
783 if (_Py_InitializeMainInterpreter(&config))
784 Py_FatalError("Py_Main: Py_InitializeMainInterpreter failed");
785 }
Guido van Rossumed52aac1997-07-19 19:20:32 +0000786
Eric Snow1abcf672017-05-23 21:46:51 -0700787 /* TODO: Move this to _PyRun_PrepareMain */
Georg Brandl8aa7e992010-12-28 18:30:18 +0000788 if (!Py_QuietFlag && (Py_VerboseFlag ||
Eric Snow6b4be192017-05-22 21:36:03 -0700789 (cmdline.command == NULL && cmdline.filename == NULL &&
790 cmdline.module == NULL && stdin_is_interactive))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 fprintf(stderr, "Python %s on %s\n",
792 Py_GetVersion(), Py_GetPlatform());
793 if (!Py_NoSiteFlag)
794 fprintf(stderr, "%s\n", COPYRIGHT);
795 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000796
Eric Snow1abcf672017-05-23 21:46:51 -0700797 /* TODO: Move this to _Py_InitializeMainInterpreter */
Eric Snow6b4be192017-05-22 21:36:03 -0700798 if (cmdline.command != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
800 _PyOS_optind--;
801 argv[_PyOS_optind] = L"-c";
802 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000803
Eric Snow6b4be192017-05-22 21:36:03 -0700804 if (cmdline.module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +0000805 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 _PyOS_optind--;
Nick Coghland26c18a2010-08-17 13:06:11 +0000807 argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000809
Eric Snow6b4be192017-05-22 21:36:03 -0700810 if (cmdline.filename != NULL) {
811 main_importer_path = AsImportPathEntry(cmdline.filename);
Nick Coghland2977a32017-03-12 20:38:32 +1000812 }
813
814 if (main_importer_path != NULL) {
815 /* Let RunMainFromImporter adjust sys.path[0] later */
816 PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0);
817 } else {
818 /* Use config settings to decide whether or not to update sys.path[0] */
819 PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
820 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000821
Eric Snow6b4be192017-05-22 21:36:03 -0700822 if ((Py_InspectFlag || (cmdline.command == NULL &&
823 cmdline.filename == NULL &&
824 cmdline.module == NULL)) &&
825 isatty(fileno(stdin)) &&
826 !Py_IsolatedFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 PyObject *v;
828 v = PyImport_ImportModule("readline");
829 if (v == NULL)
830 PyErr_Clear();
831 else
832 Py_DECREF(v);
833 }
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000834
Eric Snow6b4be192017-05-22 21:36:03 -0700835 if (cmdline.command) {
836 sts = run_command(cmdline.command, &cf);
837 PyMem_RawFree(cmdline.command);
838 } else if (cmdline.module) {
839 sts = (RunModule(cmdline.module, 1) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 }
841 else {
Christian Heimes9cd17752007-11-18 19:35:23 +0000842
Eric Snow6b4be192017-05-22 21:36:03 -0700843 if (cmdline.filename == NULL && stdin_is_interactive) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 Py_InspectFlag = 0; /* do exit on SystemExit */
845 RunStartupFile(&cf);
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200846 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 }
848 /* XXX */
Christian Heimes9cd17752007-11-18 19:35:23 +0000849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 sts = -1; /* keep track of whether we've already run __main__ */
Christian Heimes9cd17752007-11-18 19:35:23 +0000851
Nick Coghland2977a32017-03-12 20:38:32 +1000852 if (main_importer_path != NULL) {
853 sts = RunMainFromImporter(main_importer_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000855
Eric Snow6b4be192017-05-22 21:36:03 -0700856 if (sts==-1 && cmdline.filename != NULL) {
857 fp = _Py_wfopen(cmdline.filename, L"r");
Victor Stinner9a6692f2010-10-14 10:51:24 +0000858 if (fp == NULL) {
859 char *cfilename_buffer;
860 const char *cfilename;
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100861 int err = errno;
Eric Snow6b4be192017-05-22 21:36:03 -0700862 cfilename_buffer = Py_EncodeLocale(cmdline.filename, NULL);
Victor Stinner9a6692f2010-10-14 10:51:24 +0000863 if (cfilename_buffer != NULL)
864 cfilename = cfilename_buffer;
865 else
866 cfilename = "<unprintable file name>";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Antoine Pitrouc345ce12011-12-16 12:28:32 +0100868 argv[0], cfilename, err, strerror(err));
Victor Stinner9a6692f2010-10-14 10:51:24 +0000869 if (cfilename_buffer)
870 PyMem_Free(cfilename_buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 return 2;
872 }
Eric Snow6b4be192017-05-22 21:36:03 -0700873 else if (cmdline.skip_first_line) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 int ch;
875 /* Push back first newline so line numbers
876 remain the same */
877 while ((ch = getc(fp)) != EOF) {
878 if (ch == '\n') {
879 (void)ungetc(ch, fp);
880 break;
881 }
882 }
883 }
884 {
Steve Dowerf2f373f2015-02-21 08:44:05 -0800885 struct _Py_stat_struct sb;
Victor Stinnere134a7f2015-03-30 10:09:31 +0200886 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 S_ISDIR(sb.st_mode)) {
Victor Stinnere134a7f2015-03-30 10:09:31 +0200888 fprintf(stderr,
889 "%ls: '%ls' is a directory, cannot continue\n",
Eric Snow6b4be192017-05-22 21:36:03 -0700890 argv[0], cmdline.filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 fclose(fp);
892 return 1;
893 }
894 }
895 }
Christian Heimes9cd17752007-11-18 19:35:23 +0000896
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000897 if (sts == -1)
Eric Snow6b4be192017-05-22 21:36:03 -0700898 sts = run_file(fp, cmdline.filename, &cf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 }
Barry Warsawd86dcd32003-06-29 17:07:06 +0000900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 /* Check this environment variable at the end, to give programs the
902 * opportunity to set it from Python.
903 */
904 if (!Py_InspectFlag &&
905 (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
906 {
907 Py_InspectFlag = 1;
908 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 if (Py_InspectFlag && stdin_is_interactive &&
Eric Snow6b4be192017-05-22 21:36:03 -0700911 (cmdline.filename != NULL || cmdline.command != NULL || cmdline.module != NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 Py_InspectFlag = 0;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200913 RunInteractiveHook();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 /* XXX */
915 sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
916 }
917
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000918 if (Py_FinalizeEx() < 0) {
919 /* Value unlikely to be confused with a non-error exit status or
920 other special meaning */
921 sts = 120;
922 }
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000923
924#ifdef __INSURE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 /* Insure++ is a memory analysis tool that aids in discovering
926 * memory leaks and other memory problems. On Python exit, the
927 * interned string dictionaries are flagged as being in use at exit
928 * (which it is). Under normal circumstances, this is fine because
929 * the memory will be automatically reclaimed by the system. Under
930 * memory debugging, it's a huge source of useless noise, so we
931 * trade off slower shutdown for less distraction in the memory
932 * reports. -baw
933 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 _Py_ReleaseInternedUnicodeStrings();
Barry Warsaw3e13b1e2001-02-23 16:46:39 +0000935#endif /* __INSURE__ */
936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000938}
939
Skip Montanaro786ea6b2004-03-01 15:44:05 +0000940/* this is gonna seem *real weird*, but if you put some other code between
941 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
942 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +0000943
Guido van Rossum667d7041995-08-04 04:20:48 +0000944/* Make the *original* argc/argv available to other modules.
945 This is rare, but it is needed by the secureware extension. */
946
947void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000948Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 *argc = orig_argc;
951 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000952}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000953
954#ifdef __cplusplus
955}
956#endif