blob: dff7894bf353b153cfb77d98ee3fecd1be8fda6e [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"
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08005#include "internal/import.h"
Benjamin Petersone425bd72017-12-14 23:48:12 -08006#include "internal/pygetopt.h"
Victor Stinnerf7e5b562017-11-15 15:48:08 -08007#include "internal/pystate.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00008
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00009#include <locale.h>
10
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +000011#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner6efcb6d2017-12-18 23:42:55 +010012# include <windows.h>
13# ifdef HAVE_IO_H
14# include <io.h>
15# endif
16# ifdef HAVE_FCNTL_H
17# include <fcntl.h>
18# endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000019#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000020
Martin v. Löwis945362c2007-08-30 14:57:25 +000021#ifdef _MSC_VER
Victor Stinner6efcb6d2017-12-18 23:42:55 +010022# include <crtdbg.h>
23#endif
24
25#ifdef __FreeBSD__
26# include <fenv.h>
Martin v. Löwis945362c2007-08-30 14:57:25 +000027#endif
28
Jesus Ceaab70e2a2012-10-05 01:48:08 +020029#if defined(MS_WINDOWS)
Victor Stinner6efcb6d2017-12-18 23:42:55 +010030# define PYTHONHOMEHELP "<prefix>\\python{major}{minor}"
Guido van Rossuma075ce11997-12-05 21:56:45 +000031#else
Victor Stinner6efcb6d2017-12-18 23:42:55 +010032# define PYTHONHOMEHELP "<prefix>/lib/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000033#endif
34
Guido van Rossuma22865e2000-09-05 04:41:18 +000035#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000036 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
37 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000038
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000039#ifdef __cplusplus
40extern "C" {
41#endif
42
Victor Stinner46972b72017-11-24 22:55:40 +010043#define DECODE_LOCALE_ERR(NAME, LEN) \
44 (((LEN) == -2) \
Victor Stinner94540602017-12-16 04:54:22 +010045 ? _Py_INIT_USER_ERR("cannot decode " NAME) \
Victor Stinner46972b72017-11-24 22:55:40 +010046 : _Py_INIT_NO_MEMORY())
47
48
Victor Stinner0327bde2017-11-23 17:03:20 +010049#define SET_DECODE_ERROR(NAME, LEN) \
50 do { \
51 if ((LEN) == (size_t)-2) { \
Victor Stinner94540602017-12-16 04:54:22 +010052 pymain->err = _Py_INIT_USER_ERR("cannot decode " NAME); \
Victor Stinner0327bde2017-11-23 17:03:20 +010053 } \
54 else { \
55 pymain->err = _Py_INIT_NO_MEMORY(); \
56 } \
57 } while (0)
58
Victor Stinnerca719ac2017-12-20 18:00:19 +010059#ifdef MS_WINDOWS
60#define WCSTOK wcstok_s
61#else
62#define WCSTOK wcstok
63#endif
64
Guido van Rossumac56b031996-07-21 02:33:38 +000065/* For Py_GetArgcArgv(); set by main() */
Victor Stinner94540602017-12-16 04:54:22 +010066static wchar_t **orig_argv = NULL;
67static int orig_argc = 0;
Guido van Rossum667d7041995-08-04 04:20:48 +000068
Guido van Rossumbceccf52001-04-10 22:07:43 +000069/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020070#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000071
Guido van Rossumbceccf52001-04-10 22:07:43 +000072#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000073
Benjamin Peterson42aa93b2017-12-09 10:26:52 -080074static const _PyOS_LongOption longoptions[] = {
75 {L"check-hash-based-pycs", 1, 0},
76 {NULL, 0, 0},
77};
78
Guido van Rossum667d7041995-08-04 04:20:48 +000079/* Short usage message (with %s for argv0) */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020080static const char usage_line[] =
Martin v. Löwis790465f2008-04-05 20:41:37 +000081"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000082
83/* Long usage message, split into parts < 512 bytes */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020084static const char usage_1[] = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000085Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000086-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
87 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Xiang Zhang0710d752017-03-11 13:02:52 +080088-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000089-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000090-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000091-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000092-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000093";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020094static const char usage_2[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000095-i : inspect interactively after running script; forces a prompt even\n\
96 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020097-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000098-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000099-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +0000100-OO : remove doc-strings in addition to the -O optimizations\n\
Georg Brandl9d871192010-12-04 10:47:18 +0000101-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +0000102-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +0000103-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +0000104";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200105static const char usage_3[] = "\
Berker Peksag7f580972017-10-13 15:16:31 +0300106-u : force the stdout and stderr streams to be unbuffered;\n\
107 this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000108-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
109 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000110-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +0900111 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000112-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +0000113 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +0000114-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000115-X opt : set implementation-specific option\n\
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800116--check-hash-based-pycs always|default|never:\n\
117 control how Python invalidates hash-based .pyc files\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +0000118";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200119static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +0000120file : program read from script file\n\
121- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000122arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000123Other environment variables:\n\
124PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200125PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000126 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +0000127";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200128static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200129"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +0000130" The default module search path uses %s.\n"
131"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
132"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be807c2016-03-14 12:04:26 +0100133"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
134static const char usage_6[] =
135"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
136" to seed the hashes of str, bytes and datetime objects. It can also be\n"
137" set to an integer in the range [0,4294967295] to get hash values with a\n"
138" predictable seed.\n"
139"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
140" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000141" hooks.\n"
Stéphane Wirtel7d1017d2017-06-12 13:30:33 +0200142"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000143" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
Victor Stinner5e3806f2017-11-30 11:40:24 +0100144" locale coercion and locale compatibility warnings on stderr.\n"
145"PYTHONDEVMODE: enable the development mode.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000146
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800147static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800148pymain_usage(int error, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000149{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800150 FILE *f = error ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 fprintf(f, usage_line, program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800153 if (error)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 fprintf(f, "Try `python -h' for more information.\n");
155 else {
156 fputs(usage_1, f);
157 fputs(usage_2, f);
158 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200159 fprintf(f, usage_4, (wint_t)DELIM);
160 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100161 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000163}
164
Victor Stinnera7368ac2017-11-15 18:11:45 -0800165
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200166static const char*
Victor Stinner9cfc0022017-12-20 19:36:46 +0100167config_get_env_var(const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -0800168{
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200169 const char *var = Py_GETENV(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800170 if (var && var[0] != '\0') {
171 return var;
172 }
173 else {
174 return NULL;
175 }
176}
177
178
Victor Stinnerca719ac2017-12-20 18:00:19 +0100179static int
180config_get_env_var_dup(wchar_t **dest, wchar_t *wname, char *name)
181{
182 if (Py_IgnoreEnvironmentFlag) {
183 *dest = NULL;
184 return 0;
185 }
186
187#ifdef MS_WINDOWS
188 const wchar_t *var = _wgetenv(wname);
189 if (!var || var[0] == '\0') {
190 *dest = NULL;
191 return 0;
192 }
193
194 wchar_t *copy = _PyMem_RawWcsdup(var);
195 if (copy == NULL) {
196 return -1;
197 }
198
199 *dest = copy;
200#else
201 const char *var = getenv(name);
202 if (!var || var[0] == '\0') {
203 *dest = NULL;
204 return 0;
205 }
206
207 size_t len;
208 wchar_t *wvar = Py_DecodeLocale(var, &len);
209 if (!wvar) {
210 if (len == (size_t)-2) {
211 return -2;
212 }
213 else {
214 return -1;
215 }
216 }
217 *dest = wvar;
218#endif
219 return 0;
220}
221
222
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800223static void
Victor Stinner33c377e2017-12-05 15:12:41 +0100224pymain_run_startup(PyCompilerFlags *cf)
Martin v. Löwis6caea372003-11-18 19:46:25 +0000225{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100226 const char *startup = config_get_env_var("PYTHONSTARTUP");
Victor Stinner6bf992a2017-12-06 17:26:10 +0100227 if (startup == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800228 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800230
231 FILE *fp = _Py_fopen(startup, "r");
232 if (fp == NULL) {
233 int save_errno = errno;
234 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
235 errno = save_errno;
236
237 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
238 startup);
239 PyErr_Print();
240 PyErr_Clear();
241 return;
242 }
243
244 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
245 PyErr_Clear();
246 fclose(fp);
Martin v. Löwis6caea372003-11-18 19:46:25 +0000247}
248
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800249static void
250pymain_run_interactive_hook(void)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200251{
252 PyObject *sys, *hook, *result;
253 sys = PyImport_ImportModule("sys");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800254 if (sys == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200255 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800256 }
257
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200258 hook = PyObject_GetAttrString(sys, "__interactivehook__");
259 Py_DECREF(sys);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800260 if (hook == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200261 PyErr_Clear();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800262 return;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200263 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800264
265 result = _PyObject_CallNoArg(hook);
266 Py_DECREF(hook);
267 if (result == NULL) {
268 goto error;
269 }
270 Py_DECREF(result);
271
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200272 return;
273
274error:
275 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
276 PyErr_Print();
277 PyErr_Clear();
278}
279
Thomas Woutersa9773292006-04-21 09:43:23 +0000280
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800281static int
Victor Stinnerc4bca952017-12-19 23:48:17 +0100282pymain_run_module(const wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 PyObject *module, *runpy, *runmodule, *runargs, *result;
285 runpy = PyImport_ImportModule("runpy");
286 if (runpy == NULL) {
287 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200288 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 return -1;
290 }
291 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
292 if (runmodule == NULL) {
293 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200294 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 Py_DECREF(runpy);
296 return -1;
297 }
298 module = PyUnicode_FromWideChar(modname, wcslen(modname));
299 if (module == NULL) {
300 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200301 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 Py_DECREF(runpy);
303 Py_DECREF(runmodule);
304 return -1;
305 }
306 runargs = Py_BuildValue("(Oi)", module, set_argv0);
307 if (runargs == NULL) {
308 fprintf(stderr,
309 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200310 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 Py_DECREF(runpy);
312 Py_DECREF(runmodule);
313 Py_DECREF(module);
314 return -1;
315 }
316 result = PyObject_Call(runmodule, runargs, NULL);
317 if (result == NULL) {
318 PyErr_Print();
319 }
320 Py_DECREF(runpy);
321 Py_DECREF(runmodule);
322 Py_DECREF(module);
323 Py_DECREF(runargs);
324 if (result == NULL) {
325 return -1;
326 }
327 Py_DECREF(result);
328 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000329}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000330
Nick Coghland2977a32017-03-12 20:38:32 +1000331static PyObject *
Victor Stinnerc4bca952017-12-19 23:48:17 +0100332pymain_get_importer(const wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000333{
Nick Coghland2977a32017-03-12 20:38:32 +1000334 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000335
Nick Coghland2977a32017-03-12 20:38:32 +1000336 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800337 if (sys_path0 == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000338 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800339 }
Victor Stinner4726e402010-10-06 23:24:57 +0000340
Nick Coghland2977a32017-03-12 20:38:32 +1000341 importer = PyImport_GetImporter(sys_path0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800342 if (importer == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000343 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800344 }
Victor Stinner4726e402010-10-06 23:24:57 +0000345
Brett Cannonaa936422012-04-27 15:30:58 -0400346 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000347 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000348 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000349 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800351
Victor Stinner4726e402010-10-06 23:24:57 +0000352 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000353 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000354
Nick Coghland2977a32017-03-12 20:38:32 +1000355error:
356 Py_XDECREF(sys_path0);
357 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
358 PyErr_Print();
359 PyErr_Clear();
360 return NULL;
361}
362
363
364static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800365pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
Victor Stinnera62207c2010-08-07 10:57:17 +0000366{
367 PyObject *unicode, *bytes;
368 int ret;
369
370 unicode = PyUnicode_FromWideChar(command, -1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800371 if (unicode == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000372 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800373 }
374
Victor Stinnera62207c2010-08-07 10:57:17 +0000375 bytes = PyUnicode_AsUTF8String(unicode);
376 Py_DECREF(unicode);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800377 if (bytes == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000378 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800379 }
380
Victor Stinnera62207c2010-08-07 10:57:17 +0000381 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
382 Py_DECREF(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800383 return (ret != 0);
Victor Stinnera62207c2010-08-07 10:57:17 +0000384
385error:
Victor Stinner398356b2010-08-18 22:23:22 +0000386 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000387 PyErr_Print();
388 return 1;
389}
390
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800391
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000392static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800393pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000394{
395 PyObject *unicode, *bytes = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +0200396 const char *filename_str;
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000397 int run;
398
399 /* call pending calls like signal handlers (SIGINT) */
400 if (Py_MakePendingCalls() == -1) {
401 PyErr_Print();
402 return 1;
403 }
404
405 if (filename) {
406 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
407 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000408 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000409 Py_DECREF(unicode);
410 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800411 if (bytes != NULL) {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000412 filename_str = PyBytes_AsString(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800413 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000414 else {
415 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000416 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000417 }
418 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800419 else {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000420 filename_str = "<stdin>";
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800421 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000422
423 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
424 Py_XDECREF(bytes);
425 return run != 0;
426}
427
Christian Heimes9cd17752007-11-18 19:35:23 +0000428
Guido van Rossum667d7041995-08-04 04:20:48 +0000429/* Main program */
430
Eric Snow6b4be192017-05-22 21:36:03 -0700431typedef struct {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100432 wchar_t **argv;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100433 int nwarnoption; /* Number of -W options */
434 wchar_t **warnoptions; /* -W options */
435 int nenv_warnoption; /* Number of PYTHONWARNINGS options */
436 wchar_t **env_warnoptions; /* PYTHONWARNINGS options */
Eric Snow6b4be192017-05-22 21:36:03 -0700437 int print_help; /* -h, -? options */
438 int print_version; /* -V option */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100439 int bytes_warning; /* Py_BytesWarningFlag, -b */
440 int debug; /* Py_DebugFlag, -b, PYTHONDEBUG */
441 int inspect; /* Py_InspectFlag, -i, PYTHONINSPECT */
442 int interactive; /* Py_InteractiveFlag, -i */
443 int isolated; /* Py_IsolatedFlag, -I */
444 int optimization_level; /* Py_OptimizeFlag, -O, PYTHONOPTIMIZE */
445 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag, -B, PYTHONDONTWRITEBYTECODE */
446 int no_user_site_directory; /* Py_NoUserSiteDirectory, -I, -s, PYTHONNOUSERSITE */
447 int no_site_import; /* Py_NoSiteFlag, -S */
448 int use_unbuffered_io; /* Py_UnbufferedStdioFlag, -u, PYTHONUNBUFFERED */
449 int verbosity; /* Py_VerboseFlag, -v, PYTHONVERBOSE */
450 int quiet_flag; /* Py_QuietFlag, -q */
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800451 const char *check_hash_pycs_mode; /* --check-hash-based-pycs */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100452#ifdef MS_WINDOWS
453 int legacy_windows_fs_encoding; /* Py_LegacyWindowsFSEncodingFlag,
454 PYTHONLEGACYWINDOWSFSENCODING */
455 int legacy_windows_stdio; /* Py_LegacyWindowsStdioFlag,
456 PYTHONLEGACYWINDOWSSTDIO */
457#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700458} _Py_CommandLineDetails;
459
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800460/* Structure used by Py_Main() to pass data to subfunctions */
461typedef struct {
Victor Stinner19760862017-12-20 01:41:59 +0100462 /* Input arguments */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800463 int argc;
Victor Stinner94540602017-12-16 04:54:22 +0100464 int use_bytes_argv;
465 char **bytes_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100466 wchar_t **wchar_argv;
Victor Stinner19760862017-12-20 01:41:59 +0100467
468 /* Exit status or "exit code": result of pymain_main() */
469 int status;
470 /* Error message if a function failed */
471 _PyInitError err;
472
Victor Stinner19760862017-12-20 01:41:59 +0100473 /* non-zero is stdin is a TTY or if -i option is used */
474 int stdin_is_interactive;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100475 int skip_first_line; /* -x option */
476 wchar_t *filename; /* Trailing arg without -c or -m */
477 wchar_t *command; /* -c argument */
478 wchar_t *module; /* -m argument */
Victor Stinner19760862017-12-20 01:41:59 +0100479
Victor Stinner9cfc0022017-12-20 19:36:46 +0100480 _PyCoreConfig config;
Victor Stinner19760862017-12-20 01:41:59 +0100481
482 PyObject *main_importer_path;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800483} _PyMain;
484
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800485#define _PyMain_INIT \
Victor Stinner9cfc0022017-12-20 19:36:46 +0100486 {.config = _PyCoreConfig_INIT, \
Victor Stinnerd5dda982017-12-13 17:31:16 +0100487 .err = _Py_INIT_OK()}
488/* Note: _PyMain_INIT sets other fields to 0/NULL */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800489
490
Victor Stinner19760862017-12-20 01:41:59 +0100491/* Non-zero if filename, command (-c) or module (-m) is set
492 on the command line */
493#define RUN_CODE(pymain) \
Victor Stinnerca719ac2017-12-20 18:00:19 +0100494 (pymain->command != NULL || pymain->filename != NULL \
495 || pymain->module != NULL)
Victor Stinner19760862017-12-20 01:41:59 +0100496
497
Victor Stinnerca719ac2017-12-20 18:00:19 +0100498static wchar_t*
499pymain_wstrdup(_PyMain *pymain, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800500{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100501 wchar_t *str2 = _PyMem_RawWcsdup(str);
502 if (str2 == NULL) {
503 pymain->err = _Py_INIT_NO_MEMORY();
504 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800505 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100506 return str2;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800507}
508
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100509
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800510static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100511clear_wstrlist(int len, wchar_t **list)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800512{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100513 for (int i=0; i < len; i++) {
514 PyMem_RawFree(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100515 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100516 PyMem_RawFree(list);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100517}
518
519
520static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100521pymain_init_cmdline_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100522{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100523 assert(cmdline->argv == NULL);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100524
Victor Stinnerca719ac2017-12-20 18:00:19 +0100525 if (pymain->use_bytes_argv) {
526 /* +1 for a the NULL terminator */
527 size_t size = sizeof(wchar_t*) * (pymain->argc + 1);
528 wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size);
529 if (argv == NULL) {
530 pymain->err = _Py_INIT_NO_MEMORY();
531 return -1;
532 }
533
534 for (int i = 0; i < pymain->argc; i++) {
535 size_t len;
536 wchar_t *arg = Py_DecodeLocale(pymain->bytes_argv[i], &len);
537 if (arg == NULL) {
538 clear_wstrlist(i, argv);
539 pymain->err = DECODE_LOCALE_ERR("command line arguments",
540 (Py_ssize_t)len);
541 return -1;
542 }
543 argv[i] = arg;
544 }
545 argv[pymain->argc] = NULL;
546
547 cmdline->argv = argv;
548 }
549 else {
550 cmdline->argv = pymain->wchar_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100551 }
552
Victor Stinnerca719ac2017-12-20 18:00:19 +0100553 wchar_t *program;
554 if (pymain->argc >= 1 && cmdline->argv != NULL) {
555 program = cmdline->argv[0];
556 }
557 else {
558 program = L"";
559 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100560 pymain->config.program = pymain_wstrdup(pymain, program);
561 if (pymain->config.program == NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100562 return -1;
563 }
564
Victor Stinnerc4bca952017-12-19 23:48:17 +0100565 return 0;
566}
567
568
569static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100570pymain_clear_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100571{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100572 PyMemAllocatorEx old_alloc;
573 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100574
Victor Stinnerca719ac2017-12-20 18:00:19 +0100575 clear_wstrlist(cmdline->nwarnoption, cmdline->warnoptions);
576 cmdline->nwarnoption = 0;
577 cmdline->warnoptions = NULL;
578
579 clear_wstrlist(cmdline->nenv_warnoption, cmdline->env_warnoptions);
580 cmdline->nenv_warnoption = 0;
581 cmdline->env_warnoptions = NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100582
583 if (pymain->use_bytes_argv && cmdline->argv != NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100584 clear_wstrlist(pymain->argc, cmdline->argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100585 }
586 cmdline->argv = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100587
588 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
589}
590
591
592static void
593pymain_clear_pymain(_PyMain *pymain)
594{
595#define CLEAR(ATTR) \
596 do { \
597 PyMem_RawFree(ATTR); \
598 ATTR = NULL; \
599 } while (0)
600
601 CLEAR(pymain->filename);
602 CLEAR(pymain->command);
603 CLEAR(pymain->module);
604#undef CLEAR
Victor Stinnerc4bca952017-12-19 23:48:17 +0100605}
606
Victor Stinnerc4bca952017-12-19 23:48:17 +0100607static void
Victor Stinner9cfc0022017-12-20 19:36:46 +0100608pymain_clear_config(_PyMain *pymain)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100609{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100610 /* Clear core config with the memory allocator
611 used by pymain_read_conf() */
612 PyMemAllocatorEx old_alloc;
613 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
614
Victor Stinner9cfc0022017-12-20 19:36:46 +0100615 _PyCoreConfig_Clear(&pymain->config);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100616
617 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
618}
619
620
621static void
622pymain_free_python(_PyMain *pymain)
623{
624 Py_CLEAR(pymain->main_importer_path);
Victor Stinnerd4341102017-11-23 00:12:09 +0100625
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800626#ifdef __INSURE__
627 /* Insure++ is a memory analysis tool that aids in discovering
628 * memory leaks and other memory problems. On Python exit, the
629 * interned string dictionaries are flagged as being in use at exit
630 * (which it is). Under normal circumstances, this is fine because
631 * the memory will be automatically reclaimed by the system. Under
632 * memory debugging, it's a huge source of useless noise, so we
633 * trade off slower shutdown for less distraction in the memory
634 * reports. -baw
635 */
636 _Py_ReleaseInternedUnicodeStrings();
637#endif /* __INSURE__ */
638}
639
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100640
641static void
Victor Stinnerc4bca952017-12-19 23:48:17 +0100642pymain_free_raw(_PyMain *pymain)
Victor Stinner94540602017-12-16 04:54:22 +0100643{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100644 _PyImport_Fini2();
Victor Stinner94540602017-12-16 04:54:22 +0100645
Victor Stinnerc4bca952017-12-19 23:48:17 +0100646 /* Free global variables which cannot be freed in Py_Finalize():
647 configuration options set before Py_Initialize() which should
648 remain valid after Py_Finalize(), since
649 Py_Initialize()-Py_Finalize() can be called multiple times. */
650 _PyPathConfig_Clear(&_Py_path_config);
Victor Stinner94540602017-12-16 04:54:22 +0100651
Victor Stinner31e99082017-12-20 23:41:38 +0100652 pymain_clear_config(pymain);
653
Victor Stinnerc4bca952017-12-19 23:48:17 +0100654 /* Force the allocator used by pymain_read_conf() */
655 PyMemAllocatorEx old_alloc;
656 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner94540602017-12-16 04:54:22 +0100657
Victor Stinnerca719ac2017-12-20 18:00:19 +0100658 pymain_clear_pymain(pymain);
659
660 clear_wstrlist(orig_argc, orig_argv);
661 orig_argc = 0;
662 orig_argv = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100663
Victor Stinnerc4bca952017-12-19 23:48:17 +0100664 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100665}
666
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100667
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800668static void
669pymain_free(_PyMain *pymain)
670{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100671 pymain_free_python(pymain);
672 pymain_free_raw(pymain);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800673}
674
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100675
Eric Snow6b4be192017-05-22 21:36:03 -0700676static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800677pymain_run_main_from_importer(_PyMain *pymain)
Guido van Rossum667d7041995-08-04 04:20:48 +0000678{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800679 /* Assume sys_path0 has already been checked by pymain_get_importer(),
680 * so put it in sys.path[0] and import __main__ */
Victor Stinner11a247d2017-12-13 21:05:57 +0100681 PyObject *sys_path = PySys_GetObject("path");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800682 if (sys_path == NULL) {
683 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
684 goto error;
685 }
686
Victor Stinner11a247d2017-12-13 21:05:57 +0100687 if (PyList_Insert(sys_path, 0, pymain->main_importer_path)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800688 goto error;
689 }
690
Victor Stinner11a247d2017-12-13 21:05:57 +0100691 int sts = pymain_run_module(L"__main__", 0);
692 return (sts != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800693
694error:
695 Py_CLEAR(pymain->main_importer_path);
696 PyErr_Print();
697 return 1;
698}
699
700
Victor Stinner9cfc0022017-12-20 19:36:46 +0100701static _PyInitError
702wstrlist_append(int *len, wchar_t ***list, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800703{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100704 wchar_t *str2 = _PyMem_RawWcsdup(str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800705 if (str2 == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100706 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800707 }
708
Victor Stinnerca719ac2017-12-20 18:00:19 +0100709 size_t size = (*len + 1) * sizeof(list[0]);
710 wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size);
711 if (list2 == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800712 PyMem_RawFree(str2);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100713 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800714 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100715 list2[*len] = str2;
716 *list = list2;
717 (*len)++;
Victor Stinner9cfc0022017-12-20 19:36:46 +0100718 return _Py_INIT_OK();
719}
720
721
722static int
723pymain_wstrlist_append(_PyMain *pymain, int *len, wchar_t ***list, const wchar_t *str)
724{
725 _PyInitError err = wstrlist_append(len, list, str);
726 if (_Py_INIT_FAILED(err)) {
727 pymain->err = err;
728 return -1;
729 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800730 return 0;
731}
732
733
734/* Parse the command line arguments
735 Return 0 on success.
736 Return 1 if parsing failed.
737 Set pymain->err and return -1 on other errors. */
738static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100739pymain_parse_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800740{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100741 _PyCoreConfig *config = &pymain->config;
742
Antoine Pitrou86838b02012-02-21 19:03:47 +0100743 _PyOS_ResetGetOpt();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800744 do {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800745 int longindex = -1;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100746 int c = _PyOS_GetOpt(pymain->argc, cmdline->argv, PROGRAM_OPTS,
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800747 longoptions, &longindex);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800748 if (c == EOF) {
749 break;
750 }
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 if (c == 'c') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 /* -c is the last option; following arguments
754 that look like options are left for the
755 command to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800756 size_t len = wcslen(_PyOS_optarg) + 1 + 1;
757 wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
758 if (command == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100759 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800760 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800761 }
762 memcpy(command, _PyOS_optarg, len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 command[len - 2] = '\n';
764 command[len - 1] = 0;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100765 pymain->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 break;
767 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 if (c == 'm') {
770 /* -m is the last option; following arguments
771 that look like options are left for the
772 module to interpret. */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100773 pymain->module = pymain_wstrdup(pymain, _PyOS_optarg);
774 if (pymain->module == NULL) {
775 return -1;
776 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 break;
778 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 switch (c) {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800781 case 0:
782 // Handle long option.
783 assert(longindex == 0); // Only one long option now.
784 if (!wcscmp(_PyOS_optarg, L"always")) {
785 cmdline->check_hash_pycs_mode = "always";
786 } else if (!wcscmp(_PyOS_optarg, L"never")) {
787 cmdline->check_hash_pycs_mode = "never";
788 } else if (!wcscmp(_PyOS_optarg, L"default")) {
789 cmdline->check_hash_pycs_mode = "default";
790 } else {
791 fprintf(stderr, "--check-hash-based-pycs must be one of "
792 "'default', 'always', or 'never'\n");
793 return 1;
794 }
795 break;
796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700798 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700802 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700806 cmdline->inspect++;
807 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000809
Christian Heimesad73a9c2013-08-10 16:36:18 +0200810 case 'I':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100811 config->ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700812 cmdline->isolated++;
813 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200814 break;
815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700819 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700823 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700827 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700831 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 case 'E':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100835 config->ignore_environment++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 case 't':
839 /* ignored for backwards compatibility */
840 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700843 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700847 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 case 'x':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100851 pymain->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 case 'h':
855 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700856 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700860 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 case 'W':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100864 if (pymain_wstrlist_append(pymain,
865 &cmdline->nwarnoption,
866 &cmdline->warnoptions,
867 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800868 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800869 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000871
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000872 case 'X':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100873 if (pymain_wstrlist_append(pymain,
Victor Stinner9cfc0022017-12-20 19:36:46 +0100874 &config->nxoption,
875 &config->xoptions,
Victor Stinnerca719ac2017-12-20 18:00:19 +0100876 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800877 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800878 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000879 break;
880
Georg Brandl9d871192010-12-04 10:47:18 +0000881 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700882 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000883 break;
884
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100885 case 'R':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100886 config->use_hash_seed = 0;
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100887 break;
888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 default:
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800892 /* unknown argument: parsing failed */
893 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800895 } while (1);
896
Victor Stinnerca719ac2017-12-20 18:00:19 +0100897 if (pymain->command == NULL && pymain->module == NULL
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800898 && _PyOS_optind < pymain->argc
Victor Stinnerc4bca952017-12-19 23:48:17 +0100899 && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800900 {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100901 pymain->filename = pymain_wstrdup(pymain, cmdline->argv[_PyOS_optind]);
902 if (pymain->filename == NULL) {
903 return -1;
904 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000906
Victor Stinnerd5dda982017-12-13 17:31:16 +0100907 /* -c and -m options are exclusive */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100908 assert(!(pymain->command != NULL && pymain->module != NULL));
Victor Stinnerd5dda982017-12-13 17:31:16 +0100909
Eric Snow6b4be192017-05-22 21:36:03 -0700910 return 0;
911}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000912
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800913
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800914static int
Victor Stinner9cfc0022017-12-20 19:36:46 +0100915add_xoption(PyObject *opts, const wchar_t *s)
Victor Stinner374c6e12017-12-14 12:05:26 +0100916{
917 PyObject *name, *value;
918
919 const wchar_t *name_end = wcschr(s, L'=');
920 if (!name_end) {
921 name = PyUnicode_FromWideChar(s, -1);
922 value = Py_True;
923 Py_INCREF(value);
924 }
925 else {
926 name = PyUnicode_FromWideChar(s, name_end - s);
927 value = PyUnicode_FromWideChar(name_end + 1, -1);
928 }
929 if (name == NULL || value == NULL) {
930 goto error;
931 }
932 if (PyDict_SetItem(opts, name, value) < 0) {
933 goto error;
934 }
935 Py_DECREF(name);
936 Py_DECREF(value);
937 return 0;
938
939error:
940 Py_XDECREF(name);
941 Py_XDECREF(value);
942 return -1;
943}
944
Victor Stinner9cfc0022017-12-20 19:36:46 +0100945
946static PyObject*
947config_create_xoptions_dict(const _PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800948{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100949 int nxoption = config->nxoption;
950 wchar_t **xoptions = config->xoptions;
Victor Stinner374c6e12017-12-14 12:05:26 +0100951 PyObject *dict = PyDict_New();
952 if (dict == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100953 return NULL;
Victor Stinner374c6e12017-12-14 12:05:26 +0100954 }
955
Victor Stinnerca719ac2017-12-20 18:00:19 +0100956 for (int i=0; i < nxoption; i++) {
957 wchar_t *option = xoptions[i];
Victor Stinner9cfc0022017-12-20 19:36:46 +0100958 if (add_xoption(dict, option) < 0) {
Victor Stinner374c6e12017-12-14 12:05:26 +0100959 Py_DECREF(dict);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100960 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800961 }
962 }
Victor Stinner374c6e12017-12-14 12:05:26 +0100963
Victor Stinner9cfc0022017-12-20 19:36:46 +0100964 return dict;
Eric Snow6b4be192017-05-22 21:36:03 -0700965}
966
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800967
Victor Stinner9cfc0022017-12-20 19:36:46 +0100968static _PyInitError
969config_add_warnings_optlist(_PyCoreConfig *config, int len, wchar_t **options)
Eric Snow6b4be192017-05-22 21:36:03 -0700970{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100971 for (int i = 0; i < len; i++) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100972 _PyInitError err = wstrlist_append(&config->nwarnoption,
973 &config->warnoptions,
974 options[i]);
975 if (_Py_INIT_FAILED(err)) {
976 return err;
Eric Snow6b4be192017-05-22 21:36:03 -0700977 }
Eric Snow6b4be192017-05-22 21:36:03 -0700978 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100979 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800980}
Eric Snow6b4be192017-05-22 21:36:03 -0700981
Victor Stinner747f48e2017-12-12 22:59:48 +0100982
Victor Stinner9cfc0022017-12-20 19:36:46 +0100983static _PyInitError
984config_init_warnoptions(_PyCoreConfig *config, _Py_CommandLineDetails *cmdline)
Victor Stinner747f48e2017-12-12 22:59:48 +0100985{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100986 _PyInitError err;
987
988 assert(config->nwarnoption == 0);
989
Victor Stinner747f48e2017-12-12 22:59:48 +0100990 /* The priority order for warnings configuration is (highest precedence
991 * first):
992 *
993 * - the BytesWarning filter, if needed ('-b', '-bb')
994 * - any '-W' command line options; then
995 * - the 'PYTHONWARNINGS' environment variable; then
996 * - the dev mode filter ('-X dev', 'PYTHONDEVMODE'); then
997 * - any implicit filters added by _warnings.c/warnings.py
998 *
999 * All settings except the last are passed to the warnings module via
1000 * the `sys.warnoptions` list. Since the warnings module works on the basis
1001 * of "the most recently added filter will be checked first", we add
1002 * the lowest precedence entries first so that later entries override them.
1003 */
1004
Victor Stinner9cfc0022017-12-20 19:36:46 +01001005 if (config->dev_mode) {
1006 err = wstrlist_append(&config->nwarnoption,
1007 &config->warnoptions,
1008 L"default");
1009 if (_Py_INIT_FAILED(err)) {
1010 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001011 }
Victor Stinner747f48e2017-12-12 22:59:48 +01001012 }
Victor Stinner374c6e12017-12-14 12:05:26 +01001013
Victor Stinner9cfc0022017-12-20 19:36:46 +01001014 err = config_add_warnings_optlist(config,
1015 cmdline->nenv_warnoption,
1016 cmdline->env_warnoptions);
1017 if (_Py_INIT_FAILED(err)) {
1018 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001019 }
1020
Victor Stinner9cfc0022017-12-20 19:36:46 +01001021 err = config_add_warnings_optlist(config,
1022 cmdline->nwarnoption,
1023 cmdline->warnoptions);
1024 if (_Py_INIT_FAILED(err)) {
1025 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001026 }
1027
1028 /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c
1029 * don't even try to emit a warning, so we skip setting the filter in that
1030 * case.
1031 */
1032 if (cmdline->bytes_warning) {
1033 wchar_t *filter;
1034 if (cmdline->bytes_warning> 1) {
1035 filter = L"error::BytesWarning";
1036 }
1037 else {
1038 filter = L"default::BytesWarning";
1039 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001040 err = wstrlist_append(&config->nwarnoption,
1041 &config->warnoptions,
1042 filter);
1043 if (_Py_INIT_FAILED(err)) {
1044 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001045 }
1046 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001047 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001048}
1049
1050
1051static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01001052main_config_init_warnoptions(_PyMainInterpreterConfig *main_config,
1053 const _PyCoreConfig *config)
Victor Stinnerca719ac2017-12-20 18:00:19 +01001054{
1055 PyObject *warnoptions = PyList_New(0);
1056 if (warnoptions == NULL) {
1057 return -1;
1058 }
1059
Victor Stinner9cfc0022017-12-20 19:36:46 +01001060 for (int i = 0; i < config->nwarnoption; i++) {
1061 PyObject *option = PyUnicode_FromWideChar(config->warnoptions[i], -1);
Victor Stinnerca719ac2017-12-20 18:00:19 +01001062 if (option == NULL) {
1063 goto error;
1064 }
1065 if (PyList_Append(warnoptions, option)) {
1066 Py_DECREF(option);
1067 goto error;
1068 }
1069 Py_DECREF(option);
1070 }
1071
Victor Stinner9cfc0022017-12-20 19:36:46 +01001072 main_config->warnoptions = warnoptions;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001073 return 0;
Victor Stinner374c6e12017-12-14 12:05:26 +01001074
1075error:
1076 Py_DECREF(warnoptions);
1077 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001078}
Eric Snow6b4be192017-05-22 21:36:03 -07001079
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001080
1081/* Get warning options from PYTHONWARNINGS environment variable.
1082 Return 0 on success.
1083 Set pymain->err and return -1 on error. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001084static _PyInitError
1085cmdline_init_env_warnoptions(_Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001086{
1087 if (Py_IgnoreEnvironmentFlag) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001088 return _Py_INIT_OK();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +00001090
Victor Stinnerca719ac2017-12-20 18:00:19 +01001091 wchar_t *env;
1092 int res = config_get_env_var_dup(&env, L"PYTHONWARNINGS", "PYTHONWARNINGS");
1093 if (res < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001094 return DECODE_LOCALE_ERR("PYTHONWARNINGS", res);
Victor Stinnerca719ac2017-12-20 18:00:19 +01001095 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001096
Victor Stinnerca719ac2017-12-20 18:00:19 +01001097 if (env == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001098 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001099 }
Philip Jenvey0805ca32010-04-07 04:04:10 +00001100
Victor Stinnerca719ac2017-12-20 18:00:19 +01001101
1102 wchar_t *warning, *context = NULL;
1103 for (warning = WCSTOK(env, L",", &context);
1104 warning != NULL;
1105 warning = WCSTOK(NULL, L",", &context))
1106 {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001107 _PyInitError err = wstrlist_append(&cmdline->nenv_warnoption,
1108 &cmdline->env_warnoptions,
1109 warning);
1110 if (_Py_INIT_FAILED(err)) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001111 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001112 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001113 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001115 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001116 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001117}
1118
1119
1120static void
1121pymain_init_stdio(_PyMain *pymain)
1122{
1123 pymain->stdin_is_interactive = (isatty(fileno(stdin))
1124 || Py_InteractiveFlag);
Guido van Rossum775af911997-02-14 19:50:32 +00001125
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00001126#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +00001127 /* don't translate newlines (\r\n <=> \n) */
1128 _setmode(fileno(stdin), O_BINARY);
1129 _setmode(fileno(stdout), O_BINARY);
1130 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +00001131#endif
Victor Stinner89e34362011-01-07 18:47:22 +00001132
1133 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +00001134#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
1136 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
1137 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001138#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 setbuf(stdin, (char *)NULL);
1140 setbuf(stdout, (char *)NULL);
1141 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001142#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 }
1144 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +00001145#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 /* Doesn't have to have line-buffered -- use unbuffered */
1147 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
1148 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001149#else /* !MS_WINDOWS */
1150#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
1152 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001153#endif /* HAVE_SETVBUF */
1154#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 /* Leave stderr alone - it should be unbuffered anyway. */
1156 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001157}
Guido van Rossum667d7041995-08-04 04:20:48 +00001158
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001159
1160/* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__
Victor Stinner31a83932017-12-04 13:39:15 +01001161 environment variables on macOS if available. */
1162static _PyInitError
Victor Stinnerca719ac2017-12-20 18:00:19 +01001163config_init_program_name(_PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001164{
Victor Stinner31a83932017-12-04 13:39:15 +01001165 assert(config->program_name == NULL);
1166
1167 /* If Py_SetProgramName() was called, use its value */
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001168 const wchar_t *program_name = _Py_path_config.program_name;
Victor Stinner31a83932017-12-04 13:39:15 +01001169 if (program_name != NULL) {
1170 config->program_name = _PyMem_RawWcsdup(program_name);
1171 if (config->program_name == NULL) {
1172 return _Py_INIT_NO_MEMORY();
1173 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001174 return _Py_INIT_OK();
Victor Stinner31a83932017-12-04 13:39:15 +01001175 }
1176
Just van Rossum2ac79ef2003-03-05 15:46:54 +00001177#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 /* On MacOS X, when the Python interpreter is embedded in an
1179 application bundle, it gets executed by a bootstrapping script
1180 that does os.execve() with an argv[0] that's different from the
1181 actual Python executable. This is needed to keep the Finder happy,
1182 or rather, to work around Apple's overly strict requirements of
1183 the process name. However, we still need a usable sys.executable,
1184 so the actual executable path is passed in an environment variable.
1185 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
1186 script. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001187 const char *p = config_get_env_var("PYTHONEXECUTABLE");
Victor Stinner6bf992a2017-12-06 17:26:10 +01001188 if (p != NULL) {
Victor Stinner31a83932017-12-04 13:39:15 +01001189 size_t len;
1190 wchar_t* program_name = Py_DecodeLocale(p, &len);
1191 if (program_name == NULL) {
1192 return DECODE_LOCALE_ERR("PYTHONEXECUTABLE environment "
1193 "variable", (Py_ssize_t)len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 }
Victor Stinner31a83932017-12-04 13:39:15 +01001195 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001196 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001197 }
Vinay Sajip90db6612012-07-17 17:33:46 +01001198#ifdef WITH_NEXT_FRAMEWORK
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001199 else {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001200 const char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
Vinay Sajip90db6612012-07-17 17:33:46 +01001201 if (pyvenv_launcher && *pyvenv_launcher) {
1202 /* Used by Mac/Tools/pythonw.c to forward
1203 * the argv0 of the stub executable
1204 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001205 size_t len;
Victor Stinner31a83932017-12-04 13:39:15 +01001206 wchar_t* program_name = Py_DecodeLocale(pyvenv_launcher, &len);
1207 if (program_name == NULL) {
1208 return DECODE_LOCALE_ERR("__PYVENV_LAUNCHER__ environment "
1209 "variable", (Py_ssize_t)len);
Vinay Sajip90db6612012-07-17 17:33:46 +01001210 }
Victor Stinner31a83932017-12-04 13:39:15 +01001211 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001212 return _Py_INIT_OK();
Vinay Sajip90db6612012-07-17 17:33:46 +01001213 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001215#endif /* WITH_NEXT_FRAMEWORK */
1216#endif /* __APPLE__ */
Victor Stinneraf5a8952017-12-02 10:11:32 +01001217
Victor Stinnerca719ac2017-12-20 18:00:19 +01001218 /* Use argv[0] by default, if available */
1219 if (config->program != NULL) {
1220 config->program_name = _PyMem_RawWcsdup(config->program);
1221 if (config->program_name == NULL) {
1222 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001223 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001224 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001225 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001226
1227 /* Last fall back: hardcoded string */
1228#ifdef MS_WINDOWS
1229 const wchar_t *default_program_name = L"python";
1230#else
1231 const wchar_t *default_program_name = L"python3";
1232#endif
1233 config->program_name = _PyMem_RawWcsdup(default_program_name);
1234 if (config->program_name == NULL) {
1235 return _Py_INIT_NO_MEMORY();
1236 }
1237 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001238}
1239
1240
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001241static void
1242pymain_header(_PyMain *pymain)
1243{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001244 if (Py_QuietFlag) {
1245 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 }
Guido van Rossum393661d2001-08-31 17:40:15 +00001247
Victor Stinner19760862017-12-20 01:41:59 +01001248 if (!Py_VerboseFlag && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001249 return;
1250 }
1251
1252 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
1253 if (!Py_NoSiteFlag) {
1254 fprintf(stderr, "%s\n", COPYRIGHT);
1255 }
1256}
1257
1258
Victor Stinnerc4bca952017-12-19 23:48:17 +01001259static wchar_t**
Victor Stinnerca719ac2017-12-20 18:00:19 +01001260copy_wstrlist(int len, wchar_t **list)
Victor Stinner11a247d2017-12-13 21:05:57 +01001261{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001262 assert((len > 0 && list != NULL) || len == 0);
1263 size_t size = len * sizeof(list[0]);
1264 wchar_t **list_copy = PyMem_RawMalloc(size);
1265 for (int i=0; i < len; i++) {
1266 wchar_t* arg = _PyMem_RawWcsdup(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001267 if (arg == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001268 clear_wstrlist(i, list);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001269 return NULL;
1270 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001271 list_copy[i] = arg;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001272 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001273 return list_copy;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001274}
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001275
Victor Stinnerc4bca952017-12-19 23:48:17 +01001276
1277static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001278pymain_init_core_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001279{
Victor Stinnerc4bca952017-12-19 23:48:17 +01001280 /* Copy argv to be able to modify it (to force -c/-m) */
1281 int argc = pymain->argc - _PyOS_optind;
1282 wchar_t **argv;
1283
1284 if (argc <= 0 || cmdline->argv == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01001285 /* Ensure at least one (empty) argument is seen */
1286 static wchar_t *empty_argv[1] = {L""};
Victor Stinner11a247d2017-12-13 21:05:57 +01001287 argc = 1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001288 argv = copy_wstrlist(1, empty_argv);
Victor Stinner11a247d2017-12-13 21:05:57 +01001289 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01001290 else {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001291 argv = copy_wstrlist(argc, &cmdline->argv[_PyOS_optind]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001292 }
1293
1294 if (argv == NULL) {
1295 pymain->err = _Py_INIT_NO_MEMORY();
1296 return -1;
1297 }
1298
1299 wchar_t *arg0 = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001300 if (pymain->command != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001301 /* Force sys.argv[0] = '-c' */
1302 arg0 = L"-c";
1303 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001304 else if (pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001305 /* Force sys.argv[0] = '-m'*/
1306 arg0 = L"-m";
1307 }
1308 if (arg0 != NULL) {
1309 arg0 = _PyMem_RawWcsdup(arg0);
1310 if (arg0 == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001311 clear_wstrlist(argc, argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001312 pymain->err = _Py_INIT_NO_MEMORY();
1313 return -1;
1314 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001315
1316 assert(argc >= 1);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001317 PyMem_RawFree(argv[0]);
1318 argv[0] = arg0;
1319 }
1320
Victor Stinner9cfc0022017-12-20 19:36:46 +01001321 pymain->config.argc = argc;
1322 pymain->config.argv = argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001323 return 0;
1324}
1325
1326
1327static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01001328main_config_init_argv(_PyMainInterpreterConfig *main_config,
1329 const _PyCoreConfig *config)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001330{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001331 if (config->argc < 0) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001332 return 0;
1333 }
1334
Victor Stinner9cfc0022017-12-20 19:36:46 +01001335 int argc = config->argc;
1336 wchar_t** argv = config->argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001337 assert(argc >= 1 && argv != NULL);
Victor Stinner11a247d2017-12-13 21:05:57 +01001338
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001339 PyObject *list = PyList_New(argc);
1340 if (list == NULL) {
1341 return -1;
Victor Stinner11a247d2017-12-13 21:05:57 +01001342 }
1343
1344 for (int i = 0; i < argc; i++) {
1345 PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
1346 if (v == NULL) {
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001347 Py_DECREF(list);
1348 return -1;
Victor Stinner11a247d2017-12-13 21:05:57 +01001349 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001350 PyList_SET_ITEM(list, i, v);
Victor Stinner11a247d2017-12-13 21:05:57 +01001351 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001352
Victor Stinner9cfc0022017-12-20 19:36:46 +01001353 main_config->argv = list;
Victor Stinner11a247d2017-12-13 21:05:57 +01001354 return 0;
Victor Stinner11a247d2017-12-13 21:05:57 +01001355}
1356
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001357
Victor Stinner11a247d2017-12-13 21:05:57 +01001358static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01001359pymain_compute_path0(_PyMain *pymain, PyObject **path0)
Victor Stinner11a247d2017-12-13 21:05:57 +01001360{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001361 if (pymain->main_importer_path != NULL) {
1362 /* Let pymain_run_main_from_importer() adjust sys.path[0] later */
Victor Stinner19760862017-12-20 01:41:59 +01001363 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001364 return 0;
1365 }
1366
1367 if (Py_IsolatedFlag) {
Victor Stinner19760862017-12-20 01:41:59 +01001368 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001369 return 0;
1370 }
1371
Victor Stinner9cfc0022017-12-20 19:36:46 +01001372 *path0 = _PyPathConfig_ComputeArgv0(pymain->config.argc,
1373 pymain->config.argv);
Victor Stinner19760862017-12-20 01:41:59 +01001374 if (*path0 == NULL) {
1375 pymain->err = _Py_INIT_NO_MEMORY();
1376 return -1;
1377 }
1378 return 0;
1379}
1380
1381
1382static int
1383pymain_update_sys_path(_PyMain *pymain, PyObject *path0)
1384{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001385 /* Prepend argv[0] to sys.path.
1386 If argv[0] is a symlink, use the real path. */
1387 PyObject *sys_path = PySys_GetObject("path");
1388 if (sys_path == NULL) {
1389 pymain->err = _Py_INIT_ERR("can't get sys.path");
Victor Stinnerd5dda982017-12-13 17:31:16 +01001390 return -1;
1391 }
1392
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001393 /* Prepend path0 to sys.path */
1394 if (PyList_Insert(sys_path, 0, path0) < 0) {
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001395 pymain->err = _Py_INIT_ERR("sys.path.insert(0, path0) failed");
1396 return -1;
1397 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01001398 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001399}
1400
1401
Victor Stinner6bf992a2017-12-06 17:26:10 +01001402/* Get Py_xxx global configuration variables */
1403static void
Victor Stinnerca719ac2017-12-20 18:00:19 +01001404pymain_get_global_config(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinner6bf992a2017-12-06 17:26:10 +01001405{
Victor Stinner91106cd2017-12-13 12:29:09 +01001406 cmdline->bytes_warning = Py_BytesWarningFlag;
1407 cmdline->debug = Py_DebugFlag;
1408 cmdline->inspect = Py_InspectFlag;
1409 cmdline->interactive = Py_InteractiveFlag;
1410 cmdline->isolated = Py_IsolatedFlag;
1411 cmdline->optimization_level = Py_OptimizeFlag;
1412 cmdline->dont_write_bytecode = Py_DontWriteBytecodeFlag;
1413 cmdline->no_user_site_directory = Py_NoUserSiteDirectory;
1414 cmdline->no_site_import = Py_NoSiteFlag;
1415 cmdline->use_unbuffered_io = Py_UnbufferedStdioFlag;
1416 cmdline->verbosity = Py_VerboseFlag;
1417 cmdline->quiet_flag = Py_QuietFlag;
1418#ifdef MS_WINDOWS
1419 cmdline->legacy_windows_fs_encoding = Py_LegacyWindowsFSEncodingFlag;
1420 cmdline->legacy_windows_stdio = Py_LegacyWindowsStdioFlag;
1421#endif
1422 cmdline->check_hash_pycs_mode = _Py_CheckHashBasedPycsMode ;
1423
Victor Stinner9cfc0022017-12-20 19:36:46 +01001424 pymain->config.ignore_environment = Py_IgnoreEnvironmentFlag;
1425 pymain->config.utf8_mode = Py_UTF8Mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001426}
1427
1428
Victor Stinner19760862017-12-20 01:41:59 +01001429/* Set Py_xxx global configuration variables */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001430static void
Victor Stinnerca719ac2017-12-20 18:00:19 +01001431pymain_set_global_config(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001432{
Victor Stinner91106cd2017-12-13 12:29:09 +01001433 Py_BytesWarningFlag = cmdline->bytes_warning;
1434 Py_DebugFlag = cmdline->debug;
1435 Py_InspectFlag = cmdline->inspect;
1436 Py_InteractiveFlag = cmdline->interactive;
1437 Py_IsolatedFlag = cmdline->isolated;
1438 Py_OptimizeFlag = cmdline->optimization_level;
1439 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
1440 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
1441 Py_NoSiteFlag = cmdline->no_site_import;
1442 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
1443 Py_VerboseFlag = cmdline->verbosity;
1444 Py_QuietFlag = cmdline->quiet_flag;
1445 _Py_CheckHashBasedPycsMode = cmdline->check_hash_pycs_mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001446#ifdef MS_WINDOWS
Victor Stinner91106cd2017-12-13 12:29:09 +01001447 Py_LegacyWindowsFSEncodingFlag = cmdline->legacy_windows_fs_encoding;
1448 Py_LegacyWindowsStdioFlag = cmdline->legacy_windows_stdio;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001449#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001450
Victor Stinner9cfc0022017-12-20 19:36:46 +01001451 Py_IgnoreEnvironmentFlag = pymain->config.ignore_environment;
1452 Py_UTF8Mode = pymain->config.utf8_mode;
Victor Stinner358e5e12017-12-15 00:51:22 +01001453
1454 /* Random or non-zero hash seed */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001455 Py_HashRandomizationFlag = (pymain->config.use_hash_seed == 0 ||
1456 pymain->config.hash_seed != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001457}
1458
1459
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001460static void
1461pymain_import_readline(_PyMain *pymain)
1462{
1463 if (Py_IsolatedFlag) {
1464 return;
1465 }
Victor Stinner19760862017-12-20 01:41:59 +01001466 if (!Py_InspectFlag && RUN_CODE(pymain)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001467 return;
1468 }
1469 if (!isatty(fileno(stdin))) {
1470 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001471 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001472
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001473 PyObject *mod = PyImport_ImportModule("readline");
1474 if (mod == NULL) {
1475 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 }
1477 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001478 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001480}
1481
1482
1483static FILE*
1484pymain_open_filename(_PyMain *pymain)
1485{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001486 FILE* fp;
1487
Victor Stinnerca719ac2017-12-20 18:00:19 +01001488 fp = _Py_wfopen(pymain->filename, L"r");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001489 if (fp == NULL) {
1490 char *cfilename_buffer;
1491 const char *cfilename;
1492 int err = errno;
Victor Stinner9dd76202017-12-21 16:20:32 +01001493 cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001494 if (cfilename_buffer != NULL)
1495 cfilename = cfilename_buffer;
1496 else
1497 cfilename = "<unprintable file name>";
1498 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001499 pymain->config.program, cfilename, err, strerror(err));
Victor Stinner9dd76202017-12-21 16:20:32 +01001500 PyMem_RawFree(cfilename_buffer);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001501 pymain->status = 2;
1502 return NULL;
1503 }
1504
Victor Stinnerca719ac2017-12-20 18:00:19 +01001505 if (pymain->skip_first_line) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001506 int ch;
1507 /* Push back first newline so line numbers
1508 remain the same */
1509 while ((ch = getc(fp)) != EOF) {
1510 if (ch == '\n') {
1511 (void)ungetc(ch, fp);
1512 break;
1513 }
1514 }
1515 }
1516
1517 struct _Py_stat_struct sb;
1518 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1519 S_ISDIR(sb.st_mode)) {
1520 fprintf(stderr,
1521 "%ls: '%ls' is a directory, cannot continue\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001522 pymain->config.program, pymain->filename);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001523 fclose(fp);
1524 pymain->status = 1;
1525 return NULL;
1526 }
1527
1528 return fp;
1529}
1530
1531
1532static void
Victor Stinner19760862017-12-20 01:41:59 +01001533pymain_run_filename(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001534{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001535 if (pymain->filename == NULL && pymain->stdin_is_interactive) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001536 Py_InspectFlag = 0; /* do exit on SystemExit */
Victor Stinner19760862017-12-20 01:41:59 +01001537 pymain_run_startup(cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001538 pymain_run_interactive_hook();
1539 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001540
1541 if (pymain->main_importer_path != NULL) {
1542 pymain->status = pymain_run_main_from_importer(pymain);
1543 return;
1544 }
1545
1546 FILE *fp;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001547 if (pymain->filename != NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001548 fp = pymain_open_filename(pymain);
1549 if (fp == NULL) {
1550 return;
1551 }
1552 }
1553 else {
1554 fp = stdin;
1555 }
1556
Victor Stinnerca719ac2017-12-20 18:00:19 +01001557 pymain->status = pymain_run_file(fp, pymain->filename, cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001558}
1559
1560
1561static void
Victor Stinner19760862017-12-20 01:41:59 +01001562pymain_repl(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001565 opportunity to set it from Python. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001566 if (!Py_InspectFlag && config_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 Py_InspectFlag = 1;
1568 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001569
Victor Stinner19760862017-12-20 01:41:59 +01001570 if (!(Py_InspectFlag && pymain->stdin_is_interactive && RUN_CODE(pymain))) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001571 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001573
1574 Py_InspectFlag = 0;
1575 pymain_run_interactive_hook();
Victor Stinner33c377e2017-12-05 15:12:41 +01001576
Victor Stinner19760862017-12-20 01:41:59 +01001577 int res = PyRun_AnyFileFlags(stdin, "<stdin>", cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001578 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001579}
1580
1581
1582/* Parse the command line.
1583 Handle --version and --help options directly.
1584
1585 Return 1 if Python must exit.
1586 Return 0 on success.
1587 Set pymain->err and return -1 on failure. */
1588static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001589pymain_parse_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001590{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001591 int res = pymain_parse_cmdline_impl(pymain, cmdline);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001592 if (res < 0) {
1593 return -1;
1594 }
1595 if (res) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001596 pymain_usage(1, pymain->config.program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001597 pymain->status = 2;
1598 return 1;
1599 }
1600
Victor Stinnerca719ac2017-12-20 18:00:19 +01001601 if (pymain->command != NULL || pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001602 /* Backup _PyOS_optind */
1603 _PyOS_optind--;
1604 }
1605
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001606 return 0;
1607}
1608
1609
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001610static const wchar_t*
Victor Stinner9cfc0022017-12-20 19:36:46 +01001611config_get_xoption(_PyCoreConfig *config, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001612{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001613 int nxoption = config->nxoption;
1614 wchar_t **xoptions = config->xoptions;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001615 for (int i=0; i < nxoption; i++) {
1616 wchar_t *option = xoptions[i];
Victor Stinnera7368ac2017-11-15 18:11:45 -08001617 size_t len;
1618 wchar_t *sep = wcschr(option, L'=');
1619 if (sep != NULL) {
1620 len = (sep - option);
1621 }
1622 else {
1623 len = wcslen(option);
1624 }
1625 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1626 return option;
1627 }
1628 }
1629 return NULL;
1630}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001631
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001632
Victor Stinnera7368ac2017-11-15 18:11:45 -08001633static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001634pymain_str_to_int(const char *str, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001635{
1636 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001637 const char *endptr = str;
1638 long value = strtol(str, (char **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001639 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001640 return -1;
1641 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001642 if (value < INT_MIN || value > INT_MAX) {
1643 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001644 }
1645
Victor Stinnera7368ac2017-11-15 18:11:45 -08001646 *result = (int)value;
1647 return 0;
1648}
1649
1650
1651static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001652pymain_wstr_to_int(const wchar_t *wstr, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001653{
1654 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001655 const wchar_t *endptr = wstr;
1656 long value = wcstol(wstr, (wchar_t **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001657 if (*endptr != '\0' || errno == ERANGE) {
1658 return -1;
1659 }
1660 if (value < INT_MIN || value > INT_MAX) {
1661 return -1;
1662 }
1663
1664 *result = (int)value;
1665 return 0;
1666}
1667
1668
Victor Stinner9cfc0022017-12-20 19:36:46 +01001669static _PyInitError
1670pymain_init_tracemalloc(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001671{
1672 int nframe;
1673 int valid;
1674
Victor Stinner9cfc0022017-12-20 19:36:46 +01001675 const char *env = config_get_env_var("PYTHONTRACEMALLOC");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001676 if (env) {
1677 if (!pymain_str_to_int(env, &nframe)) {
1678 valid = (nframe >= 1);
1679 }
1680 else {
1681 valid = 0;
1682 }
1683 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001684 return _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid number "
1685 "of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001686 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001687 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001688 }
1689
Victor Stinner9cfc0022017-12-20 19:36:46 +01001690 const wchar_t *xoption = config_get_xoption(config, L"tracemalloc");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001691 if (xoption) {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001692 const wchar_t *sep = wcschr(xoption, L'=');
Victor Stinnera7368ac2017-11-15 18:11:45 -08001693 if (sep) {
1694 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1695 valid = (nframe >= 1);
1696 }
1697 else {
1698 valid = 0;
1699 }
1700 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001701 return _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1702 "invalid number of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001703 }
1704 }
1705 else {
1706 /* -X tracemalloc behaves as -X tracemalloc=1 */
1707 nframe = 1;
1708 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001709 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001710 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001711 return _Py_INIT_OK();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001712}
1713
1714
1715static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001716get_env_flag(int *flag, const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001717{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001718 const char *var = config_get_env_var(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001719 if (!var) {
1720 return;
1721 }
1722 int value;
1723 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1724 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1725 value = 1;
1726 }
1727 if (*flag < value) {
1728 *flag = value;
1729 }
1730}
1731
1732
1733static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001734cmdline_get_env_flags(_Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001735{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001736 get_env_flag(&cmdline->debug, "PYTHONDEBUG");
1737 get_env_flag(&cmdline->verbosity, "PYTHONVERBOSE");
1738 get_env_flag(&cmdline->optimization_level, "PYTHONOPTIMIZE");
1739 get_env_flag(&cmdline->inspect, "PYTHONINSPECT");
1740 get_env_flag(&cmdline->dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
1741 get_env_flag(&cmdline->no_user_site_directory, "PYTHONNOUSERSITE");
1742 get_env_flag(&cmdline->use_unbuffered_io, "PYTHONUNBUFFERED");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001743#ifdef MS_WINDOWS
Victor Stinner9cfc0022017-12-20 19:36:46 +01001744 get_env_flag(&cmdline->legacy_windows_fs_encoding,
1745 "PYTHONLEGACYWINDOWSFSENCODING");
1746 get_env_flag(&cmdline->legacy_windows_stdio,
1747 "PYTHONLEGACYWINDOWSSTDIO");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001748#endif
1749}
1750
1751
Victor Stinner46972b72017-11-24 22:55:40 +01001752static _PyInitError
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001753config_init_home(_PyCoreConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001754{
1755 wchar_t *home;
1756
Victor Stinner31a83932017-12-04 13:39:15 +01001757 /* If Py_SetPythonHome() was called, use its value */
1758 home = _Py_path_config.home;
Victor Stinner1f151112017-11-23 10:43:14 +01001759 if (home) {
Victor Stinner46972b72017-11-24 22:55:40 +01001760 config->home = _PyMem_RawWcsdup(home);
1761 if (config->home == NULL) {
1762 return _Py_INIT_NO_MEMORY();
Victor Stinner1f151112017-11-23 10:43:14 +01001763 }
Victor Stinner46972b72017-11-24 22:55:40 +01001764 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001765 }
1766
Victor Stinner46972b72017-11-24 22:55:40 +01001767 int res = config_get_env_var_dup(&home, L"PYTHONHOME", "PYTHONHOME");
Victor Stinner1f151112017-11-23 10:43:14 +01001768 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001769 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinner1f151112017-11-23 10:43:14 +01001770 }
Victor Stinner46972b72017-11-24 22:55:40 +01001771 config->home = home;
1772 return _Py_INIT_OK();
Victor Stinnerd4341102017-11-23 00:12:09 +01001773}
1774
1775
Victor Stinner358e5e12017-12-15 00:51:22 +01001776static _PyInitError
1777config_init_hash_seed(_PyCoreConfig *config)
1778{
1779 if (config->use_hash_seed < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001780 const char *seed_text = config_get_env_var("PYTHONHASHSEED");
Victor Stinner358e5e12017-12-15 00:51:22 +01001781 int use_hash_seed;
1782 unsigned long hash_seed;
1783 if (_Py_ReadHashSeed(seed_text, &use_hash_seed, &hash_seed) < 0) {
1784 return _Py_INIT_USER_ERR("PYTHONHASHSEED must be \"random\" "
1785 "or an integer in range [0; 4294967295]");
1786 }
1787 config->use_hash_seed = use_hash_seed;
1788 config->hash_seed = hash_seed;
1789 }
1790 return _Py_INIT_OK();
1791}
1792
1793
Victor Stinner9cfc0022017-12-20 19:36:46 +01001794static _PyInitError
1795config_init_utf8_mode(_PyCoreConfig *config)
Victor Stinner91106cd2017-12-13 12:29:09 +01001796{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001797 /* The option was already set by Py_UTF8Mode,
1798 Py_LegacyWindowsFSEncodingFlag or PYTHONLEGACYWINDOWSFSENCODING. */
1799 if (config->utf8_mode >= 0) {
1800 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001801 }
Victor Stinner91106cd2017-12-13 12:29:09 +01001802
Victor Stinner9cfc0022017-12-20 19:36:46 +01001803 const wchar_t *xopt = config_get_xoption(config, L"utf8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001804 if (xopt) {
1805 wchar_t *sep = wcschr(xopt, L'=');
1806 if (sep) {
1807 xopt = sep + 1;
1808 if (wcscmp(xopt, L"1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001809 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001810 }
1811 else if (wcscmp(xopt, L"0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001812 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001813 }
1814 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001815 return _Py_INIT_USER_ERR("invalid -X utf8 option value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001816 }
1817 }
1818 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001819 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001820 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001821 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001822 }
1823
Victor Stinner9cfc0022017-12-20 19:36:46 +01001824 const char *opt = config_get_env_var("PYTHONUTF8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001825 if (opt) {
1826 if (strcmp(opt, "1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001827 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001828 }
1829 else if (strcmp(opt, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001830 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001831 }
1832 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001833 return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment "
1834 "variable value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001835 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001836 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001837 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001838
1839 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001840}
Victor Stinner46972b72017-11-24 22:55:40 +01001841
1842
Victor Stinner9cfc0022017-12-20 19:36:46 +01001843static _PyInitError
1844config_read_env_vars(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001845{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001846 config->allocator = config_get_env_var("PYTHONMALLOC");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001847
Victor Stinner9cfc0022017-12-20 19:36:46 +01001848 if (config_get_env_var("PYTHONDUMPREFS")) {
1849 config->dump_refs = 1;
1850 }
1851 if (config_get_env_var("PYTHONMALLOCSTATS")) {
1852 config->malloc_stats = 1;
Victor Stinner31a83932017-12-04 13:39:15 +01001853 }
1854
Victor Stinner9cfc0022017-12-20 19:36:46 +01001855 const char *env = config_get_env_var("PYTHONCOERCECLOCALE");
Victor Stinner94540602017-12-16 04:54:22 +01001856 if (env) {
1857 if (strcmp(env, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001858 config->coerce_c_locale = 0;
Victor Stinner94540602017-12-16 04:54:22 +01001859 }
1860 else if (strcmp(env, "warn") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001861 config->coerce_c_locale_warn = 1;
Victor Stinner94540602017-12-16 04:54:22 +01001862 }
1863 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001864 config->coerce_c_locale = 1;
Victor Stinner94540602017-12-16 04:54:22 +01001865 }
1866 }
1867
Victor Stinner9cfc0022017-12-20 19:36:46 +01001868 wchar_t *path;
1869 int res = config_get_env_var_dup(&path, L"PYTHONPATH", "PYTHONPATH");
1870 if (res < 0) {
1871 return DECODE_LOCALE_ERR("PYTHONHOME", res);
1872 }
1873 config->module_search_path_env = path;
1874
1875 _PyInitError err = config_init_hash_seed(config);
1876 if (_Py_INIT_FAILED(err)) {
1877 return err;
1878 }
1879
1880 return _Py_INIT_OK();
1881}
1882
1883
1884static _PyInitError
1885config_read_complex_options(_PyCoreConfig *config)
1886{
1887 /* More complex options configured by env var and -X option */
1888 if (config_get_env_var("PYTHONFAULTHANDLER")
1889 || config_get_xoption(config, L"faulthandler")) {
1890 config->faulthandler = 1;
1891 }
1892 if (config_get_env_var("PYTHONPROFILEIMPORTTIME")
1893 || config_get_xoption(config, L"importtime")) {
1894 config->import_time = 1;
1895 }
1896 if (config_get_xoption(config, L"dev" ) ||
1897 config_get_env_var("PYTHONDEVMODE"))
1898 {
1899 config->dev_mode = 1;
1900 config->faulthandler = 1;
1901 config->allocator = "debug";
1902 }
1903
1904 _PyInitError err = pymain_init_tracemalloc(config);
1905 if (_Py_INIT_FAILED(err)) {
1906 return err;
1907 }
1908 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001909}
1910
1911
Victor Stinnera7368ac2017-11-15 18:11:45 -08001912/* Parse command line options and environment variables.
1913 This code must not use Python runtime apart PyMem_Raw memory allocator.
1914
1915 Return 0 on success.
1916 Return 1 if Python is done and must exit.
1917 Set pymain->err and return -1 on error. */
1918static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001919pymain_read_conf_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001920{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001921 _PyInitError err;
1922
Victor Stinnerca719ac2017-12-20 18:00:19 +01001923 int res = pymain_parse_cmdline(pymain, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01001924 if (res != 0) {
1925 return res;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001926 }
1927
Victor Stinner9cfc0022017-12-20 19:36:46 +01001928 /* Set Py_IgnoreEnvironmentFlag for Py_GETENV() */
1929 _PyCoreConfig *config = &pymain->config;
1930 Py_IgnoreEnvironmentFlag = config->ignore_environment;
1931
1932 /* Get environment variables */
1933 cmdline_get_env_flags(cmdline);
1934
1935 err = cmdline_init_env_warnoptions(cmdline);
1936 if (_Py_INIT_FAILED(err)) {
1937 pymain->err = err;
1938 return -1;
1939 }
1940
1941#ifdef MS_WINDOWS
1942 if (cmdline->legacy_windows_fs_encoding) {
1943 config->utf8_mode = 0;
1944 }
1945#endif
1946
Victor Stinnerca719ac2017-12-20 18:00:19 +01001947 if (pymain_init_core_argv(pymain, cmdline) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01001948 return -1;
1949 }
1950
Victor Stinner9cfc0022017-12-20 19:36:46 +01001951 err = _PyCoreConfig_Read(config);
Victor Stinner31a83932017-12-04 13:39:15 +01001952 if (_Py_INIT_FAILED(err)) {
1953 pymain->err = err;
1954 return -1;
1955 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001956 return 0;
1957}
1958
1959
Victor Stinner19760862017-12-20 01:41:59 +01001960/* Read the configuration, but initialize also the LC_CTYPE locale:
1961 enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538) */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001962static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001963pymain_read_conf(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001964{
Victor Stinner94540602017-12-16 04:54:22 +01001965 int res = -1;
1966
Victor Stinner94540602017-12-16 04:54:22 +01001967 char *oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
1968 if (oldloc == NULL) {
1969 pymain->err = _Py_INIT_NO_MEMORY();
1970 goto done;
1971 }
1972
1973 /* Reconfigure the locale to the default for this process */
1974 _Py_SetLocaleFromEnv(LC_ALL);
1975
1976 int locale_coerced = 0;
1977 int loops = 0;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001978 int init_ignore_env = pymain->config.ignore_environment;
Victor Stinner94540602017-12-16 04:54:22 +01001979
1980 while (1) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001981 int utf8_mode = pymain->config.utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01001982 int encoding_changed = 0;
1983
1984 /* Watchdog to prevent an infinite loop */
1985 loops++;
1986 if (loops == 3) {
1987 pymain->err = _Py_INIT_ERR("Encoding changed twice while "
1988 "reading the configuration");
1989 goto done;
1990 }
1991
Victor Stinnerca719ac2017-12-20 18:00:19 +01001992 if (pymain_init_cmdline_argv(pymain, cmdline) < 0) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001993 goto done;
Victor Stinner94540602017-12-16 04:54:22 +01001994 }
1995
Victor Stinner9cfc0022017-12-20 19:36:46 +01001996 int conf_res = pymain_read_conf_impl(pymain, cmdline);
1997 if (conf_res != 0) {
1998 res = conf_res;
Victor Stinner94540602017-12-16 04:54:22 +01001999 goto done;
2000 }
2001
2002 /* The legacy C locale assumes ASCII as the default text encoding, which
2003 * causes problems not only for the CPython runtime, but also other
2004 * components like GNU readline.
2005 *
2006 * Accordingly, when the CLI detects it, it attempts to coerce it to a
2007 * more capable UTF-8 based alternative.
2008 *
2009 * See the documentation of the PYTHONCOERCECLOCALE setting for more
2010 * details.
2011 */
Victor Stinner9cfc0022017-12-20 19:36:46 +01002012 if (pymain->config.coerce_c_locale == 1 && !locale_coerced) {
Victor Stinner94540602017-12-16 04:54:22 +01002013 locale_coerced = 1;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002014 _Py_CoerceLegacyLocale(&pymain->config);
Victor Stinner94540602017-12-16 04:54:22 +01002015 encoding_changed = 1;
2016 }
2017
2018 if (utf8_mode == -1) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002019 if (pymain->config.utf8_mode == 1) {
Victor Stinner94540602017-12-16 04:54:22 +01002020 /* UTF-8 Mode enabled */
2021 encoding_changed = 1;
2022 }
2023 }
2024 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002025 if (pymain->config.utf8_mode != utf8_mode) {
Victor Stinner94540602017-12-16 04:54:22 +01002026 encoding_changed = 1;
2027 }
2028 }
2029
2030 if (!encoding_changed) {
2031 break;
2032 }
2033
2034 /* Reset the configuration, except UTF-8 Mode. Set Py_UTF8Mode for
2035 Py_DecodeLocale(). Reset Py_IgnoreEnvironmentFlag, modified by
2036 pymain_read_conf_impl(). */
Victor Stinner9cfc0022017-12-20 19:36:46 +01002037 Py_UTF8Mode = pymain->config.utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002038 Py_IgnoreEnvironmentFlag = init_ignore_env;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002039 _PyCoreConfig_Clear(&pymain->config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002040 pymain_clear_cmdline(pymain, cmdline);
2041 pymain_get_global_config(pymain, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01002042
2043 /* The encoding changed: read again the configuration
2044 with the new encoding */
2045 }
2046 res = 0;
2047
2048done:
2049 if (oldloc != NULL) {
2050 setlocale(LC_ALL, oldloc);
2051 PyMem_RawFree(oldloc);
2052 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002053
Victor Stinnera7368ac2017-11-15 18:11:45 -08002054 return res;
2055}
2056
Victor Stinner91106cd2017-12-13 12:29:09 +01002057
Victor Stinner9cfc0022017-12-20 19:36:46 +01002058static void
2059config_init_locale(_PyCoreConfig *config)
2060{
2061 if (config->utf8_mode >= 0 && config->coerce_c_locale >= 0) {
2062 return;
2063 }
2064
2065 if (_Py_LegacyLocaleDetected()) {
2066 /* POSIX locale: enable C locale coercion and UTF-8 Mode */
2067 if (config->utf8_mode < 0) {
2068 config->utf8_mode = 1;
2069 }
2070 if (config->coerce_c_locale < 0) {
2071 config->coerce_c_locale = 1;
2072 }
2073 return;
2074 }
2075
2076 /* By default, C locale coercion and UTF-8 Mode are disabled */
2077 if (config->coerce_c_locale < 0) {
2078 config->coerce_c_locale = 0;
2079 }
2080 if (config->utf8_mode < 0) {
2081 config->utf8_mode = 0;
2082 }
2083}
2084
2085
Victor Stinnerda273412017-12-15 01:46:02 +01002086/* Read configuration settings from standard locations
2087 *
2088 * This function doesn't make any changes to the interpreter state - it
2089 * merely populates any missing configuration settings. This allows an
2090 * embedding application to completely override a config option by
2091 * setting it before calling this function, or else modify the default
2092 * setting before passing the fully populated config to Py_EndInitialization.
2093 *
2094 * More advanced selective initialization tricks are possible by calling
2095 * this function multiple times with various preconfigured settings.
2096 */
2097
2098_PyInitError
2099_PyCoreConfig_Read(_PyCoreConfig *config)
2100{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002101 _PyInitError err;
2102
2103 err = config_read_env_vars(config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002104 if (_Py_INIT_FAILED(err)) {
2105 return err;
2106 }
2107
Victor Stinner9cfc0022017-12-20 19:36:46 +01002108 /* -X options */
2109 if (config_get_xoption(config, L"showrefcount")) {
2110 config->show_ref_count = 1;
2111 }
2112 if (config_get_xoption(config, L"showalloccount")) {
2113 config->show_alloc_count = 1;
2114 }
2115
2116 err = config_read_complex_options(config);
2117 if (_Py_INIT_FAILED(err)) {
2118 return err;
2119 }
2120
2121 err = config_init_utf8_mode(config);
2122 if (_Py_INIT_FAILED(err)) {
2123 return err;
2124 }
2125
2126 err = config_init_home(config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002127 if (_Py_INIT_FAILED(err)) {
2128 return err;
2129 }
2130
2131 err = config_init_program_name(config);
2132 if (_Py_INIT_FAILED(err)) {
2133 return err;
2134 }
2135
Victor Stinner9cfc0022017-12-20 19:36:46 +01002136 config_init_locale(config);
Victor Stinnerda273412017-12-15 01:46:02 +01002137
Victor Stinner9cfc0022017-12-20 19:36:46 +01002138 /* Signal handlers are installed by default */
2139 if (config->install_signal_handlers < 0) {
2140 config->install_signal_handlers = 1;
Victor Stinner94540602017-12-16 04:54:22 +01002141 }
2142
Victor Stinnerda273412017-12-15 01:46:02 +01002143 return _Py_INIT_OK();
2144}
2145
2146
2147void
2148_PyCoreConfig_Clear(_PyCoreConfig *config)
2149{
2150#define CLEAR(ATTR) \
2151 do { \
2152 PyMem_RawFree(ATTR); \
2153 ATTR = NULL; \
2154 } while (0)
2155
2156 CLEAR(config->module_search_path_env);
2157 CLEAR(config->home);
2158 CLEAR(config->program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002159 CLEAR(config->program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002160
2161 if (config->argc >= 0) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01002162 clear_wstrlist(config->argc, config->argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002163 config->argc = -1;
2164 config->argv = NULL;
2165 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002166
2167 clear_wstrlist(config->nwarnoption, config->warnoptions);
2168 config->nwarnoption = 0;
2169 config->warnoptions = NULL;
2170
2171 clear_wstrlist(config->nxoption, config->xoptions);
2172 config->nxoption = 0;
2173 config->xoptions = NULL;
2174#undef CLEAR
Victor Stinnerda273412017-12-15 01:46:02 +01002175}
2176
2177
2178int
2179_PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
2180{
2181 _PyCoreConfig_Clear(config);
2182
2183#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
Victor Stinnerc4bca952017-12-19 23:48:17 +01002184#define COPY_STR_ATTR(ATTR) \
2185 do { \
2186 if (config2->ATTR != NULL) { \
2187 config->ATTR = _PyMem_RawWcsdup(config2->ATTR); \
2188 if (config->ATTR == NULL) { \
2189 return -1; \
2190 } \
2191 } \
2192 } while (0)
2193
Victor Stinnerda273412017-12-15 01:46:02 +01002194 COPY_ATTR(ignore_environment);
2195 COPY_ATTR(use_hash_seed);
2196 COPY_ATTR(hash_seed);
2197 COPY_ATTR(_disable_importlib);
2198 COPY_ATTR(allocator);
2199 COPY_ATTR(dev_mode);
2200 COPY_ATTR(faulthandler);
2201 COPY_ATTR(tracemalloc);
2202 COPY_ATTR(import_time);
2203 COPY_ATTR(show_ref_count);
2204 COPY_ATTR(show_alloc_count);
2205 COPY_ATTR(dump_refs);
2206 COPY_ATTR(malloc_stats);
2207 COPY_ATTR(utf8_mode);
Victor Stinnerda273412017-12-15 01:46:02 +01002208
2209 COPY_STR_ATTR(module_search_path_env);
2210 COPY_STR_ATTR(home);
2211 COPY_STR_ATTR(program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002212 COPY_STR_ATTR(program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002213
2214 if (config2->argc >= 0) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01002215 wchar_t **argv = copy_wstrlist(config2->argc, config2->argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002216 if (argv == NULL) {
2217 return -1;
2218 }
2219 config->argv = argv;
2220 }
2221 COPY_ATTR(argc);
2222
Victor Stinnerca719ac2017-12-20 18:00:19 +01002223 if (config2->nwarnoption > 0) {
2224 config->warnoptions = copy_wstrlist(config2->nwarnoption, config2->warnoptions);
2225 if (config->warnoptions == NULL) {
2226 return -1;
2227 }
2228 }
2229 COPY_ATTR(nwarnoption);
2230
2231 if (config2->nxoption > 0) {
2232 config->xoptions = copy_wstrlist(config2->nxoption, config2->xoptions);
2233 if (config->xoptions == NULL) {
2234 return -1;
2235 }
2236 }
2237 COPY_ATTR(nxoption);
2238
Victor Stinnerc4bca952017-12-19 23:48:17 +01002239#undef COPY_ATTR
Victor Stinnerda273412017-12-15 01:46:02 +01002240#undef COPY_STR_ATTR
2241 return 0;
2242}
2243
2244
2245void
2246_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config)
2247{
2248 Py_CLEAR(config->argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002249 Py_CLEAR(config->executable);
2250 Py_CLEAR(config->prefix);
2251 Py_CLEAR(config->base_prefix);
2252 Py_CLEAR(config->exec_prefix);
2253 Py_CLEAR(config->base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002254 Py_CLEAR(config->warnoptions);
2255 Py_CLEAR(config->xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002256 Py_CLEAR(config->module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002257}
2258
2259
2260static PyObject*
2261config_copy_attr(PyObject *obj)
2262{
2263 if (PyUnicode_Check(obj)) {
2264 Py_INCREF(obj);
2265 return obj;
2266 }
2267 else if (PyList_Check(obj)) {
2268 return PyList_GetSlice(obj, 0, Py_SIZE(obj));
2269 }
2270 else if (PyDict_Check(obj)) {
2271 /* The dict type is used for xoptions. Make the assumption that keys
2272 and values are immutables */
2273 return PyDict_Copy(obj);
2274 }
2275 else {
2276 PyErr_Format(PyExc_TypeError,
2277 "cannot copy config attribute of type %.200s",
2278 Py_TYPE(obj)->tp_name);
2279 return NULL;
2280 }
2281}
2282
2283
2284int
2285_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config,
2286 const _PyMainInterpreterConfig *config2)
2287{
2288 _PyMainInterpreterConfig_Clear(config);
2289
2290#define COPY_ATTR(ATTR) \
2291 do { \
2292 if (config2->ATTR != NULL) { \
2293 config->ATTR = config_copy_attr(config2->ATTR); \
2294 if (config->ATTR == NULL) { \
2295 return -1; \
2296 } \
2297 } \
2298 } while (0)
2299
2300 COPY_ATTR(argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002301 COPY_ATTR(executable);
2302 COPY_ATTR(prefix);
2303 COPY_ATTR(base_prefix);
2304 COPY_ATTR(exec_prefix);
2305 COPY_ATTR(base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002306 COPY_ATTR(warnoptions);
2307 COPY_ATTR(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002308 COPY_ATTR(module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002309#undef COPY_ATTR
2310 return 0;
2311}
2312
2313
2314
2315
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002316static PyObject *
Victor Stinner9cfc0022017-12-20 19:36:46 +01002317create_path_list(const wchar_t *path, wchar_t delim)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002318{
2319 int i, n;
2320 const wchar_t *p;
2321 PyObject *v;
2322
2323 n = 1;
2324 p = path;
2325 while ((p = wcschr(p, delim)) != NULL) {
2326 n++;
2327 p++;
2328 }
2329 v = PyList_New(n);
2330 if (v == NULL) {
2331 return NULL;
2332 }
2333 for (i = 0; ; i++) {
2334 p = wcschr(path, delim);
2335 if (p == NULL) {
2336 p = path + wcslen(path); /* End of string */
2337 }
2338 PyObject *w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
2339 if (w == NULL) {
2340 Py_DECREF(v);
2341 return NULL;
2342 }
2343 PyList_SET_ITEM(v, i, w);
2344 if (*p == '\0') {
2345 break;
2346 }
2347 path = p+1;
2348 }
2349 return v;
2350}
2351
2352
Victor Stinner41264f12017-12-15 02:05:29 +01002353_PyInitError
Victor Stinner9cfc0022017-12-20 19:36:46 +01002354_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config,
2355 const _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002356{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002357 _PyInitError err = _PyPathConfig_Init(config);
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002358 if (_Py_INIT_FAILED(err)) {
2359 return err;
2360 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002361
Victor Stinner9cfc0022017-12-20 19:36:46 +01002362 if (main_config->install_signal_handlers < 0) {
2363 main_config->install_signal_handlers = config->install_signal_handlers;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002364 }
2365
Victor Stinner9cfc0022017-12-20 19:36:46 +01002366 if (main_config->xoptions == NULL) {
2367 main_config->xoptions = config_create_xoptions_dict(config);
2368 if (main_config->xoptions == NULL) {
2369 return _Py_INIT_NO_MEMORY();
2370 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002371 }
2372
Victor Stinner9cfc0022017-12-20 19:36:46 +01002373 if (main_config->argv == NULL) {
2374 if (main_config_init_argv(main_config, config) < 0) {
2375 return _Py_INIT_ERR("failed to create sys.argv");
2376 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002377 }
2378
Victor Stinner9cfc0022017-12-20 19:36:46 +01002379 if (main_config->warnoptions == NULL) {
2380 if (main_config_init_warnoptions(main_config, config) < 0) {
2381 return _Py_INIT_NO_MEMORY();
2382 }
2383 }
Victor Stinner41264f12017-12-15 02:05:29 +01002384
Victor Stinner9cfc0022017-12-20 19:36:46 +01002385 if (main_config->module_search_path == NULL &&
2386 !config->_disable_importlib)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002387 {
Victor Stinner41264f12017-12-15 02:05:29 +01002388 wchar_t *sys_path = Py_GetPath();
Victor Stinner9cfc0022017-12-20 19:36:46 +01002389 main_config->module_search_path = create_path_list(sys_path, DELIM);
2390 if (main_config->module_search_path == NULL) {
Victor Stinner41264f12017-12-15 02:05:29 +01002391 return _Py_INIT_NO_MEMORY();
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002392 }
2393 }
Victor Stinner41264f12017-12-15 02:05:29 +01002394
Victor Stinner9cfc0022017-12-20 19:36:46 +01002395 if (main_config->executable == NULL) {
2396 main_config->executable = PyUnicode_FromWideChar(Py_GetProgramFullPath(), -1);
2397 if (main_config->executable == NULL) {
Victor Stinner41264f12017-12-15 02:05:29 +01002398 return _Py_INIT_NO_MEMORY();
2399 }
2400 }
2401
Victor Stinner9cfc0022017-12-20 19:36:46 +01002402 if (main_config->prefix == NULL) {
2403 main_config->prefix = PyUnicode_FromWideChar(Py_GetPrefix(), -1);
2404 if (main_config->prefix == NULL) {
Victor Stinner41264f12017-12-15 02:05:29 +01002405 return _Py_INIT_NO_MEMORY();
2406 }
2407 }
2408
Victor Stinner9cfc0022017-12-20 19:36:46 +01002409 if (main_config->exec_prefix == NULL) {
2410 main_config->exec_prefix = PyUnicode_FromWideChar(Py_GetExecPrefix(), -1);
2411 if (main_config->exec_prefix == NULL) {
Victor Stinner41264f12017-12-15 02:05:29 +01002412 return _Py_INIT_NO_MEMORY();
2413 }
2414 }
2415
Victor Stinner9cfc0022017-12-20 19:36:46 +01002416 if (main_config->base_prefix == NULL) {
2417 Py_INCREF(main_config->prefix);
2418 main_config->base_prefix = main_config->prefix;
Victor Stinner41264f12017-12-15 02:05:29 +01002419 }
2420
Victor Stinner9cfc0022017-12-20 19:36:46 +01002421 if (main_config->base_exec_prefix == NULL) {
2422 Py_INCREF(main_config->exec_prefix);
2423 main_config->base_exec_prefix = main_config->exec_prefix;
Victor Stinner41264f12017-12-15 02:05:29 +01002424 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002425 return _Py_INIT_OK();
2426}
2427
2428
2429static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01002430pymain_init_python_main(_PyMain *pymain)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002431{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002432 _PyInitError err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002433
Victor Stinner9cfc0022017-12-20 19:36:46 +01002434 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
2435 err = _PyMainInterpreterConfig_Read(&main_config, &pymain->config);
2436 if (!_Py_INIT_FAILED(err)) {
2437 err = _Py_InitializeMainInterpreter(&main_config);
2438 }
2439 _PyMainInterpreterConfig_Clear(&main_config);
2440
2441 if (_Py_INIT_FAILED(err)) {
2442 pymain->err = err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002443 return -1;
2444 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002445 return 0;
2446}
Victor Stinnera7368ac2017-11-15 18:11:45 -08002447
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002448
2449static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01002450pymain_init_sys_path(_PyMain *pymain)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002451{
Victor Stinnerca719ac2017-12-20 18:00:19 +01002452 if (pymain->filename != NULL) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002453 /* If filename is a package (ex: directory or ZIP file) which contains
2454 __main__.py, main_importer_path is set to filename and will be
2455 prepended to sys.path by pymain_run_main_from_importer(). Otherwise,
2456 main_importer_path is set to NULL. */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002457 pymain->main_importer_path = pymain_get_importer(pymain->filename);
Victor Stinnerd5dda982017-12-13 17:31:16 +01002458 }
2459
Victor Stinner19760862017-12-20 01:41:59 +01002460 PyObject *path0;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002461 if (pymain_compute_path0(pymain, &path0) < 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002462 return -1;
2463 }
Victor Stinner19760862017-12-20 01:41:59 +01002464
Victor Stinner9cfc0022017-12-20 19:36:46 +01002465 pymain_clear_config(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002466
2467 if (path0 != NULL) {
2468 if (pymain_update_sys_path(pymain, path0) < 0) {
2469 Py_DECREF(path0);
2470 return -1;
2471 }
2472 Py_DECREF(path0);
2473 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002474 return 0;
2475}
2476
2477
2478static void
2479pymain_run_python(_PyMain *pymain)
2480{
Victor Stinner19760862017-12-20 01:41:59 +01002481 PyCompilerFlags cf = {.cf_flags = 0};
Victor Stinnera7368ac2017-11-15 18:11:45 -08002482
2483 pymain_header(pymain);
2484 pymain_import_readline(pymain);
2485
Victor Stinnerca719ac2017-12-20 18:00:19 +01002486 if (pymain->command) {
2487 pymain->status = pymain_run_command(pymain->command, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002488 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002489 else if (pymain->module) {
2490 pymain->status = (pymain_run_module(pymain->module, 1) != 0);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002491 }
2492 else {
Victor Stinner19760862017-12-20 01:41:59 +01002493 pymain_run_filename(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002494 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002495
Victor Stinner19760862017-12-20 01:41:59 +01002496 pymain_repl(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002497}
2498
2499
Victor Stinnerc4bca952017-12-19 23:48:17 +01002500static void
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002501pymain_init(_PyMain *pymain)
2502{
Victor Stinner94540602017-12-16 04:54:22 +01002503 /* 754 requires that FP exceptions run in "no stop" mode by default,
2504 * and until C vendors implement C99's ways to control FP exceptions,
2505 * Python requires non-stop mode. Alas, some platforms enable FP
2506 * exceptions by default. Here we disable them.
2507 */
2508#ifdef __FreeBSD__
2509 fedisableexcept(FE_OVERFLOW);
2510#endif
2511
Victor Stinner9cfc0022017-12-20 19:36:46 +01002512 pymain->config._disable_importlib = 0;
Victor Stinnere32e79f2017-11-23 01:49:45 +01002513 pymain->config.install_signal_handlers = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002514}
2515
Victor Stinnera7368ac2017-11-15 18:11:45 -08002516
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002517static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01002518pymain_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002519{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002520 pymain->err = _PyRuntime_Initialize();
2521 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002522 return -1;
2523 }
2524
Victor Stinnerca719ac2017-12-20 18:00:19 +01002525 int res = pymain_read_conf(pymain, cmdline);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002526 if (res < 0) {
2527 return -1;
2528 }
2529 if (res > 0) {
2530 /* --help or --version command: we are done */
Victor Stinner19760862017-12-20 01:41:59 +01002531 return 1;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002532 }
2533
Victor Stinner94540602017-12-16 04:54:22 +01002534 if (cmdline->print_help) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002535 pymain_usage(0, pymain->config.program);
Victor Stinner19760862017-12-20 01:41:59 +01002536 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002537 }
2538
2539 if (cmdline->print_version) {
2540 printf("Python %s\n",
2541 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
Victor Stinner19760862017-12-20 01:41:59 +01002542 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002543 }
2544
Victor Stinnerc4bca952017-12-19 23:48:17 +01002545 /* For Py_GetArgcArgv(). Cleared by pymain_free(). */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002546 orig_argv = copy_wstrlist(pymain->argc, cmdline->argv);
2547 if (orig_argv == NULL) {
2548 pymain->err = _Py_INIT_NO_MEMORY();
2549 return -1;
2550 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01002551 orig_argc = pymain->argc;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002552
Victor Stinner9cfc0022017-12-20 19:36:46 +01002553 _PyInitError err = config_init_warnoptions(&pymain->config, cmdline);
2554 if (_Py_INIT_FAILED(err)) {
2555 pymain->err = err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002556 return -1;
2557 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002558 return 0;
2559}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00002560
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002561
Victor Stinnerca719ac2017-12-20 18:00:19 +01002562/* Read the configuration into _PyCoreConfig and _PyMain, initialize the
2563 LC_CTYPE locale and Py_DecodeLocale().
2564
2565 Configuration:
2566
2567 * Command line arguments
2568 * Environment variables
2569 * Py_xxx global configuration variables
2570
2571 _Py_CommandLineDetails is a temporary structure used to prioritize these
2572 variables. */
2573static int
2574pymain_cmdline(_PyMain *pymain)
2575{
Victor Stinner31e99082017-12-20 23:41:38 +01002576 /* Force default allocator, since pymain_free() and pymain_clear_config()
2577 must use the same allocator than this function. */
2578 PyMemAllocatorEx old_alloc;
2579 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2580#ifdef Py_DEBUG
2581 PyMemAllocatorEx default_alloc;
2582 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &default_alloc);
2583#endif
2584
Victor Stinnerca719ac2017-12-20 18:00:19 +01002585 _Py_CommandLineDetails cmdline;
2586 memset(&cmdline, 0, sizeof(cmdline));
2587
2588 pymain_get_global_config(pymain, &cmdline);
2589
2590 int res = pymain_cmdline_impl(pymain, &cmdline);
2591
2592 pymain_set_global_config(pymain, &cmdline);
2593
2594 pymain_clear_cmdline(pymain, &cmdline);
Victor Stinner31e99082017-12-20 23:41:38 +01002595
2596#ifdef Py_DEBUG
2597 /* Make sure that PYMEM_DOMAIN_RAW has not been modified */
2598 PyMemAllocatorEx cur_alloc;
2599 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &cur_alloc);
2600 assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0);
2601#endif
2602 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002603 return res;
2604}
2605
2606
Victor Stinner94540602017-12-16 04:54:22 +01002607static int
2608pymain_main(_PyMain *pymain)
2609{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002610 pymain_init(pymain);
Victor Stinner94540602017-12-16 04:54:22 +01002611
Victor Stinnerca719ac2017-12-20 18:00:19 +01002612 int res = pymain_cmdline(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002613 if (res < 0) {
Victor Stinner94540602017-12-16 04:54:22 +01002614 _Py_FatalInitError(pymain->err);
2615 }
Victor Stinner19760862017-12-20 01:41:59 +01002616 if (res == 1) {
2617 goto done;
2618 }
2619
Victor Stinner9cfc0022017-12-20 19:36:46 +01002620 pymain_init_stdio(pymain);
2621
2622 pymain->err = _Py_InitializeCore(&pymain->config);
2623 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinner19760862017-12-20 01:41:59 +01002624 _Py_FatalInitError(pymain->err);
2625 }
2626
2627 if (pymain_init_python_main(pymain) < 0) {
2628 _Py_FatalInitError(pymain->err);
2629 }
2630
Victor Stinner9cfc0022017-12-20 19:36:46 +01002631 if (pymain_init_sys_path(pymain) < 0) {
2632 _Py_FatalInitError(pymain->err);
2633 }
2634
Victor Stinner19760862017-12-20 01:41:59 +01002635 pymain_run_python(pymain);
2636
2637 if (Py_FinalizeEx() < 0) {
2638 /* Value unlikely to be confused with a non-error exit status or
2639 other special meaning */
2640 pymain->status = 120;
2641 }
2642
2643done:
Victor Stinner94540602017-12-16 04:54:22 +01002644 pymain_free(pymain);
2645
Victor Stinner94540602017-12-16 04:54:22 +01002646 return pymain->status;
2647}
2648
2649
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002650int
2651Py_Main(int argc, wchar_t **argv)
2652{
2653 _PyMain pymain = _PyMain_INIT;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002654 pymain.use_bytes_argv = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002655 pymain.argc = argc;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002656 pymain.wchar_argv = argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002657
Victor Stinner94540602017-12-16 04:54:22 +01002658 return pymain_main(&pymain);
Guido van Rossum667d7041995-08-04 04:20:48 +00002659}
2660
Victor Stinner94540602017-12-16 04:54:22 +01002661
2662int
2663_Py_UnixMain(int argc, char **argv)
2664{
2665 _PyMain pymain = _PyMain_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01002666 pymain.use_bytes_argv = 1;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002667 pymain.argc = argc;
Victor Stinner94540602017-12-16 04:54:22 +01002668 pymain.bytes_argv = argv;
2669
2670 return pymain_main(&pymain);
2671}
2672
2673
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002674/* this is gonna seem *real weird*, but if you put some other code between
2675 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
2676 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00002677
Guido van Rossum667d7041995-08-04 04:20:48 +00002678/* Make the *original* argc/argv available to other modules.
2679 This is rare, but it is needed by the secureware extension. */
2680
2681void
Martin v. Löwis790465f2008-04-05 20:41:37 +00002682Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00002683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 *argc = orig_argc;
2685 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00002686}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002687
2688#ifdef __cplusplus
2689}
2690#endif