blob: 1b1d8041ef114ff05dab23fb4867f4473dc78867 [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"
Victor Stinnerf7e5b562017-11-15 15:48:08 -08005#include "internal/pystate.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00006
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00007#include <locale.h>
8
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00009#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +000010#include <windows.h>
Steve Dowerbfce0f92016-12-28 15:41:09 -080011#ifdef HAVE_IO_H
12#include <io.h>
13#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000014#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000015#include <fcntl.h>
16#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000017#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000018
Martin v. Löwis945362c2007-08-30 14:57:25 +000019#ifdef _MSC_VER
20#include <crtdbg.h>
21#endif
22
Jesus Ceaab70e2a2012-10-05 01:48:08 +020023#if defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000024#define PYTHONHOMEHELP "<prefix>\\lib"
25#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000026#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000027#endif
28
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000029#include "pygetopt.h"
30
Guido van Rossuma22865e2000-09-05 04:41:18 +000031#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000032 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
33 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000034
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000035#ifdef __cplusplus
36extern "C" {
37#endif
38
Victor Stinner46972b72017-11-24 22:55:40 +010039#define DECODE_LOCALE_ERR(NAME, LEN) \
40 (((LEN) == -2) \
Victor Stinner9316ee42017-11-25 03:17:57 +010041 ? _Py_INIT_USER_ERR("cannot decode " #NAME) \
Victor Stinner46972b72017-11-24 22:55:40 +010042 : _Py_INIT_NO_MEMORY())
43
44
Victor Stinner0327bde2017-11-23 17:03:20 +010045#define SET_DECODE_ERROR(NAME, LEN) \
46 do { \
47 if ((LEN) == (size_t)-2) { \
Victor Stinner9316ee42017-11-25 03:17:57 +010048 pymain->err = _Py_INIT_USER_ERR("cannot decode " #NAME); \
Victor Stinner0327bde2017-11-23 17:03:20 +010049 } \
50 else { \
51 pymain->err = _Py_INIT_NO_MEMORY(); \
52 } \
53 } while (0)
54
Guido van Rossumac56b031996-07-21 02:33:38 +000055/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000056static wchar_t **orig_argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080057static int orig_argc;
Guido van Rossum667d7041995-08-04 04:20:48 +000058
Guido van Rossumbceccf52001-04-10 22:07:43 +000059/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020060#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000061
Guido van Rossumbceccf52001-04-10 22:07:43 +000062#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000063
Guido van Rossum667d7041995-08-04 04:20:48 +000064/* Short usage message (with %s for argv0) */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020065static const char usage_line[] =
Martin v. Löwis790465f2008-04-05 20:41:37 +000066"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000067
68/* Long usage message, split into parts < 512 bytes */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020069static const char usage_1[] = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000070Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000071-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
72 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Xiang Zhang0710d752017-03-11 13:02:52 +080073-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000074-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000075-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000076-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000077-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000078";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020079static const char usage_2[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000080-i : inspect interactively after running script; forces a prompt even\n\
81 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020082-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000083-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000084-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000085-OO : remove doc-strings in addition to the -O optimizations\n\
Georg Brandl9d871192010-12-04 10:47:18 +000086-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +000087-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000088-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000089";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020090static const char usage_3[] = "\
Berker Peksag7f580972017-10-13 15:16:31 +030091-u : force the stdout and stderr streams to be unbuffered;\n\
92 this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000093-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
94 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000095-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +090096 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000097-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +000098 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000099-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000100-X opt : set implementation-specific option\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +0000101";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200102static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +0000103file : program read from script file\n\
104- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000105arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000106Other environment variables:\n\
107PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200108PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000109 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +0000110";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200111static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200112"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +0000113" The default module search path uses %s.\n"
114"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
115"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be807c2016-03-14 12:04:26 +0100116"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
117static const char usage_6[] =
118"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
119" to seed the hashes of str, bytes and datetime objects. It can also be\n"
120" set to an integer in the range [0,4294967295] to get hash values with a\n"
121" predictable seed.\n"
122"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
123" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000124" hooks.\n"
Stéphane Wirtel7d1017d2017-06-12 13:30:33 +0200125"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000126" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
127" locale coercion and locale compatibility warnings on stderr.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000128
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800129static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800130pymain_usage(int error, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000131{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800132 FILE *f = error ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 fprintf(f, usage_line, program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800135 if (error)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 fprintf(f, "Try `python -h' for more information.\n");
137 else {
138 fputs(usage_1, f);
139 fputs(usage_2, f);
140 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200141 fprintf(f, usage_4, (wint_t)DELIM);
142 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100143 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000145}
146
Victor Stinnera7368ac2017-11-15 18:11:45 -0800147
148static char*
149pymain_get_env_var(const char *name)
150{
151 char *var = Py_GETENV(name);
152 if (var && var[0] != '\0') {
153 return var;
154 }
155 else {
156 return NULL;
157 }
158}
159
160
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800161static void
162pymain_run_statup(PyCompilerFlags *cf)
Martin v. Löwis6caea372003-11-18 19:46:25 +0000163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 char *startup = Py_GETENV("PYTHONSTARTUP");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800165 if (startup == NULL || startup[0] == '\0') {
166 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800168
169 FILE *fp = _Py_fopen(startup, "r");
170 if (fp == NULL) {
171 int save_errno = errno;
172 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
173 errno = save_errno;
174
175 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
176 startup);
177 PyErr_Print();
178 PyErr_Clear();
179 return;
180 }
181
182 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
183 PyErr_Clear();
184 fclose(fp);
Martin v. Löwis6caea372003-11-18 19:46:25 +0000185}
186
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800187static void
188pymain_run_interactive_hook(void)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200189{
190 PyObject *sys, *hook, *result;
191 sys = PyImport_ImportModule("sys");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800192 if (sys == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200193 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800194 }
195
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200196 hook = PyObject_GetAttrString(sys, "__interactivehook__");
197 Py_DECREF(sys);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800198 if (hook == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200199 PyErr_Clear();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800200 return;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200201 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800202
203 result = _PyObject_CallNoArg(hook);
204 Py_DECREF(hook);
205 if (result == NULL) {
206 goto error;
207 }
208 Py_DECREF(result);
209
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200210 return;
211
212error:
213 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
214 PyErr_Print();
215 PyErr_Clear();
216}
217
Thomas Woutersa9773292006-04-21 09:43:23 +0000218
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800219static int
220pymain_run_module(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 PyObject *module, *runpy, *runmodule, *runargs, *result;
223 runpy = PyImport_ImportModule("runpy");
224 if (runpy == NULL) {
225 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200226 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 return -1;
228 }
229 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
230 if (runmodule == NULL) {
231 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200232 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 Py_DECREF(runpy);
234 return -1;
235 }
236 module = PyUnicode_FromWideChar(modname, wcslen(modname));
237 if (module == NULL) {
238 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200239 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 Py_DECREF(runpy);
241 Py_DECREF(runmodule);
242 return -1;
243 }
244 runargs = Py_BuildValue("(Oi)", module, set_argv0);
245 if (runargs == NULL) {
246 fprintf(stderr,
247 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200248 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 Py_DECREF(runpy);
250 Py_DECREF(runmodule);
251 Py_DECREF(module);
252 return -1;
253 }
254 result = PyObject_Call(runmodule, runargs, NULL);
255 if (result == NULL) {
256 PyErr_Print();
257 }
258 Py_DECREF(runpy);
259 Py_DECREF(runmodule);
260 Py_DECREF(module);
261 Py_DECREF(runargs);
262 if (result == NULL) {
263 return -1;
264 }
265 Py_DECREF(result);
266 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000267}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000268
Nick Coghland2977a32017-03-12 20:38:32 +1000269static PyObject *
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800270pymain_get_importer(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000271{
Nick Coghland2977a32017-03-12 20:38:32 +1000272 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000273
Nick Coghland2977a32017-03-12 20:38:32 +1000274 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800275 if (sys_path0 == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000276 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800277 }
Victor Stinner4726e402010-10-06 23:24:57 +0000278
Nick Coghland2977a32017-03-12 20:38:32 +1000279 importer = PyImport_GetImporter(sys_path0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800280 if (importer == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000281 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800282 }
Victor Stinner4726e402010-10-06 23:24:57 +0000283
Brett Cannonaa936422012-04-27 15:30:58 -0400284 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000285 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000286 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000287 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800289
Victor Stinner4726e402010-10-06 23:24:57 +0000290 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000291 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000292
Nick Coghland2977a32017-03-12 20:38:32 +1000293error:
294 Py_XDECREF(sys_path0);
295 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
296 PyErr_Print();
297 PyErr_Clear();
298 return NULL;
299}
300
301
302static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800303pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
Victor Stinnera62207c2010-08-07 10:57:17 +0000304{
305 PyObject *unicode, *bytes;
306 int ret;
307
308 unicode = PyUnicode_FromWideChar(command, -1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800309 if (unicode == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000310 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800311 }
312
Victor Stinnera62207c2010-08-07 10:57:17 +0000313 bytes = PyUnicode_AsUTF8String(unicode);
314 Py_DECREF(unicode);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800315 if (bytes == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000316 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800317 }
318
Victor Stinnera62207c2010-08-07 10:57:17 +0000319 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
320 Py_DECREF(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800321 return (ret != 0);
Victor Stinnera62207c2010-08-07 10:57:17 +0000322
323error:
Victor Stinner398356b2010-08-18 22:23:22 +0000324 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000325 PyErr_Print();
326 return 1;
327}
328
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800329
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000330static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800331pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000332{
333 PyObject *unicode, *bytes = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +0200334 const char *filename_str;
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000335 int run;
336
337 /* call pending calls like signal handlers (SIGINT) */
338 if (Py_MakePendingCalls() == -1) {
339 PyErr_Print();
340 return 1;
341 }
342
343 if (filename) {
344 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
345 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000346 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000347 Py_DECREF(unicode);
348 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800349 if (bytes != NULL) {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000350 filename_str = PyBytes_AsString(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800351 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000352 else {
353 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000354 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000355 }
356 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800357 else {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000358 filename_str = "<stdin>";
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800359 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000360
361 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
362 Py_XDECREF(bytes);
363 return run != 0;
364}
365
Christian Heimes9cd17752007-11-18 19:35:23 +0000366
Guido van Rossum667d7041995-08-04 04:20:48 +0000367/* Main program */
368
Eric Snow6b4be192017-05-22 21:36:03 -0700369/*TODO: Add arg processing to PEP 432 as a new configuration setup API
370 */
371typedef struct {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800372 size_t len;
373 wchar_t **options;
374} _Py_OptList;
375
376typedef struct {
Eric Snow6b4be192017-05-22 21:36:03 -0700377 wchar_t *filename; /* Trailing arg without -c or -m */
378 wchar_t *command; /* -c argument */
379 wchar_t *module; /* -m argument */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800380 _Py_OptList warning_options; /* -W options */
Eric Snow6b4be192017-05-22 21:36:03 -0700381 PyObject *extra_options; /* -X options */
382 int print_help; /* -h, -? options */
383 int print_version; /* -V option */
384 int bytes_warning; /* Py_BytesWarningFlag */
385 int debug; /* Py_DebugFlag */
386 int inspect; /* Py_InspectFlag */
387 int interactive; /* Py_InteractiveFlag */
388 int isolated; /* Py_IsolatedFlag */
389 int optimization_level; /* Py_OptimizeFlag */
390 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag */
391 int no_user_site_directory; /* Py_NoUserSiteDirectory */
392 int no_site_import; /* Py_NoSiteFlag */
393 int use_unbuffered_io; /* Py_UnbufferedStdioFlag */
394 int verbosity; /* Py_VerboseFlag */
395 int quiet_flag; /* Py_QuietFlag */
396 int skip_first_line; /* -x option */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800397 _Py_OptList xoptions; /* -X options */
Eric Snow6b4be192017-05-22 21:36:03 -0700398} _Py_CommandLineDetails;
399
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800400/* Structure used by Py_Main() to pass data to subfunctions */
401typedef struct {
402 /* Exit status ("exit code") */
403 int status;
404 PyCompilerFlags cf;
405 /* non-zero is stdin is a TTY or if -i option is used */
406 int stdin_is_interactive;
407 _PyCoreConfig core_config;
Victor Stinnere32e79f2017-11-23 01:49:45 +0100408 _PyMainInterpreterConfig config;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800409 _Py_CommandLineDetails cmdline;
410 PyObject *main_importer_path;
411 /* non-zero if filename, command (-c) or module (-m) is set
412 on the command line */
413 int run_code;
414 wchar_t *program_name;
415 /* Error message if a function failed */
416 _PyInitError err;
417 /* PYTHONWARNINGS env var */
418 _Py_OptList env_warning_options;
419 int argc;
420 wchar_t **argv;
421} _PyMain;
422
423/* .cmdline is initialized to zeros */
424#define _PyMain_INIT \
425 {.status = 0, \
426 .cf = {.cf_flags = 0}, \
427 .core_config = _PyCoreConfig_INIT, \
Victor Stinnere32e79f2017-11-23 01:49:45 +0100428 .config = _PyMainInterpreterConfig_INIT, \
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800429 .main_importer_path = NULL, \
430 .run_code = -1, \
431 .program_name = NULL, \
432 .err = _Py_INIT_OK(), \
433 .env_warning_options = {0, NULL}}
434
435
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800436static void
437pymain_optlist_clear(_Py_OptList *list)
438{
439 for (size_t i=0; i < list->len; i++) {
440 PyMem_RawFree(list->options[i]);
441 }
442 PyMem_RawFree(list->options);
443 list->len = 0;
444 list->options = NULL;
445}
446
447static void
448pymain_free_impl(_PyMain *pymain)
449{
450 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
451 pymain_optlist_clear(&cmdline->warning_options);
452 pymain_optlist_clear(&cmdline->xoptions);
453 PyMem_RawFree(cmdline->command);
454
455 pymain_optlist_clear(&pymain->env_warning_options);
456 Py_CLEAR(pymain->main_importer_path);
457 PyMem_RawFree(pymain->program_name);
458
Victor Stinner46972b72017-11-24 22:55:40 +0100459 _PyMainInterpreterConfig_Clear(&pymain->config);
Victor Stinnerd4341102017-11-23 00:12:09 +0100460
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800461#ifdef __INSURE__
462 /* Insure++ is a memory analysis tool that aids in discovering
463 * memory leaks and other memory problems. On Python exit, the
464 * interned string dictionaries are flagged as being in use at exit
465 * (which it is). Under normal circumstances, this is fine because
466 * the memory will be automatically reclaimed by the system. Under
467 * memory debugging, it's a huge source of useless noise, so we
468 * trade off slower shutdown for less distraction in the memory
469 * reports. -baw
470 */
471 _Py_ReleaseInternedUnicodeStrings();
472#endif /* __INSURE__ */
473}
474
475static void
476pymain_free(_PyMain *pymain)
477{
Victor Stinnera7368ac2017-11-15 18:11:45 -0800478 /* Force malloc() memory allocator */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800479 PyMemAllocatorEx old_alloc, raw_alloc;
480 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
481 _PyMem_GetDefaultRawAllocator(&raw_alloc);
482 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &raw_alloc);
483
484 pymain_free_impl(pymain);
485
486 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
487}
488
Eric Snow6b4be192017-05-22 21:36:03 -0700489
490static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800491pymain_run_main_from_importer(_PyMain *pymain)
Guido van Rossum667d7041995-08-04 04:20:48 +0000492{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800493 PyObject *sys_path0 = pymain->main_importer_path;
494 PyObject *sys_path;
495 int sts;
496
497 /* Assume sys_path0 has already been checked by pymain_get_importer(),
498 * so put it in sys.path[0] and import __main__ */
499 sys_path = PySys_GetObject("path");
500 if (sys_path == NULL) {
501 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
502 goto error;
503 }
504
505 sts = PyList_Insert(sys_path, 0, sys_path0);
506 if (sts) {
507 sys_path0 = NULL;
508 goto error;
509 }
510
511 sts = pymain_run_module(L"__main__", 0);
512 return sts != 0;
513
514error:
515 Py_CLEAR(pymain->main_importer_path);
516 PyErr_Print();
517 return 1;
518}
519
520
521static wchar_t*
Victor Stinnerd4341102017-11-23 00:12:09 +0100522pymain_wstrdup(_PyMain *pymain, wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800523{
Victor Stinner46972b72017-11-24 22:55:40 +0100524 wchar_t *str2 = _PyMem_RawWcsdup(str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800525 if (str2 == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100526 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800527 return NULL;
528 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800529 return str2;
530}
531
532
533static int
Victor Stinnera7368ac2017-11-15 18:11:45 -0800534pymain_optlist_append(_PyMain *pymain, _Py_OptList *list, wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800535{
Victor Stinnerd4341102017-11-23 00:12:09 +0100536 wchar_t *str2 = pymain_wstrdup(pymain, str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800537 if (str2 == NULL) {
538 return -1;
539 }
540
541 size_t size = (list->len + 1) * sizeof(list[0]);
542 wchar_t **options2 = (wchar_t **)PyMem_RawRealloc(list->options, size);
543 if (options2 == NULL) {
544 PyMem_RawFree(str2);
Victor Stinner0327bde2017-11-23 17:03:20 +0100545 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800546 return -1;
547 }
548 options2[list->len] = str2;
549 list->options = options2;
550 list->len++;
551 return 0;
552}
553
554
555/* Parse the command line arguments
556 Return 0 on success.
557 Return 1 if parsing failed.
558 Set pymain->err and return -1 on other errors. */
559static int
Victor Stinnera7368ac2017-11-15 18:11:45 -0800560pymain_parse_cmdline_impl(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800561{
562 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
Eric Snow6b4be192017-05-22 21:36:03 -0700563
Antoine Pitrou86838b02012-02-21 19:03:47 +0100564 _PyOS_ResetGetOpt();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800565 do {
566 int c = _PyOS_GetOpt(pymain->argc, pymain->argv, PROGRAM_OPTS);
567 if (c == EOF) {
568 break;
569 }
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 if (c == 'c') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 /* -c is the last option; following arguments
573 that look like options are left for the
574 command to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800575 size_t len = wcslen(_PyOS_optarg) + 1 + 1;
576 wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
577 if (command == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100578 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800579 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800580 }
581 memcpy(command, _PyOS_optarg, len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 command[len - 2] = '\n';
583 command[len - 1] = 0;
Eric Snow6b4be192017-05-22 21:36:03 -0700584 cmdline->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 break;
586 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 if (c == 'm') {
589 /* -m is the last option; following arguments
590 that look like options are left for the
591 module to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800592 cmdline->module = _PyOS_optarg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 break;
594 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 switch (c) {
597 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700598 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700602 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700606 cmdline->inspect++;
607 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000609
Christian Heimesad73a9c2013-08-10 16:36:18 +0200610 case 'I':
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800611 pymain->core_config.ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700612 cmdline->isolated++;
613 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200614 break;
615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700619 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700623 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700627 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700631 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 case 'E':
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800635 pymain->core_config.ignore_environment++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 case 't':
639 /* ignored for backwards compatibility */
640 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700643 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700647 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 case 'x':
Eric Snow6b4be192017-05-22 21:36:03 -0700651 cmdline->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 case 'h':
655 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700656 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700660 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 case 'W':
Victor Stinnera7368ac2017-11-15 18:11:45 -0800664 if (pymain_optlist_append(pymain, &cmdline->warning_options,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800665 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800666 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800667 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000669
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000670 case 'X':
Victor Stinnera7368ac2017-11-15 18:11:45 -0800671 if (pymain_optlist_append(pymain, &cmdline->xoptions,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800672 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800673 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800674 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000675 break;
676
Georg Brandl9d871192010-12-04 10:47:18 +0000677 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700678 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000679 break;
680
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100681 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500682 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100683 break;
684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 default:
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800688 /* unknown argument: parsing failed */
689 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800691 } while (1);
692
693 if (cmdline->command == NULL && cmdline->module == NULL
694 && _PyOS_optind < pymain->argc
695 && wcscmp(pymain->argv[_PyOS_optind], L"-") != 0)
696 {
697 cmdline->filename = pymain->argv[_PyOS_optind];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000699
Eric Snow6b4be192017-05-22 21:36:03 -0700700 return 0;
701}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000702
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800703
Nick Coghland7ac0612017-10-25 12:11:26 +1000704static void
705maybe_set_flag(int *flag, int value)
706{
707 /* Helper to set flag variables from command line options
708 * - uses the higher of the two values if they're both set
709 * - otherwise leaves the flag unset
710 */
711 if (*flag < value) {
712 *flag = value;
713 }
714}
715
Eric Snow6b4be192017-05-22 21:36:03 -0700716
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800717static int
718pymain_add_xoptions(_PyMain *pymain)
719{
720 _Py_OptList *options = &pymain->cmdline.xoptions;
721 for (size_t i=0; i < options->len; i++) {
722 wchar_t *option = options->options[i];
723 if (_PySys_AddXOptionWithError(option) < 0) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100724 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800725 return -1;
726 }
727 }
Eric Snow6b4be192017-05-22 21:36:03 -0700728 return 0;
729}
730
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800731
732static int
733pymain_add_warnings_optlist(_Py_OptList *warnings)
Eric Snow6b4be192017-05-22 21:36:03 -0700734{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800735 for (size_t i = 0; i < warnings->len; i++) {
736 PyObject *option = PyUnicode_FromWideChar(warnings->options[i], -1);
737 if (option == NULL) {
738 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700739 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800740 if (_PySys_AddWarnOptionWithError(option)) {
741 Py_DECREF(option);
742 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700743 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800744 Py_DECREF(option);
Eric Snow6b4be192017-05-22 21:36:03 -0700745 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800746 return 0;
747}
Eric Snow6b4be192017-05-22 21:36:03 -0700748
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800749static int
750pymain_add_warnings_options(_PyMain *pymain)
751{
752 PySys_ResetWarnOptions();
Eric Snow1abcf672017-05-23 21:46:51 -0700753
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800754 if (pymain_add_warnings_optlist(&pymain->env_warning_options) < 0) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100755 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800756 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700757 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800758 if (pymain_add_warnings_optlist(&pymain->cmdline.warning_options) < 0) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100759 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800760 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700761 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800762 return 0;
763}
Eric Snow6b4be192017-05-22 21:36:03 -0700764
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800765
766/* Get warning options from PYTHONWARNINGS environment variable.
767 Return 0 on success.
768 Set pymain->err and return -1 on error. */
769static int
770pymain_warnings_envvar(_PyMain *pymain)
771{
772 if (Py_IgnoreEnvironmentFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 return 0;
774 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000775
Philip Jenveye53de3d2010-04-14 03:01:39 +0000776#ifdef MS_WINDOWS
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800777 wchar_t *wp;
778
779 if ((wp = _wgetenv(L"PYTHONWARNINGS")) && *wp != L'\0') {
Victor Stinnerd4341102017-11-23 00:12:09 +0100780 wchar_t *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000781
Victor Stinnerd4341102017-11-23 00:12:09 +0100782 wchar_t *buf = pymain_wstrdup(pymain, wp);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800783 if (buf == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800784 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800785 }
Steve Dowerf63dab52015-02-25 20:48:01 -0800786 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800788 warning = wcstok_s(NULL, L",", &context)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800789
Victor Stinnera7368ac2017-11-15 18:11:45 -0800790 if (pymain_optlist_append(pymain, &pymain->env_warning_options,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800791 warning) < 0) {
792 PyMem_RawFree(buf);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800793 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800794 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200796 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000798#else
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800799 char *p;
800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
802 char *buf, *oldloc;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 /* settle for strtok here as there's no one standard
805 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200806 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800807 if (buf == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100808 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800809 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200812 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 setlocale(LC_ALL, "");
814 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800815 size_t len;
816 wchar_t *warning = Py_DecodeLocale(p, &len);
817 if (warning == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100818 SET_DECODE_ERROR("PYTHONWARNINGS environment variable", len);
Victor Stinnerd4341102017-11-23 00:12:09 +0100819 return -1;
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100820 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800821 if (pymain_optlist_append(pymain, &pymain->env_warning_options,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800822 warning) < 0) {
823 PyMem_RawFree(warning);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800824 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800825 }
826 PyMem_RawFree(warning);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 }
828 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200829 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200830 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000832#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800833 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800834}
835
836
837static void
838pymain_init_stdio(_PyMain *pymain)
839{
840 pymain->stdin_is_interactive = (isatty(fileno(stdin))
841 || Py_InteractiveFlag);
Guido van Rossum775af911997-02-14 19:50:32 +0000842
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000843#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000844 /* don't translate newlines (\r\n <=> \n) */
845 _setmode(fileno(stdin), O_BINARY);
846 _setmode(fileno(stdout), O_BINARY);
847 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000848#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000849
850 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000851#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
853 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
854 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000855#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 setbuf(stdin, (char *)NULL);
857 setbuf(stdout, (char *)NULL);
858 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000859#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 }
861 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000862#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 /* Doesn't have to have line-buffered -- use unbuffered */
864 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
865 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000866#else /* !MS_WINDOWS */
867#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
869 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000870#endif /* HAVE_SETVBUF */
871#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 /* Leave stderr alone - it should be unbuffered anyway. */
873 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800874}
Guido van Rossum667d7041995-08-04 04:20:48 +0000875
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800876
877/* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__
878 environment variables on macOS if available, use argv[0] by default.
879
880 Return 0 on success.
881 Set pymain->err and return -1 on error. */
882static int
883pymain_get_program_name(_PyMain *pymain)
884{
885 assert(pymain->program_name == NULL);
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000886#ifdef __APPLE__
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800887 char *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 /* On MacOS X, when the Python interpreter is embedded in an
889 application bundle, it gets executed by a bootstrapping script
890 that does os.execve() with an argv[0] that's different from the
891 actual Python executable. This is needed to keep the Finder happy,
892 or rather, to work around Apple's overly strict requirements of
893 the process name. However, we still need a usable sys.executable,
894 so the actual executable path is passed in an environment variable.
895 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
896 script. */
897 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
898 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200899 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000900
Victor Stinner1a7425f2013-07-07 16:25:15 +0200901 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 if (buffer == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100903 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800904 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000906
Brett Cannonb94767f2011-02-22 20:15:44 +0000907 mbstowcs(buffer, p, len);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800908 pymain->program_name = buffer;
909 }
Vinay Sajip90db6612012-07-17 17:33:46 +0100910#ifdef WITH_NEXT_FRAMEWORK
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800911 else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100912 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
Vinay Sajip90db6612012-07-17 17:33:46 +0100913 if (pyvenv_launcher && *pyvenv_launcher) {
914 /* Used by Mac/Tools/pythonw.c to forward
915 * the argv0 of the stub executable
916 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800917 size_t len;
918 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, &len);
Vinay Sajip90db6612012-07-17 17:33:46 +0100919 if (wbuf == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100920 SET_DECODE_ERROR("__PYVENV_LAUNCHER__", len);
921 return -1;
Vinay Sajip90db6612012-07-17 17:33:46 +0100922 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800923 pymain->program_name = wbuf;
Vinay Sajip90db6612012-07-17 17:33:46 +0100924 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800926#endif /* WITH_NEXT_FRAMEWORK */
927#endif /* __APPLE__ */
Eric Snowc7ec9982017-05-23 23:00:52 -0700928
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800929 if (pymain->program_name == NULL) {
930 /* Use argv[0] by default */
Victor Stinnerd4341102017-11-23 00:12:09 +0100931 pymain->program_name = pymain_wstrdup(pymain, pymain->argv[0]);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800932 if (pymain->program_name == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800933 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800934 }
935 }
936 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800937}
938
939
940/* Initialize the main interpreter.
941 *
942 * Replaces previous call to Py_Initialize()
943 *
944 * TODO: Move environment queries (etc) into Py_ReadConfig
945 *
946 * Return 0 on success.
947 * Set pymain->err and return -1 on error.
948 */
949static int
950pymain_init_main_interpreter(_PyMain *pymain)
951{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800952 _PyInitError err;
953
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800954 /* TODO: Print any exceptions raised by these operations */
Victor Stinner46972b72017-11-24 22:55:40 +0100955 err = _PyMainInterpreterConfig_Read(&pymain->config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800956 if (_Py_INIT_FAILED(err)) {
957 pymain->err = err;
958 return -1;
Eric Snowc7ec9982017-05-23 23:00:52 -0700959 }
Guido van Rossumed52aac1997-07-19 19:20:32 +0000960
Victor Stinnere32e79f2017-11-23 01:49:45 +0100961 err = _Py_InitializeMainInterpreter(&pymain->config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800962 if (_Py_INIT_FAILED(err)) {
963 pymain->err = err;
964 return -1;
965 }
966 return 0;
967}
968
969
970static void
971pymain_header(_PyMain *pymain)
972{
Eric Snow1abcf672017-05-23 21:46:51 -0700973 /* TODO: Move this to _PyRun_PrepareMain */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800974 if (Py_QuietFlag) {
975 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000977
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800978 if (!Py_VerboseFlag && (pymain->run_code || !pymain->stdin_is_interactive)) {
979 return;
980 }
981
982 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
983 if (!Py_NoSiteFlag) {
984 fprintf(stderr, "%s\n", COPYRIGHT);
985 }
986}
987
988
989static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800990pymain_set_argv(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800991{
992 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
993
Eric Snow1abcf672017-05-23 21:46:51 -0700994 /* TODO: Move this to _Py_InitializeMainInterpreter */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800995 if (cmdline->command != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
997 _PyOS_optind--;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800998 pymain->argv[_PyOS_optind] = L"-c";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001000
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001001 if (cmdline->module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +00001002 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 _PyOS_optind--;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001004 pymain->argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001006
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001007 int update_path;
1008 if (pymain->main_importer_path != NULL) {
1009 /* Let pymain_run_main_from_importer() adjust sys.path[0] later */
1010 update_path = 0;
Nick Coghland2977a32017-03-12 20:38:32 +10001011 } else {
1012 /* Use config settings to decide whether or not to update sys.path[0] */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001013 update_path = (Py_IsolatedFlag == 0);
1014 }
1015 PySys_SetArgvEx(pymain->argc - _PyOS_optind,
1016 pymain->argv + _PyOS_optind,
1017 update_path);
1018}
1019
1020
1021/* Set Py_XXX global configuration variables */
1022static void
1023pymain_set_global_config(_PyMain *pymain)
1024{
1025 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1026 maybe_set_flag(&Py_BytesWarningFlag, cmdline->bytes_warning);
1027 maybe_set_flag(&Py_DebugFlag, cmdline->debug);
1028 maybe_set_flag(&Py_InspectFlag, cmdline->inspect);
1029 maybe_set_flag(&Py_InteractiveFlag, cmdline->interactive);
1030 maybe_set_flag(&Py_IsolatedFlag, cmdline->isolated);
1031 maybe_set_flag(&Py_OptimizeFlag, cmdline->optimization_level);
1032 maybe_set_flag(&Py_DontWriteBytecodeFlag, cmdline->dont_write_bytecode);
1033 maybe_set_flag(&Py_NoUserSiteDirectory, cmdline->no_user_site_directory);
1034 maybe_set_flag(&Py_NoSiteFlag, cmdline->no_site_import);
1035 maybe_set_flag(&Py_UnbufferedStdioFlag, cmdline->use_unbuffered_io);
1036 maybe_set_flag(&Py_VerboseFlag, cmdline->verbosity);
1037 maybe_set_flag(&Py_QuietFlag, cmdline->quiet_flag);
1038
1039 maybe_set_flag(&Py_IgnoreEnvironmentFlag, pymain->core_config.ignore_environment);
1040}
1041
1042
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001043static void
1044pymain_import_readline(_PyMain *pymain)
1045{
1046 if (Py_IsolatedFlag) {
1047 return;
1048 }
1049 if (!Py_InspectFlag && pymain->run_code) {
1050 return;
1051 }
1052 if (!isatty(fileno(stdin))) {
1053 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001054 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001055
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001056 PyObject *mod = PyImport_ImportModule("readline");
1057 if (mod == NULL) {
1058 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 }
1060 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001061 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001063}
1064
1065
1066static FILE*
1067pymain_open_filename(_PyMain *pymain)
1068{
1069 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1070 FILE* fp;
1071
1072 fp = _Py_wfopen(cmdline->filename, L"r");
1073 if (fp == NULL) {
1074 char *cfilename_buffer;
1075 const char *cfilename;
1076 int err = errno;
1077 cfilename_buffer = Py_EncodeLocale(cmdline->filename, NULL);
1078 if (cfilename_buffer != NULL)
1079 cfilename = cfilename_buffer;
1080 else
1081 cfilename = "<unprintable file name>";
1082 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
1083 pymain->argv[0], cfilename, err, strerror(err));
1084 PyMem_Free(cfilename_buffer);
1085 pymain->status = 2;
1086 return NULL;
1087 }
1088
1089 if (cmdline->skip_first_line) {
1090 int ch;
1091 /* Push back first newline so line numbers
1092 remain the same */
1093 while ((ch = getc(fp)) != EOF) {
1094 if (ch == '\n') {
1095 (void)ungetc(ch, fp);
1096 break;
1097 }
1098 }
1099 }
1100
1101 struct _Py_stat_struct sb;
1102 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1103 S_ISDIR(sb.st_mode)) {
1104 fprintf(stderr,
1105 "%ls: '%ls' is a directory, cannot continue\n",
1106 pymain->argv[0], cmdline->filename);
1107 fclose(fp);
1108 pymain->status = 1;
1109 return NULL;
1110 }
1111
1112 return fp;
1113}
1114
1115
1116static void
Victor Stinnera7368ac2017-11-15 18:11:45 -08001117pymain_run_filename(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001118{
1119 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1120
1121 if (cmdline->filename == NULL && pymain->stdin_is_interactive) {
1122 Py_InspectFlag = 0; /* do exit on SystemExit */
1123 pymain_run_statup(&pymain->cf);
1124 pymain_run_interactive_hook();
1125 }
1126 /* XXX */
1127
1128 if (pymain->main_importer_path != NULL) {
1129 pymain->status = pymain_run_main_from_importer(pymain);
1130 return;
1131 }
1132
1133 FILE *fp;
1134 if (cmdline->filename != NULL) {
1135 fp = pymain_open_filename(pymain);
1136 if (fp == NULL) {
1137 return;
1138 }
1139 }
1140 else {
1141 fp = stdin;
1142 }
1143
1144 pymain->status = pymain_run_file(fp, cmdline->filename, &pymain->cf);
1145}
1146
1147
1148static void
1149pymain_repl(_PyMain *pymain)
1150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001152 opportunity to set it from Python. */
1153 if (!Py_InspectFlag && pymain_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 Py_InspectFlag = 1;
1155 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001156
Victor Stinnera7368ac2017-11-15 18:11:45 -08001157 if (!(Py_InspectFlag && pymain->stdin_is_interactive
1158 && pymain->run_code)) {
1159 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001161
1162 Py_InspectFlag = 0;
1163 pymain_run_interactive_hook();
1164 /* XXX */
1165 int res = PyRun_AnyFileFlags(stdin, "<stdin>", &pymain->cf);
1166 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001167}
1168
1169
1170/* Parse the command line.
1171 Handle --version and --help options directly.
1172
1173 Return 1 if Python must exit.
1174 Return 0 on success.
1175 Set pymain->err and return -1 on failure. */
1176static int
Victor Stinnera7368ac2017-11-15 18:11:45 -08001177pymain_parse_cmdline(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001178{
1179 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1180
Victor Stinnera7368ac2017-11-15 18:11:45 -08001181 int res = pymain_parse_cmdline_impl(pymain);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001182 if (res < 0) {
1183 return -1;
1184 }
1185 if (res) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001186 pymain_usage(1, pymain->argv[0]);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001187 pymain->status = 2;
1188 return 1;
1189 }
1190
1191 if (cmdline->print_help) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001192 pymain_usage(0, pymain->argv[0]);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001193 pymain->status = 0;
1194 return 1;
1195 }
1196
1197 if (cmdline->print_version) {
1198 printf("Python %s\n",
1199 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
1200 return 1;
1201 }
1202
1203 pymain->run_code = (cmdline->command != NULL || cmdline->filename != NULL
1204 || cmdline->module != NULL);
1205
1206 return 0;
1207}
1208
1209
Victor Stinnera7368ac2017-11-15 18:11:45 -08001210static wchar_t*
1211pymain_get_xoption(_PyMain *pymain, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001212{
Victor Stinnera7368ac2017-11-15 18:11:45 -08001213 _Py_OptList *list = &pymain->cmdline.xoptions;
1214 for (size_t i=0; i < list->len; i++) {
1215 wchar_t *option = list->options[i];
1216 size_t len;
1217 wchar_t *sep = wcschr(option, L'=');
1218 if (sep != NULL) {
1219 len = (sep - option);
1220 }
1221 else {
1222 len = wcslen(option);
1223 }
1224 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1225 return option;
1226 }
1227 }
1228 return NULL;
1229}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001230
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001231
Victor Stinnera7368ac2017-11-15 18:11:45 -08001232static int
1233pymain_str_to_int(char *str, int *result)
1234{
1235 errno = 0;
1236 char *endptr = str;
1237 long value = strtol(str, &endptr, 10);
1238 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001239 return -1;
1240 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001241 if (value < INT_MIN || value > INT_MAX) {
1242 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001243 }
1244
Victor Stinnera7368ac2017-11-15 18:11:45 -08001245 *result = (int)value;
1246 return 0;
1247}
1248
1249
1250static int
1251pymain_wstr_to_int(wchar_t *wstr, int *result)
1252{
1253 errno = 0;
1254 wchar_t *endptr = wstr;
1255 long value = wcstol(wstr, &endptr, 10);
1256 if (*endptr != '\0' || errno == ERANGE) {
1257 return -1;
1258 }
1259 if (value < INT_MIN || value > INT_MAX) {
1260 return -1;
1261 }
1262
1263 *result = (int)value;
1264 return 0;
1265}
1266
1267
1268static int
1269pymain_init_tracemalloc(_PyMain *pymain)
1270{
1271 int nframe;
1272 int valid;
1273
1274 char *env = pymain_get_env_var("PYTHONTRACEMALLOC");
1275 if (env) {
1276 if (!pymain_str_to_int(env, &nframe)) {
1277 valid = (nframe >= 1);
1278 }
1279 else {
1280 valid = 0;
1281 }
1282 if (!valid) {
1283 pymain->err = _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid "
1284 "number of frames");
1285 return -1;
1286 }
1287 pymain->core_config.tracemalloc = nframe;
1288 }
1289
1290 wchar_t *xoption = pymain_get_xoption(pymain, L"tracemalloc");
1291 if (xoption) {
1292 wchar_t *sep = wcschr(xoption, L'=');
1293 if (sep) {
1294 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1295 valid = (nframe >= 1);
1296 }
1297 else {
1298 valid = 0;
1299 }
1300 if (!valid) {
1301 pymain->err = _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1302 "invalid number of frames");
1303 return -1;
1304 }
1305 }
1306 else {
1307 /* -X tracemalloc behaves as -X tracemalloc=1 */
1308 nframe = 1;
1309 }
1310 pymain->core_config.tracemalloc = nframe;
1311 }
1312 return 0;
1313}
1314
1315
1316static void
1317pymain_set_flag_from_env(int *flag, const char *name)
1318{
1319 char *var = pymain_get_env_var(name);
1320 if (!var) {
1321 return;
1322 }
1323 int value;
1324 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1325 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1326 value = 1;
1327 }
1328 if (*flag < value) {
1329 *flag = value;
1330 }
1331}
1332
1333
1334static void
1335pymain_set_flags_from_env(_PyMain *pymain)
1336{
1337 pymain_set_flag_from_env(&Py_DebugFlag,
1338 "PYTHONDEBUG");
1339 pymain_set_flag_from_env(&Py_VerboseFlag,
1340 "PYTHONVERBOSE");
1341 pymain_set_flag_from_env(&Py_OptimizeFlag,
1342 "PYTHONOPTIMIZE");
1343 pymain_set_flag_from_env(&Py_InspectFlag,
1344 "PYTHONINSPECT");
1345 pymain_set_flag_from_env(&Py_DontWriteBytecodeFlag,
1346 "PYTHONDONTWRITEBYTECODE");
1347 pymain_set_flag_from_env(&Py_NoUserSiteDirectory,
1348 "PYTHONNOUSERSITE");
1349 pymain_set_flag_from_env(&Py_UnbufferedStdioFlag,
1350 "PYTHONUNBUFFERED");
1351#ifdef MS_WINDOWS
1352 pymain_set_flag_from_env(&Py_LegacyWindowsFSEncodingFlag,
1353 "PYTHONLEGACYWINDOWSFSENCODING");
1354 pymain_set_flag_from_env(&Py_LegacyWindowsStdioFlag,
1355 "PYTHONLEGACYWINDOWSSTDIO");
1356#endif
1357}
1358
1359
1360static int
Victor Stinner46972b72017-11-24 22:55:40 +01001361config_get_env_var_dup(wchar_t **dest, wchar_t *wname, char *name)
Victor Stinnerd4341102017-11-23 00:12:09 +01001362{
1363 if (Py_IgnoreEnvironmentFlag) {
Victor Stinner1f151112017-11-23 10:43:14 +01001364 *dest = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +01001365 return 0;
1366 }
1367
1368#ifdef MS_WINDOWS
Victor Stinner1f151112017-11-23 10:43:14 +01001369 wchar_t *var = _wgetenv(wname);
1370 if (!var || var[0] == '\0') {
1371 *dest = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +01001372 return 0;
1373 }
1374
Victor Stinner46972b72017-11-24 22:55:40 +01001375 wchar_t *copy = _PyMem_RawWcsdup(var);
Victor Stinner1f151112017-11-23 10:43:14 +01001376 if (copy == NULL) {
Victor Stinnerd4341102017-11-23 00:12:09 +01001377 return -1;
1378 }
1379
Victor Stinner1f151112017-11-23 10:43:14 +01001380 *dest = copy;
Victor Stinnerd4341102017-11-23 00:12:09 +01001381#else
Victor Stinner1f151112017-11-23 10:43:14 +01001382 char *var = getenv(name);
1383 if (!var || var[0] == '\0') {
1384 *dest = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +01001385 return 0;
1386 }
1387
1388 size_t len;
Victor Stinner1f151112017-11-23 10:43:14 +01001389 wchar_t *wvar = Py_DecodeLocale(var, &len);
1390 if (!wvar) {
Victor Stinnerd4341102017-11-23 00:12:09 +01001391 if (len == (size_t)-2) {
Victor Stinner1f151112017-11-23 10:43:14 +01001392 return -2;
Victor Stinnerd4341102017-11-23 00:12:09 +01001393 }
1394 else {
Victor Stinner1f151112017-11-23 10:43:14 +01001395 return -1;
1396 }
1397 }
1398 *dest = wvar;
1399#endif
1400 return 0;
1401}
1402
1403
Victor Stinner46972b72017-11-24 22:55:40 +01001404static _PyInitError
1405config_init_pythonpath(_PyMainInterpreterConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001406{
1407 wchar_t *path;
Victor Stinner46972b72017-11-24 22:55:40 +01001408 int res = config_get_env_var_dup(&path, L"PYTHONPATH", "PYTHONPATH");
Victor Stinner1f151112017-11-23 10:43:14 +01001409 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001410 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinnerd4341102017-11-23 00:12:09 +01001411 }
Victor Stinner46972b72017-11-24 22:55:40 +01001412 config->module_search_path_env = path;
1413 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001414}
1415
1416
Victor Stinner46972b72017-11-24 22:55:40 +01001417static _PyInitError
1418config_init_pythonhome(_PyMainInterpreterConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001419{
1420 wchar_t *home;
1421
1422 home = Py_GetPythonHome();
1423 if (home) {
1424 /* Py_SetPythonHome() has been called before Py_Main(),
1425 use its value */
Victor Stinner46972b72017-11-24 22:55:40 +01001426 config->home = _PyMem_RawWcsdup(home);
1427 if (config->home == NULL) {
1428 return _Py_INIT_NO_MEMORY();
Victor Stinner1f151112017-11-23 10:43:14 +01001429 }
Victor Stinner46972b72017-11-24 22:55:40 +01001430 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001431 }
1432
Victor Stinner46972b72017-11-24 22:55:40 +01001433 int res = config_get_env_var_dup(&home, L"PYTHONHOME", "PYTHONHOME");
Victor Stinner1f151112017-11-23 10:43:14 +01001434 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001435 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinner1f151112017-11-23 10:43:14 +01001436 }
Victor Stinner46972b72017-11-24 22:55:40 +01001437 config->home = home;
1438 return _Py_INIT_OK();
Victor Stinnerd4341102017-11-23 00:12:09 +01001439}
1440
1441
Victor Stinner46972b72017-11-24 22:55:40 +01001442_PyInitError
1443_PyMainInterpreterConfig_ReadEnv(_PyMainInterpreterConfig *config)
1444{
1445 _PyInitError err = config_init_pythonhome(config);
1446 if (_Py_INIT_FAILED(err)) {
1447 return err;
1448 }
1449
1450 err = config_init_pythonpath(config);
1451 if (_Py_INIT_FAILED(err)) {
1452 return err;
1453 }
1454
Victor Stinnerf04ebe22017-11-25 00:01:23 +01001455 /* FIXME: _PyMainInterpreterConfig_Read() has the same code. Remove it
1456 here? See also pymain_get_program_name() and pymain_parse_envvars(). */
1457 config->program_name = _PyMem_RawWcsdup(Py_GetProgramName());
1458 if (config->program_name == NULL) {
1459 return _Py_INIT_NO_MEMORY();
1460 }
1461
Victor Stinner46972b72017-11-24 22:55:40 +01001462 return _Py_INIT_OK();
1463}
1464
1465
1466
1467
Victor Stinnerd4341102017-11-23 00:12:09 +01001468static int
Victor Stinnera7368ac2017-11-15 18:11:45 -08001469pymain_parse_envvars(_PyMain *pymain)
1470{
1471 _PyCoreConfig *core_config = &pymain->core_config;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001472
1473 /* Get environment variables */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001474 pymain_set_flags_from_env(pymain);
1475
1476 /* The variable is only tested for existence here;
1477 _Py_HashRandomization_Init will check its value further. */
1478 if (pymain_get_env_var("PYTHONHASHSEED")) {
1479 Py_HashRandomizationFlag = 1;
1480 }
1481
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001482 if (pymain_warnings_envvar(pymain) < 0) {
1483 return -1;
1484 }
1485 if (pymain_get_program_name(pymain) < 0) {
1486 return -1;
1487 }
1488 core_config->allocator = Py_GETENV("PYTHONMALLOC");
Victor Stinner46972b72017-11-24 22:55:40 +01001489
Victor Stinnerf04ebe22017-11-25 00:01:23 +01001490 /* FIXME: move pymain_get_program_name() code into
1491 _PyMainInterpreterConfig_ReadEnv().
1492 Problem: _PyMainInterpreterConfig_ReadEnv() doesn't have access
1493 to argv[0]. */
1494 Py_SetProgramName(pymain->program_name);
1495 /* Don't free program_name here: the argument to Py_SetProgramName
1496 must remain valid until Py_FinalizeEx is called. The string is freed
1497 by pymain_free(). */
1498
Victor Stinner46972b72017-11-24 22:55:40 +01001499 _PyInitError err = _PyMainInterpreterConfig_ReadEnv(&pymain->config);
1500 if (_Py_INIT_FAILED(pymain->err)) {
1501 pymain->err = err;
Victor Stinner1f151112017-11-23 10:43:14 +01001502 return -1;
1503 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001504
Victor Stinner25420fe2017-11-20 18:12:22 -08001505 /* -X options */
1506 if (pymain_get_xoption(pymain, L"showrefcount")) {
1507 core_config->show_ref_count = 1;
1508 }
1509 if (pymain_get_xoption(pymain, L"showalloccount")) {
1510 core_config->show_alloc_count = 1;
1511 }
1512
Victor Stinnera7368ac2017-11-15 18:11:45 -08001513 /* More complex options: env var and/or -X option */
1514 if (pymain_get_env_var("PYTHONFAULTHANDLER")
1515 || pymain_get_xoption(pymain, L"faulthandler")) {
1516 core_config->faulthandler = 1;
1517 }
1518 if (pymain_get_env_var("PYTHONPROFILEIMPORTTIME")
1519 || pymain_get_xoption(pymain, L"importtime")) {
Victor Stinner25420fe2017-11-20 18:12:22 -08001520 core_config->import_time = 1;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001521 }
1522 if (pymain_init_tracemalloc(pymain) < 0) {
1523 return -1;
1524 }
Victor Stinnerccb04422017-11-16 03:20:31 -08001525 if (pymain_get_xoption(pymain, L"dev")) {
Victor Stinner09f3a8a2017-11-20 17:32:40 -08001526 core_config->dev_mode = 1;
Victor Stinnerccb04422017-11-16 03:20:31 -08001527 core_config->faulthandler = 1;
Victor Stinner09f3a8a2017-11-20 17:32:40 -08001528 core_config->allocator = "debug";
Victor Stinnerccb04422017-11-16 03:20:31 -08001529 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001530 return 0;
1531}
1532
1533
Victor Stinnera7368ac2017-11-15 18:11:45 -08001534/* Parse command line options and environment variables.
1535 This code must not use Python runtime apart PyMem_Raw memory allocator.
1536
1537 Return 0 on success.
1538 Return 1 if Python is done and must exit.
1539 Set pymain->err and return -1 on error. */
1540static int
1541pymain_parse_cmdline_envvars_impl(_PyMain *pymain)
1542{
1543 int res = pymain_parse_cmdline(pymain);
1544 if (res < 0) {
1545 return -1;
1546 }
1547 if (res > 0) {
1548 return 1;
1549 }
1550
1551 pymain_set_global_config(pymain);
1552
1553 if (pymain_parse_envvars(pymain) < 0) {
1554 return -1;
1555 }
1556
1557 return 0;
1558}
1559
1560
1561static int
1562pymain_parse_cmdline_envvars(_PyMain *pymain)
1563{
1564 /* Force malloc() memory allocator */
1565 PyMemAllocatorEx old_alloc, raw_alloc;
1566 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1567 _PyMem_GetDefaultRawAllocator(&raw_alloc);
1568 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &raw_alloc);
1569
1570 int res = pymain_parse_cmdline_envvars_impl(pymain);
1571
1572 /* Restore the old memory allocator */
1573 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1574
1575 return res;
1576}
1577
1578static int
1579pymain_init_python(_PyMain *pymain)
1580{
1581 pymain_init_stdio(pymain);
1582
1583 pymain->err = _Py_InitializeCore(&pymain->core_config);
1584 if (_Py_INIT_FAILED(pymain->err)) {
1585 return -1;
1586 }
1587
Victor Stinnera7368ac2017-11-15 18:11:45 -08001588 if (pymain_add_xoptions(pymain)) {
1589 return -1;
1590 }
1591 if (pymain_add_warnings_options(pymain)) {
1592 return -1;
1593 }
1594
1595 if (pymain_init_main_interpreter(pymain)) {
1596 return -1;
1597 }
1598 return 0;
1599}
1600
1601
1602static void
1603pymain_run_python(_PyMain *pymain)
1604{
1605 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1606
1607 pymain_header(pymain);
1608 pymain_import_readline(pymain);
1609
1610 if (cmdline->filename != NULL) {
1611 pymain->main_importer_path = pymain_get_importer(cmdline->filename);
1612 }
1613
1614 pymain_set_argv(pymain);
1615
1616 if (cmdline->command) {
1617 pymain->status = pymain_run_command(cmdline->command, &pymain->cf);
1618 }
1619 else if (cmdline->module) {
1620 pymain->status = (pymain_run_module(cmdline->module, 1) != 0);
1621 }
1622 else {
1623 pymain_run_filename(pymain);
1624 }
1625 pymain_repl(pymain);
1626}
1627
1628
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001629static int
1630pymain_init(_PyMain *pymain)
1631{
1632 pymain->err = _PyRuntime_Initialize();
1633 if (_Py_INIT_FAILED(pymain->err)) {
1634 return -1;
1635 }
1636
Victor Stinnera7368ac2017-11-15 18:11:45 -08001637 pymain->core_config._disable_importlib = 0;
Victor Stinnere32e79f2017-11-23 01:49:45 +01001638 /* TODO: Moar config options! */
1639 pymain->config.install_signal_handlers = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001640
Victor Stinnera7368ac2017-11-15 18:11:45 -08001641 orig_argc = pymain->argc; /* For Py_GetArgcArgv() */
1642 orig_argv = pymain->argv;
1643 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001644}
1645
Victor Stinnera7368ac2017-11-15 18:11:45 -08001646
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001647static int
Victor Stinnera7368ac2017-11-15 18:11:45 -08001648pymain_impl(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001649{
Victor Stinnera7368ac2017-11-15 18:11:45 -08001650 int res = pymain_init(pymain);
1651 if (res < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001652 return -1;
1653 }
1654
Victor Stinnera7368ac2017-11-15 18:11:45 -08001655 res = pymain_parse_cmdline_envvars(pymain);
1656 if (res < 0) {
1657 return -1;
1658 }
1659 if (res > 0) {
1660 /* --help or --version command: we are done */
1661 return 0;
1662 }
1663
1664 res = pymain_init_python(pymain);
1665 if (res < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001666 return -1;
1667 }
1668
Victor Stinnera7368ac2017-11-15 18:11:45 -08001669 pymain_run_python(pymain);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001671 if (Py_FinalizeEx() < 0) {
1672 /* Value unlikely to be confused with a non-error exit status or
Victor Stinnera7368ac2017-11-15 18:11:45 -08001673 other special meaning */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001674 pymain->status = 120;
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001675 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001676 return 0;
1677}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00001678
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001679
1680int
1681Py_Main(int argc, wchar_t **argv)
1682{
1683 _PyMain pymain = _PyMain_INIT;
1684 memset(&pymain.cmdline, 0, sizeof(pymain.cmdline));
1685 pymain.argc = argc;
1686 pymain.argv = argv;
1687
Victor Stinnera7368ac2017-11-15 18:11:45 -08001688 if (pymain_impl(&pymain) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001689 _Py_FatalInitError(pymain.err);
1690 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001691 pymain_free(&pymain);
1692
1693 return pymain.status;
Guido van Rossum667d7041995-08-04 04:20:48 +00001694}
1695
Skip Montanaro786ea6b2004-03-01 15:44:05 +00001696/* this is gonna seem *real weird*, but if you put some other code between
1697 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
1698 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00001699
Guido van Rossum667d7041995-08-04 04:20:48 +00001700/* Make the *original* argc/argv available to other modules.
1701 This is rare, but it is needed by the secureware extension. */
1702
1703void
Martin v. Löwis790465f2008-04-05 20:41:37 +00001704Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00001705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 *argc = orig_argc;
1707 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00001708}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001709
1710#ifdef __cplusplus
1711}
1712#endif