blob: f82bab2cb1b89e6042c5feb4c5705b1d7b1dedd8 [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\
Miss Islington (bot)b5655f32018-02-24 19:24:08 -080099-O : remove assert and __debug__-dependent statements; add .opt-1 before\n\
100 .pyc extension; also PYTHONOPTIMIZE=x\n\
101-OO : do -O changes and also discard docstrings; add .opt-2 before\n\
102 .pyc extension\n\
Georg Brandl9d871192010-12-04 10:47:18 +0000103-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +0000104-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +0000105-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +0000106";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200107static const char usage_3[] = "\
Berker Peksag7f580972017-10-13 15:16:31 +0300108-u : force the stdout and stderr streams to be unbuffered;\n\
109 this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000110-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
111 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000112-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +0900113 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +0000115 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +0000116-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000117-X opt : set implementation-specific option\n\
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800118--check-hash-based-pycs always|default|never:\n\
119 control how Python invalidates hash-based .pyc files\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +0000120";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200121static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +0000122file : program read from script file\n\
123- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000124arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000125Other environment variables:\n\
126PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200127PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000128 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +0000129";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200130static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200131"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +0000132" The default module search path uses %s.\n"
133"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
134"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be807c2016-03-14 12:04:26 +0100135"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
136static const char usage_6[] =
137"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
138" to seed the hashes of str, bytes and datetime objects. It can also be\n"
139" set to an integer in the range [0,4294967295] to get hash values with a\n"
140" predictable seed.\n"
141"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
142" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000143" hooks.\n"
Stéphane Wirtel7d1017d2017-06-12 13:30:33 +0200144"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000145" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
Victor Stinner5e3806f2017-11-30 11:40:24 +0100146" locale coercion and locale compatibility warnings on stderr.\n"
Steve Dower6332de12018-07-29 12:17:49 +0100147"PYTHONBREAKPOINT: if this variable is set to 0, it disables the default\n"
148" debugger. It can be set to the callable of your debugger of choice.\n"
Victor Stinner5e3806f2017-11-30 11:40:24 +0100149"PYTHONDEVMODE: enable the development mode.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000150
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800151static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800152pymain_usage(int error, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000153{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800154 FILE *f = error ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 fprintf(f, usage_line, program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800157 if (error)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 fprintf(f, "Try `python -h' for more information.\n");
159 else {
160 fputs(usage_1, f);
161 fputs(usage_2, f);
162 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200163 fprintf(f, usage_4, (wint_t)DELIM);
164 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100165 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000167}
168
Victor Stinnera7368ac2017-11-15 18:11:45 -0800169
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200170static const char*
Victor Stinner9cfc0022017-12-20 19:36:46 +0100171config_get_env_var(const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -0800172{
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200173 const char *var = Py_GETENV(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800174 if (var && var[0] != '\0') {
175 return var;
176 }
177 else {
178 return NULL;
179 }
180}
181
182
Victor Stinnerca719ac2017-12-20 18:00:19 +0100183static int
184config_get_env_var_dup(wchar_t **dest, wchar_t *wname, char *name)
185{
186 if (Py_IgnoreEnvironmentFlag) {
187 *dest = NULL;
188 return 0;
189 }
190
191#ifdef MS_WINDOWS
192 const wchar_t *var = _wgetenv(wname);
193 if (!var || var[0] == '\0') {
194 *dest = NULL;
195 return 0;
196 }
197
198 wchar_t *copy = _PyMem_RawWcsdup(var);
199 if (copy == NULL) {
200 return -1;
201 }
202
203 *dest = copy;
204#else
205 const char *var = getenv(name);
206 if (!var || var[0] == '\0') {
207 *dest = NULL;
208 return 0;
209 }
210
211 size_t len;
212 wchar_t *wvar = Py_DecodeLocale(var, &len);
213 if (!wvar) {
214 if (len == (size_t)-2) {
215 return -2;
216 }
217 else {
218 return -1;
219 }
220 }
221 *dest = wvar;
222#endif
223 return 0;
224}
225
226
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800227static void
Victor Stinner33c377e2017-12-05 15:12:41 +0100228pymain_run_startup(PyCompilerFlags *cf)
Martin v. Löwis6caea372003-11-18 19:46:25 +0000229{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100230 const char *startup = config_get_env_var("PYTHONSTARTUP");
Victor Stinner6bf992a2017-12-06 17:26:10 +0100231 if (startup == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800232 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800234
235 FILE *fp = _Py_fopen(startup, "r");
236 if (fp == NULL) {
237 int save_errno = errno;
238 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
239 errno = save_errno;
240
241 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
242 startup);
243 PyErr_Print();
244 PyErr_Clear();
245 return;
246 }
247
248 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
249 PyErr_Clear();
250 fclose(fp);
Martin v. Löwis6caea372003-11-18 19:46:25 +0000251}
252
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800253static void
254pymain_run_interactive_hook(void)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200255{
256 PyObject *sys, *hook, *result;
257 sys = PyImport_ImportModule("sys");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800258 if (sys == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200259 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800260 }
261
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200262 hook = PyObject_GetAttrString(sys, "__interactivehook__");
263 Py_DECREF(sys);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800264 if (hook == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200265 PyErr_Clear();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800266 return;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200267 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800268
269 result = _PyObject_CallNoArg(hook);
270 Py_DECREF(hook);
271 if (result == NULL) {
272 goto error;
273 }
274 Py_DECREF(result);
275
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200276 return;
277
278error:
279 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
280 PyErr_Print();
281 PyErr_Clear();
282}
283
Thomas Woutersa9773292006-04-21 09:43:23 +0000284
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800285static int
Victor Stinnerc4bca952017-12-19 23:48:17 +0100286pymain_run_module(const wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 PyObject *module, *runpy, *runmodule, *runargs, *result;
289 runpy = PyImport_ImportModule("runpy");
290 if (runpy == NULL) {
291 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200292 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 return -1;
294 }
295 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
296 if (runmodule == NULL) {
297 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200298 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 Py_DECREF(runpy);
300 return -1;
301 }
302 module = PyUnicode_FromWideChar(modname, wcslen(modname));
303 if (module == NULL) {
304 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200305 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 Py_DECREF(runpy);
307 Py_DECREF(runmodule);
308 return -1;
309 }
310 runargs = Py_BuildValue("(Oi)", module, set_argv0);
311 if (runargs == NULL) {
312 fprintf(stderr,
313 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200314 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 Py_DECREF(runpy);
316 Py_DECREF(runmodule);
317 Py_DECREF(module);
318 return -1;
319 }
320 result = PyObject_Call(runmodule, runargs, NULL);
321 if (result == NULL) {
322 PyErr_Print();
323 }
324 Py_DECREF(runpy);
325 Py_DECREF(runmodule);
326 Py_DECREF(module);
327 Py_DECREF(runargs);
328 if (result == NULL) {
329 return -1;
330 }
331 Py_DECREF(result);
332 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000333}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000334
Nick Coghland2977a32017-03-12 20:38:32 +1000335static PyObject *
Victor Stinnerc4bca952017-12-19 23:48:17 +0100336pymain_get_importer(const wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000337{
Nick Coghland2977a32017-03-12 20:38:32 +1000338 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000339
Nick Coghland2977a32017-03-12 20:38:32 +1000340 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800341 if (sys_path0 == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000342 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800343 }
Victor Stinner4726e402010-10-06 23:24:57 +0000344
Nick Coghland2977a32017-03-12 20:38:32 +1000345 importer = PyImport_GetImporter(sys_path0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800346 if (importer == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000347 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800348 }
Victor Stinner4726e402010-10-06 23:24:57 +0000349
Brett Cannonaa936422012-04-27 15:30:58 -0400350 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000351 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000352 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000353 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800355
Victor Stinner4726e402010-10-06 23:24:57 +0000356 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000357 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000358
Nick Coghland2977a32017-03-12 20:38:32 +1000359error:
360 Py_XDECREF(sys_path0);
361 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
362 PyErr_Print();
363 PyErr_Clear();
364 return NULL;
365}
366
367
368static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800369pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
Victor Stinnera62207c2010-08-07 10:57:17 +0000370{
371 PyObject *unicode, *bytes;
372 int ret;
373
374 unicode = PyUnicode_FromWideChar(command, -1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800375 if (unicode == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000376 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800377 }
378
Victor Stinnera62207c2010-08-07 10:57:17 +0000379 bytes = PyUnicode_AsUTF8String(unicode);
380 Py_DECREF(unicode);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800381 if (bytes == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000382 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800383 }
384
Victor Stinnera62207c2010-08-07 10:57:17 +0000385 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
386 Py_DECREF(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800387 return (ret != 0);
Victor Stinnera62207c2010-08-07 10:57:17 +0000388
389error:
Victor Stinner398356b2010-08-18 22:23:22 +0000390 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000391 PyErr_Print();
392 return 1;
393}
394
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800395
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000396static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800397pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000398{
399 PyObject *unicode, *bytes = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +0200400 const char *filename_str;
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000401 int run;
402
403 /* call pending calls like signal handlers (SIGINT) */
404 if (Py_MakePendingCalls() == -1) {
405 PyErr_Print();
406 return 1;
407 }
408
409 if (filename) {
410 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
411 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000412 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000413 Py_DECREF(unicode);
414 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800415 if (bytes != NULL) {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000416 filename_str = PyBytes_AsString(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800417 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000418 else {
419 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000420 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000421 }
422 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800423 else {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000424 filename_str = "<stdin>";
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800425 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000426
427 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
428 Py_XDECREF(bytes);
429 return run != 0;
430}
431
Christian Heimes9cd17752007-11-18 19:35:23 +0000432
Guido van Rossum667d7041995-08-04 04:20:48 +0000433/* Main program */
434
Eric Snow6b4be192017-05-22 21:36:03 -0700435typedef struct {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100436 wchar_t **argv;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100437 int nwarnoption; /* Number of -W options */
438 wchar_t **warnoptions; /* -W options */
439 int nenv_warnoption; /* Number of PYTHONWARNINGS options */
440 wchar_t **env_warnoptions; /* PYTHONWARNINGS options */
Eric Snow6b4be192017-05-22 21:36:03 -0700441 int print_help; /* -h, -? options */
442 int print_version; /* -V option */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100443 int bytes_warning; /* Py_BytesWarningFlag, -b */
444 int debug; /* Py_DebugFlag, -b, PYTHONDEBUG */
445 int inspect; /* Py_InspectFlag, -i, PYTHONINSPECT */
446 int interactive; /* Py_InteractiveFlag, -i */
447 int isolated; /* Py_IsolatedFlag, -I */
448 int optimization_level; /* Py_OptimizeFlag, -O, PYTHONOPTIMIZE */
449 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag, -B, PYTHONDONTWRITEBYTECODE */
450 int no_user_site_directory; /* Py_NoUserSiteDirectory, -I, -s, PYTHONNOUSERSITE */
451 int no_site_import; /* Py_NoSiteFlag, -S */
452 int use_unbuffered_io; /* Py_UnbufferedStdioFlag, -u, PYTHONUNBUFFERED */
453 int verbosity; /* Py_VerboseFlag, -v, PYTHONVERBOSE */
454 int quiet_flag; /* Py_QuietFlag, -q */
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800455 const char *check_hash_pycs_mode; /* --check-hash-based-pycs */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100456#ifdef MS_WINDOWS
457 int legacy_windows_fs_encoding; /* Py_LegacyWindowsFSEncodingFlag,
458 PYTHONLEGACYWINDOWSFSENCODING */
459 int legacy_windows_stdio; /* Py_LegacyWindowsStdioFlag,
460 PYTHONLEGACYWINDOWSSTDIO */
461#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700462} _Py_CommandLineDetails;
463
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800464/* Structure used by Py_Main() to pass data to subfunctions */
465typedef struct {
Victor Stinner19760862017-12-20 01:41:59 +0100466 /* Input arguments */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800467 int argc;
Victor Stinner94540602017-12-16 04:54:22 +0100468 int use_bytes_argv;
469 char **bytes_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100470 wchar_t **wchar_argv;
Victor Stinner19760862017-12-20 01:41:59 +0100471
472 /* Exit status or "exit code": result of pymain_main() */
473 int status;
474 /* Error message if a function failed */
475 _PyInitError err;
476
Victor Stinner19760862017-12-20 01:41:59 +0100477 /* non-zero is stdin is a TTY or if -i option is used */
478 int stdin_is_interactive;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100479 int skip_first_line; /* -x option */
480 wchar_t *filename; /* Trailing arg without -c or -m */
481 wchar_t *command; /* -c argument */
482 wchar_t *module; /* -m argument */
Victor Stinner19760862017-12-20 01:41:59 +0100483
Victor Stinner9cfc0022017-12-20 19:36:46 +0100484 _PyCoreConfig config;
Victor Stinner19760862017-12-20 01:41:59 +0100485
486 PyObject *main_importer_path;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800487} _PyMain;
488
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800489#define _PyMain_INIT \
Victor Stinner9cfc0022017-12-20 19:36:46 +0100490 {.config = _PyCoreConfig_INIT, \
Victor Stinnerd5dda982017-12-13 17:31:16 +0100491 .err = _Py_INIT_OK()}
492/* Note: _PyMain_INIT sets other fields to 0/NULL */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800493
494
Victor Stinner19760862017-12-20 01:41:59 +0100495/* Non-zero if filename, command (-c) or module (-m) is set
496 on the command line */
497#define RUN_CODE(pymain) \
Victor Stinnerca719ac2017-12-20 18:00:19 +0100498 (pymain->command != NULL || pymain->filename != NULL \
499 || pymain->module != NULL)
Victor Stinner19760862017-12-20 01:41:59 +0100500
501
Victor Stinnerca719ac2017-12-20 18:00:19 +0100502static wchar_t*
503pymain_wstrdup(_PyMain *pymain, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800504{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100505 wchar_t *str2 = _PyMem_RawWcsdup(str);
506 if (str2 == NULL) {
507 pymain->err = _Py_INIT_NO_MEMORY();
508 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800509 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100510 return str2;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800511}
512
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100513
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800514static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100515clear_wstrlist(int len, wchar_t **list)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800516{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100517 for (int i=0; i < len; i++) {
518 PyMem_RawFree(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100519 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100520 PyMem_RawFree(list);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100521}
522
523
524static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100525pymain_init_cmdline_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100526{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100527 assert(cmdline->argv == NULL);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100528
Victor Stinnerca719ac2017-12-20 18:00:19 +0100529 if (pymain->use_bytes_argv) {
530 /* +1 for a the NULL terminator */
531 size_t size = sizeof(wchar_t*) * (pymain->argc + 1);
532 wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size);
533 if (argv == NULL) {
534 pymain->err = _Py_INIT_NO_MEMORY();
535 return -1;
536 }
537
538 for (int i = 0; i < pymain->argc; i++) {
539 size_t len;
540 wchar_t *arg = Py_DecodeLocale(pymain->bytes_argv[i], &len);
541 if (arg == NULL) {
542 clear_wstrlist(i, argv);
543 pymain->err = DECODE_LOCALE_ERR("command line arguments",
544 (Py_ssize_t)len);
545 return -1;
546 }
547 argv[i] = arg;
548 }
549 argv[pymain->argc] = NULL;
550
551 cmdline->argv = argv;
552 }
553 else {
554 cmdline->argv = pymain->wchar_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100555 }
556
Victor Stinnerca719ac2017-12-20 18:00:19 +0100557 wchar_t *program;
558 if (pymain->argc >= 1 && cmdline->argv != NULL) {
559 program = cmdline->argv[0];
560 }
561 else {
562 program = L"";
563 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100564 pymain->config.program = pymain_wstrdup(pymain, program);
565 if (pymain->config.program == NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100566 return -1;
567 }
568
Victor Stinnerc4bca952017-12-19 23:48:17 +0100569 return 0;
570}
571
572
573static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100574pymain_clear_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100575{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100576 PyMemAllocatorEx old_alloc;
577 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100578
Victor Stinnerca719ac2017-12-20 18:00:19 +0100579 clear_wstrlist(cmdline->nwarnoption, cmdline->warnoptions);
580 cmdline->nwarnoption = 0;
581 cmdline->warnoptions = NULL;
582
583 clear_wstrlist(cmdline->nenv_warnoption, cmdline->env_warnoptions);
584 cmdline->nenv_warnoption = 0;
585 cmdline->env_warnoptions = NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100586
587 if (pymain->use_bytes_argv && cmdline->argv != NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100588 clear_wstrlist(pymain->argc, cmdline->argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100589 }
590 cmdline->argv = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100591
592 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
593}
594
595
596static void
597pymain_clear_pymain(_PyMain *pymain)
598{
599#define CLEAR(ATTR) \
600 do { \
601 PyMem_RawFree(ATTR); \
602 ATTR = NULL; \
603 } while (0)
604
605 CLEAR(pymain->filename);
606 CLEAR(pymain->command);
607 CLEAR(pymain->module);
608#undef CLEAR
Victor Stinnerc4bca952017-12-19 23:48:17 +0100609}
610
Victor Stinnerc4bca952017-12-19 23:48:17 +0100611static void
Victor Stinner9cfc0022017-12-20 19:36:46 +0100612pymain_clear_config(_PyMain *pymain)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100613{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100614 /* Clear core config with the memory allocator
615 used by pymain_read_conf() */
616 PyMemAllocatorEx old_alloc;
617 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
618
Victor Stinner9cfc0022017-12-20 19:36:46 +0100619 _PyCoreConfig_Clear(&pymain->config);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100620
621 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
622}
623
624
625static void
626pymain_free_python(_PyMain *pymain)
627{
628 Py_CLEAR(pymain->main_importer_path);
Victor Stinnerd4341102017-11-23 00:12:09 +0100629
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800630#ifdef __INSURE__
631 /* Insure++ is a memory analysis tool that aids in discovering
632 * memory leaks and other memory problems. On Python exit, the
633 * interned string dictionaries are flagged as being in use at exit
634 * (which it is). Under normal circumstances, this is fine because
635 * the memory will be automatically reclaimed by the system. Under
636 * memory debugging, it's a huge source of useless noise, so we
637 * trade off slower shutdown for less distraction in the memory
638 * reports. -baw
639 */
640 _Py_ReleaseInternedUnicodeStrings();
641#endif /* __INSURE__ */
642}
643
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100644
645static void
Victor Stinnerc4bca952017-12-19 23:48:17 +0100646pymain_free_raw(_PyMain *pymain)
Victor Stinner94540602017-12-16 04:54:22 +0100647{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100648 _PyImport_Fini2();
Victor Stinner94540602017-12-16 04:54:22 +0100649
Victor Stinnerc4bca952017-12-19 23:48:17 +0100650 /* Free global variables which cannot be freed in Py_Finalize():
651 configuration options set before Py_Initialize() which should
652 remain valid after Py_Finalize(), since
653 Py_Initialize()-Py_Finalize() can be called multiple times. */
654 _PyPathConfig_Clear(&_Py_path_config);
Victor Stinner94540602017-12-16 04:54:22 +0100655
Victor Stinner31e99082017-12-20 23:41:38 +0100656 pymain_clear_config(pymain);
657
Victor Stinnerc4bca952017-12-19 23:48:17 +0100658 /* Force the allocator used by pymain_read_conf() */
659 PyMemAllocatorEx old_alloc;
660 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner94540602017-12-16 04:54:22 +0100661
Victor Stinnerca719ac2017-12-20 18:00:19 +0100662 pymain_clear_pymain(pymain);
663
664 clear_wstrlist(orig_argc, orig_argv);
665 orig_argc = 0;
666 orig_argv = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100667
Victor Stinnerc4bca952017-12-19 23:48:17 +0100668 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100669}
670
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100671
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800672static void
673pymain_free(_PyMain *pymain)
674{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100675 pymain_free_python(pymain);
676 pymain_free_raw(pymain);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800677}
678
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100679
Eric Snow6b4be192017-05-22 21:36:03 -0700680static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800681pymain_run_main_from_importer(_PyMain *pymain)
Guido van Rossum667d7041995-08-04 04:20:48 +0000682{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800683 /* Assume sys_path0 has already been checked by pymain_get_importer(),
684 * so put it in sys.path[0] and import __main__ */
Victor Stinner11a247d2017-12-13 21:05:57 +0100685 PyObject *sys_path = PySys_GetObject("path");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800686 if (sys_path == NULL) {
687 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
688 goto error;
689 }
690
Victor Stinner11a247d2017-12-13 21:05:57 +0100691 if (PyList_Insert(sys_path, 0, pymain->main_importer_path)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800692 goto error;
693 }
694
Victor Stinner11a247d2017-12-13 21:05:57 +0100695 int sts = pymain_run_module(L"__main__", 0);
696 return (sts != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800697
698error:
699 Py_CLEAR(pymain->main_importer_path);
700 PyErr_Print();
701 return 1;
702}
703
704
Victor Stinner9cfc0022017-12-20 19:36:46 +0100705static _PyInitError
706wstrlist_append(int *len, wchar_t ***list, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800707{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100708 wchar_t *str2 = _PyMem_RawWcsdup(str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800709 if (str2 == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100710 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800711 }
712
Victor Stinnerca719ac2017-12-20 18:00:19 +0100713 size_t size = (*len + 1) * sizeof(list[0]);
714 wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size);
715 if (list2 == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800716 PyMem_RawFree(str2);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100717 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800718 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100719 list2[*len] = str2;
720 *list = list2;
721 (*len)++;
Victor Stinner9cfc0022017-12-20 19:36:46 +0100722 return _Py_INIT_OK();
723}
724
725
726static int
727pymain_wstrlist_append(_PyMain *pymain, int *len, wchar_t ***list, const wchar_t *str)
728{
729 _PyInitError err = wstrlist_append(len, list, str);
730 if (_Py_INIT_FAILED(err)) {
731 pymain->err = err;
732 return -1;
733 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800734 return 0;
735}
736
737
738/* Parse the command line arguments
739 Return 0 on success.
740 Return 1 if parsing failed.
741 Set pymain->err and return -1 on other errors. */
742static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100743pymain_parse_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800744{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100745 _PyCoreConfig *config = &pymain->config;
746
Antoine Pitrou86838b02012-02-21 19:03:47 +0100747 _PyOS_ResetGetOpt();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800748 do {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800749 int longindex = -1;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100750 int c = _PyOS_GetOpt(pymain->argc, cmdline->argv, PROGRAM_OPTS,
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800751 longoptions, &longindex);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800752 if (c == EOF) {
753 break;
754 }
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 if (c == 'c') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 /* -c is the last option; following arguments
758 that look like options are left for the
759 command to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800760 size_t len = wcslen(_PyOS_optarg) + 1 + 1;
761 wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
762 if (command == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100763 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800764 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800765 }
Miss Islington (bot)c6de46e2018-05-31 06:43:21 -0700766 memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 command[len - 2] = '\n';
768 command[len - 1] = 0;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100769 pymain->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 break;
771 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 if (c == 'm') {
774 /* -m is the last option; following arguments
775 that look like options are left for the
776 module to interpret. */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100777 pymain->module = pymain_wstrdup(pymain, _PyOS_optarg);
778 if (pymain->module == NULL) {
779 return -1;
780 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 break;
782 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 switch (c) {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800785 case 0:
786 // Handle long option.
787 assert(longindex == 0); // Only one long option now.
788 if (!wcscmp(_PyOS_optarg, L"always")) {
789 cmdline->check_hash_pycs_mode = "always";
790 } else if (!wcscmp(_PyOS_optarg, L"never")) {
791 cmdline->check_hash_pycs_mode = "never";
792 } else if (!wcscmp(_PyOS_optarg, L"default")) {
793 cmdline->check_hash_pycs_mode = "default";
794 } else {
795 fprintf(stderr, "--check-hash-based-pycs must be one of "
796 "'default', 'always', or 'never'\n");
797 return 1;
798 }
799 break;
800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700802 cmdline->bytes_warning++;
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 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700806 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700810 cmdline->inspect++;
811 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000813
Christian Heimesad73a9c2013-08-10 16:36:18 +0200814 case 'I':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100815 config->ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700816 cmdline->isolated++;
817 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200818 break;
819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700823 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700827 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700831 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700835 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 case 'E':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100839 config->ignore_environment++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 case 't':
843 /* ignored for backwards compatibility */
844 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700847 cmdline->use_unbuffered_io = 1;
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 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700851 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 case 'x':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100855 pymain->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 case 'h':
859 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700860 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700864 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 case 'W':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100868 if (pymain_wstrlist_append(pymain,
869 &cmdline->nwarnoption,
870 &cmdline->warnoptions,
871 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800872 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800873 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000875
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000876 case 'X':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100877 if (pymain_wstrlist_append(pymain,
Victor Stinner9cfc0022017-12-20 19:36:46 +0100878 &config->nxoption,
879 &config->xoptions,
Victor Stinnerca719ac2017-12-20 18:00:19 +0100880 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800881 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800882 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000883 break;
884
Georg Brandl9d871192010-12-04 10:47:18 +0000885 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700886 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000887 break;
888
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100889 case 'R':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100890 config->use_hash_seed = 0;
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100891 break;
892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 default:
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800896 /* unknown argument: parsing failed */
897 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800899 } while (1);
900
Victor Stinnerca719ac2017-12-20 18:00:19 +0100901 if (pymain->command == NULL && pymain->module == NULL
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800902 && _PyOS_optind < pymain->argc
Victor Stinnerc4bca952017-12-19 23:48:17 +0100903 && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800904 {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100905 pymain->filename = pymain_wstrdup(pymain, cmdline->argv[_PyOS_optind]);
906 if (pymain->filename == NULL) {
907 return -1;
908 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000910
Victor Stinnerd5dda982017-12-13 17:31:16 +0100911 /* -c and -m options are exclusive */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100912 assert(!(pymain->command != NULL && pymain->module != NULL));
Victor Stinnerd5dda982017-12-13 17:31:16 +0100913
Eric Snow6b4be192017-05-22 21:36:03 -0700914 return 0;
915}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000916
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800917
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800918static int
Victor Stinner9cfc0022017-12-20 19:36:46 +0100919add_xoption(PyObject *opts, const wchar_t *s)
Victor Stinner374c6e12017-12-14 12:05:26 +0100920{
921 PyObject *name, *value;
922
923 const wchar_t *name_end = wcschr(s, L'=');
924 if (!name_end) {
925 name = PyUnicode_FromWideChar(s, -1);
926 value = Py_True;
927 Py_INCREF(value);
928 }
929 else {
930 name = PyUnicode_FromWideChar(s, name_end - s);
931 value = PyUnicode_FromWideChar(name_end + 1, -1);
932 }
933 if (name == NULL || value == NULL) {
934 goto error;
935 }
936 if (PyDict_SetItem(opts, name, value) < 0) {
937 goto error;
938 }
939 Py_DECREF(name);
940 Py_DECREF(value);
941 return 0;
942
943error:
944 Py_XDECREF(name);
945 Py_XDECREF(value);
946 return -1;
947}
948
Victor Stinner9cfc0022017-12-20 19:36:46 +0100949
950static PyObject*
951config_create_xoptions_dict(const _PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800952{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100953 int nxoption = config->nxoption;
954 wchar_t **xoptions = config->xoptions;
Victor Stinner374c6e12017-12-14 12:05:26 +0100955 PyObject *dict = PyDict_New();
956 if (dict == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100957 return NULL;
Victor Stinner374c6e12017-12-14 12:05:26 +0100958 }
959
Victor Stinnerca719ac2017-12-20 18:00:19 +0100960 for (int i=0; i < nxoption; i++) {
961 wchar_t *option = xoptions[i];
Victor Stinner9cfc0022017-12-20 19:36:46 +0100962 if (add_xoption(dict, option) < 0) {
Victor Stinner374c6e12017-12-14 12:05:26 +0100963 Py_DECREF(dict);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100964 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800965 }
966 }
Victor Stinner374c6e12017-12-14 12:05:26 +0100967
Victor Stinner9cfc0022017-12-20 19:36:46 +0100968 return dict;
Eric Snow6b4be192017-05-22 21:36:03 -0700969}
970
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800971
Victor Stinner9cfc0022017-12-20 19:36:46 +0100972static _PyInitError
973config_add_warnings_optlist(_PyCoreConfig *config, int len, wchar_t **options)
Eric Snow6b4be192017-05-22 21:36:03 -0700974{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100975 for (int i = 0; i < len; i++) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100976 _PyInitError err = wstrlist_append(&config->nwarnoption,
977 &config->warnoptions,
978 options[i]);
979 if (_Py_INIT_FAILED(err)) {
980 return err;
Eric Snow6b4be192017-05-22 21:36:03 -0700981 }
Eric Snow6b4be192017-05-22 21:36:03 -0700982 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100983 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800984}
Eric Snow6b4be192017-05-22 21:36:03 -0700985
Victor Stinner747f48e2017-12-12 22:59:48 +0100986
Victor Stinner9cfc0022017-12-20 19:36:46 +0100987static _PyInitError
988config_init_warnoptions(_PyCoreConfig *config, _Py_CommandLineDetails *cmdline)
Victor Stinner747f48e2017-12-12 22:59:48 +0100989{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100990 _PyInitError err;
991
992 assert(config->nwarnoption == 0);
993
Victor Stinner747f48e2017-12-12 22:59:48 +0100994 /* The priority order for warnings configuration is (highest precedence
995 * first):
996 *
997 * - the BytesWarning filter, if needed ('-b', '-bb')
998 * - any '-W' command line options; then
999 * - the 'PYTHONWARNINGS' environment variable; then
1000 * - the dev mode filter ('-X dev', 'PYTHONDEVMODE'); then
1001 * - any implicit filters added by _warnings.c/warnings.py
1002 *
1003 * All settings except the last are passed to the warnings module via
1004 * the `sys.warnoptions` list. Since the warnings module works on the basis
1005 * of "the most recently added filter will be checked first", we add
1006 * the lowest precedence entries first so that later entries override them.
1007 */
1008
Victor Stinner9cfc0022017-12-20 19:36:46 +01001009 if (config->dev_mode) {
1010 err = wstrlist_append(&config->nwarnoption,
1011 &config->warnoptions,
1012 L"default");
1013 if (_Py_INIT_FAILED(err)) {
1014 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001015 }
Victor Stinner747f48e2017-12-12 22:59:48 +01001016 }
Victor Stinner374c6e12017-12-14 12:05:26 +01001017
Victor Stinner9cfc0022017-12-20 19:36:46 +01001018 err = config_add_warnings_optlist(config,
1019 cmdline->nenv_warnoption,
1020 cmdline->env_warnoptions);
1021 if (_Py_INIT_FAILED(err)) {
1022 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001023 }
1024
Victor Stinner9cfc0022017-12-20 19:36:46 +01001025 err = config_add_warnings_optlist(config,
1026 cmdline->nwarnoption,
1027 cmdline->warnoptions);
1028 if (_Py_INIT_FAILED(err)) {
1029 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001030 }
1031
1032 /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c
1033 * don't even try to emit a warning, so we skip setting the filter in that
1034 * case.
1035 */
1036 if (cmdline->bytes_warning) {
1037 wchar_t *filter;
1038 if (cmdline->bytes_warning> 1) {
1039 filter = L"error::BytesWarning";
1040 }
1041 else {
1042 filter = L"default::BytesWarning";
1043 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001044 err = wstrlist_append(&config->nwarnoption,
1045 &config->warnoptions,
1046 filter);
1047 if (_Py_INIT_FAILED(err)) {
1048 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001049 }
1050 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001051 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001052}
1053
1054
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001055/* Get warning options from PYTHONWARNINGS environment variable.
1056 Return 0 on success.
1057 Set pymain->err and return -1 on error. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001058static _PyInitError
1059cmdline_init_env_warnoptions(_Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001060{
1061 if (Py_IgnoreEnvironmentFlag) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001062 return _Py_INIT_OK();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +00001064
Victor Stinnerca719ac2017-12-20 18:00:19 +01001065 wchar_t *env;
1066 int res = config_get_env_var_dup(&env, L"PYTHONWARNINGS", "PYTHONWARNINGS");
1067 if (res < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001068 return DECODE_LOCALE_ERR("PYTHONWARNINGS", res);
Victor Stinnerca719ac2017-12-20 18:00:19 +01001069 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001070
Victor Stinnerca719ac2017-12-20 18:00:19 +01001071 if (env == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001072 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001073 }
Philip Jenvey0805ca32010-04-07 04:04:10 +00001074
Victor Stinnerca719ac2017-12-20 18:00:19 +01001075
1076 wchar_t *warning, *context = NULL;
1077 for (warning = WCSTOK(env, L",", &context);
1078 warning != NULL;
1079 warning = WCSTOK(NULL, L",", &context))
1080 {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001081 _PyInitError err = wstrlist_append(&cmdline->nenv_warnoption,
1082 &cmdline->env_warnoptions,
1083 warning);
1084 if (_Py_INIT_FAILED(err)) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001085 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001086 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001087 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001089 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001090 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001091}
1092
1093
1094static void
1095pymain_init_stdio(_PyMain *pymain)
1096{
1097 pymain->stdin_is_interactive = (isatty(fileno(stdin))
1098 || Py_InteractiveFlag);
Guido van Rossum775af911997-02-14 19:50:32 +00001099
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00001100#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +00001101 /* don't translate newlines (\r\n <=> \n) */
1102 _setmode(fileno(stdin), O_BINARY);
1103 _setmode(fileno(stdout), O_BINARY);
1104 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +00001105#endif
Victor Stinner89e34362011-01-07 18:47:22 +00001106
1107 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +00001108#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
1110 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
1111 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001112#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 setbuf(stdin, (char *)NULL);
1114 setbuf(stdout, (char *)NULL);
1115 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001116#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 }
1118 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +00001119#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 /* Doesn't have to have line-buffered -- use unbuffered */
1121 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
1122 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001123#else /* !MS_WINDOWS */
1124#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
1126 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001127#endif /* HAVE_SETVBUF */
1128#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 /* Leave stderr alone - it should be unbuffered anyway. */
1130 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001131}
Guido van Rossum667d7041995-08-04 04:20:48 +00001132
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001133
1134/* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__
Victor Stinner31a83932017-12-04 13:39:15 +01001135 environment variables on macOS if available. */
1136static _PyInitError
Victor Stinnerca719ac2017-12-20 18:00:19 +01001137config_init_program_name(_PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001138{
Victor Stinner31a83932017-12-04 13:39:15 +01001139 assert(config->program_name == NULL);
1140
1141 /* If Py_SetProgramName() was called, use its value */
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001142 const wchar_t *program_name = _Py_path_config.program_name;
Victor Stinner31a83932017-12-04 13:39:15 +01001143 if (program_name != NULL) {
1144 config->program_name = _PyMem_RawWcsdup(program_name);
1145 if (config->program_name == NULL) {
1146 return _Py_INIT_NO_MEMORY();
1147 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001148 return _Py_INIT_OK();
Victor Stinner31a83932017-12-04 13:39:15 +01001149 }
1150
Just van Rossum2ac79ef2003-03-05 15:46:54 +00001151#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 /* On MacOS X, when the Python interpreter is embedded in an
1153 application bundle, it gets executed by a bootstrapping script
1154 that does os.execve() with an argv[0] that's different from the
1155 actual Python executable. This is needed to keep the Finder happy,
1156 or rather, to work around Apple's overly strict requirements of
1157 the process name. However, we still need a usable sys.executable,
1158 so the actual executable path is passed in an environment variable.
1159 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
1160 script. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001161 const char *p = config_get_env_var("PYTHONEXECUTABLE");
Victor Stinner6bf992a2017-12-06 17:26:10 +01001162 if (p != NULL) {
Victor Stinner31a83932017-12-04 13:39:15 +01001163 size_t len;
1164 wchar_t* program_name = Py_DecodeLocale(p, &len);
1165 if (program_name == NULL) {
1166 return DECODE_LOCALE_ERR("PYTHONEXECUTABLE environment "
1167 "variable", (Py_ssize_t)len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 }
Victor Stinner31a83932017-12-04 13:39:15 +01001169 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001170 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001171 }
Vinay Sajip90db6612012-07-17 17:33:46 +01001172#ifdef WITH_NEXT_FRAMEWORK
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001173 else {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001174 const char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
Vinay Sajip90db6612012-07-17 17:33:46 +01001175 if (pyvenv_launcher && *pyvenv_launcher) {
1176 /* Used by Mac/Tools/pythonw.c to forward
1177 * the argv0 of the stub executable
1178 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001179 size_t len;
Victor Stinner31a83932017-12-04 13:39:15 +01001180 wchar_t* program_name = Py_DecodeLocale(pyvenv_launcher, &len);
1181 if (program_name == NULL) {
1182 return DECODE_LOCALE_ERR("__PYVENV_LAUNCHER__ environment "
1183 "variable", (Py_ssize_t)len);
Vinay Sajip90db6612012-07-17 17:33:46 +01001184 }
Victor Stinner31a83932017-12-04 13:39:15 +01001185 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001186 return _Py_INIT_OK();
Vinay Sajip90db6612012-07-17 17:33:46 +01001187 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001189#endif /* WITH_NEXT_FRAMEWORK */
1190#endif /* __APPLE__ */
Victor Stinneraf5a8952017-12-02 10:11:32 +01001191
Victor Stinnerca719ac2017-12-20 18:00:19 +01001192 /* Use argv[0] by default, if available */
1193 if (config->program != NULL) {
1194 config->program_name = _PyMem_RawWcsdup(config->program);
1195 if (config->program_name == NULL) {
1196 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001197 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001198 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001199 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001200
1201 /* Last fall back: hardcoded string */
1202#ifdef MS_WINDOWS
1203 const wchar_t *default_program_name = L"python";
1204#else
1205 const wchar_t *default_program_name = L"python3";
1206#endif
1207 config->program_name = _PyMem_RawWcsdup(default_program_name);
1208 if (config->program_name == NULL) {
1209 return _Py_INIT_NO_MEMORY();
1210 }
1211 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001212}
1213
1214
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001215static void
1216pymain_header(_PyMain *pymain)
1217{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001218 if (Py_QuietFlag) {
1219 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 }
Guido van Rossum393661d2001-08-31 17:40:15 +00001221
Victor Stinner19760862017-12-20 01:41:59 +01001222 if (!Py_VerboseFlag && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001223 return;
1224 }
1225
1226 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
1227 if (!Py_NoSiteFlag) {
1228 fprintf(stderr, "%s\n", COPYRIGHT);
1229 }
1230}
1231
1232
Victor Stinnerc4bca952017-12-19 23:48:17 +01001233static wchar_t**
Victor Stinnerca719ac2017-12-20 18:00:19 +01001234copy_wstrlist(int len, wchar_t **list)
Victor Stinner11a247d2017-12-13 21:05:57 +01001235{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001236 assert((len > 0 && list != NULL) || len == 0);
1237 size_t size = len * sizeof(list[0]);
1238 wchar_t **list_copy = PyMem_RawMalloc(size);
1239 for (int i=0; i < len; i++) {
1240 wchar_t* arg = _PyMem_RawWcsdup(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001241 if (arg == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001242 clear_wstrlist(i, list);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001243 return NULL;
1244 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001245 list_copy[i] = arg;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001246 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001247 return list_copy;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001248}
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001249
Victor Stinnerc4bca952017-12-19 23:48:17 +01001250
1251static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001252pymain_init_core_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001253{
Victor Stinnerc4bca952017-12-19 23:48:17 +01001254 /* Copy argv to be able to modify it (to force -c/-m) */
1255 int argc = pymain->argc - _PyOS_optind;
1256 wchar_t **argv;
1257
1258 if (argc <= 0 || cmdline->argv == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01001259 /* Ensure at least one (empty) argument is seen */
1260 static wchar_t *empty_argv[1] = {L""};
Victor Stinner11a247d2017-12-13 21:05:57 +01001261 argc = 1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001262 argv = copy_wstrlist(1, empty_argv);
Victor Stinner11a247d2017-12-13 21:05:57 +01001263 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01001264 else {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001265 argv = copy_wstrlist(argc, &cmdline->argv[_PyOS_optind]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001266 }
1267
1268 if (argv == NULL) {
1269 pymain->err = _Py_INIT_NO_MEMORY();
1270 return -1;
1271 }
1272
1273 wchar_t *arg0 = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001274 if (pymain->command != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001275 /* Force sys.argv[0] = '-c' */
1276 arg0 = L"-c";
1277 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001278 else if (pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001279 /* Force sys.argv[0] = '-m'*/
1280 arg0 = L"-m";
1281 }
1282 if (arg0 != NULL) {
1283 arg0 = _PyMem_RawWcsdup(arg0);
1284 if (arg0 == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001285 clear_wstrlist(argc, argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001286 pymain->err = _Py_INIT_NO_MEMORY();
1287 return -1;
1288 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001289
1290 assert(argc >= 1);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001291 PyMem_RawFree(argv[0]);
1292 argv[0] = arg0;
1293 }
1294
Victor Stinner9cfc0022017-12-20 19:36:46 +01001295 pymain->config.argc = argc;
1296 pymain->config.argv = argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001297 return 0;
1298}
1299
1300
Victor Stinner8ded5b82018-01-24 17:03:28 +01001301static PyObject*
1302wstrlist_as_pylist(int len, wchar_t **list)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001303{
Victor Stinner8ded5b82018-01-24 17:03:28 +01001304 assert(list != NULL || len < 1);
1305
1306 PyObject *pylist = PyList_New(len);
1307 if (pylist == NULL) {
1308 return NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001309 }
1310
Victor Stinner8ded5b82018-01-24 17:03:28 +01001311 for (int i = 0; i < len; i++) {
1312 PyObject *v = PyUnicode_FromWideChar(list[i], -1);
Victor Stinner11a247d2017-12-13 21:05:57 +01001313 if (v == NULL) {
Victor Stinner8ded5b82018-01-24 17:03:28 +01001314 Py_DECREF(pylist);
1315 return NULL;
Victor Stinner11a247d2017-12-13 21:05:57 +01001316 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001317 PyList_SET_ITEM(pylist, i, v);
Victor Stinner11a247d2017-12-13 21:05:57 +01001318 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001319 return pylist;
Victor Stinner11a247d2017-12-13 21:05:57 +01001320}
1321
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001322
Victor Stinner11a247d2017-12-13 21:05:57 +01001323static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01001324pymain_compute_path0(_PyMain *pymain, PyObject **path0)
Victor Stinner11a247d2017-12-13 21:05:57 +01001325{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001326 if (pymain->main_importer_path != NULL) {
1327 /* Let pymain_run_main_from_importer() adjust sys.path[0] later */
Victor Stinner19760862017-12-20 01:41:59 +01001328 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001329 return 0;
1330 }
1331
1332 if (Py_IsolatedFlag) {
Victor Stinner19760862017-12-20 01:41:59 +01001333 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001334 return 0;
1335 }
1336
Victor Stinner9cfc0022017-12-20 19:36:46 +01001337 *path0 = _PyPathConfig_ComputeArgv0(pymain->config.argc,
1338 pymain->config.argv);
Victor Stinner19760862017-12-20 01:41:59 +01001339 if (*path0 == NULL) {
1340 pymain->err = _Py_INIT_NO_MEMORY();
1341 return -1;
1342 }
1343 return 0;
1344}
1345
1346
1347static int
1348pymain_update_sys_path(_PyMain *pymain, PyObject *path0)
1349{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001350 /* Prepend argv[0] to sys.path.
1351 If argv[0] is a symlink, use the real path. */
1352 PyObject *sys_path = PySys_GetObject("path");
1353 if (sys_path == NULL) {
1354 pymain->err = _Py_INIT_ERR("can't get sys.path");
Victor Stinnerd5dda982017-12-13 17:31:16 +01001355 return -1;
1356 }
1357
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001358 /* Prepend path0 to sys.path */
1359 if (PyList_Insert(sys_path, 0, path0) < 0) {
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001360 pymain->err = _Py_INIT_ERR("sys.path.insert(0, path0) failed");
1361 return -1;
1362 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01001363 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001364}
1365
1366
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001367void
1368_PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
1369{
1370#define COPY_FLAG(ATTR, VALUE) \
1371 if (config->ATTR == -1) { \
1372 config->ATTR = VALUE; \
1373 }
1374
1375 COPY_FLAG(ignore_environment, Py_IgnoreEnvironmentFlag);
1376 COPY_FLAG(utf8_mode, Py_UTF8Mode);
1377
1378#undef COPY_FLAG
1379}
1380
1381
Victor Stinner6bf992a2017-12-06 17:26:10 +01001382/* Get Py_xxx global configuration variables */
1383static void
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001384cmdline_get_global_config(_Py_CommandLineDetails *cmdline)
Victor Stinner6bf992a2017-12-06 17:26:10 +01001385{
Victor Stinner91106cd2017-12-13 12:29:09 +01001386 cmdline->bytes_warning = Py_BytesWarningFlag;
1387 cmdline->debug = Py_DebugFlag;
1388 cmdline->inspect = Py_InspectFlag;
1389 cmdline->interactive = Py_InteractiveFlag;
1390 cmdline->isolated = Py_IsolatedFlag;
1391 cmdline->optimization_level = Py_OptimizeFlag;
1392 cmdline->dont_write_bytecode = Py_DontWriteBytecodeFlag;
1393 cmdline->no_user_site_directory = Py_NoUserSiteDirectory;
1394 cmdline->no_site_import = Py_NoSiteFlag;
1395 cmdline->use_unbuffered_io = Py_UnbufferedStdioFlag;
1396 cmdline->verbosity = Py_VerboseFlag;
1397 cmdline->quiet_flag = Py_QuietFlag;
1398#ifdef MS_WINDOWS
1399 cmdline->legacy_windows_fs_encoding = Py_LegacyWindowsFSEncodingFlag;
1400 cmdline->legacy_windows_stdio = Py_LegacyWindowsStdioFlag;
1401#endif
1402 cmdline->check_hash_pycs_mode = _Py_CheckHashBasedPycsMode ;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001403}
Victor Stinner91106cd2017-12-13 12:29:09 +01001404
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001405
1406void
1407_PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config)
1408{
1409 Py_IgnoreEnvironmentFlag = config->ignore_environment;
1410 Py_UTF8Mode = config->utf8_mode;
1411
1412 /* Random or non-zero hash seed */
1413 Py_HashRandomizationFlag = (config->use_hash_seed == 0 ||
1414 config->hash_seed != 0);
Victor Stinner6bf992a2017-12-06 17:26:10 +01001415}
1416
1417
Victor Stinner19760862017-12-20 01:41:59 +01001418/* Set Py_xxx global configuration variables */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001419static void
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001420cmdline_set_global_config(_Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001421{
Victor Stinner91106cd2017-12-13 12:29:09 +01001422 Py_BytesWarningFlag = cmdline->bytes_warning;
1423 Py_DebugFlag = cmdline->debug;
1424 Py_InspectFlag = cmdline->inspect;
1425 Py_InteractiveFlag = cmdline->interactive;
1426 Py_IsolatedFlag = cmdline->isolated;
1427 Py_OptimizeFlag = cmdline->optimization_level;
1428 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
1429 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
1430 Py_NoSiteFlag = cmdline->no_site_import;
1431 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
1432 Py_VerboseFlag = cmdline->verbosity;
1433 Py_QuietFlag = cmdline->quiet_flag;
1434 _Py_CheckHashBasedPycsMode = cmdline->check_hash_pycs_mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001435#ifdef MS_WINDOWS
Victor Stinner91106cd2017-12-13 12:29:09 +01001436 Py_LegacyWindowsFSEncodingFlag = cmdline->legacy_windows_fs_encoding;
1437 Py_LegacyWindowsStdioFlag = cmdline->legacy_windows_stdio;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001438#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001439}
1440
1441
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001442static void
1443pymain_import_readline(_PyMain *pymain)
1444{
1445 if (Py_IsolatedFlag) {
1446 return;
1447 }
Victor Stinner19760862017-12-20 01:41:59 +01001448 if (!Py_InspectFlag && RUN_CODE(pymain)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001449 return;
1450 }
1451 if (!isatty(fileno(stdin))) {
1452 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001453 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001454
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001455 PyObject *mod = PyImport_ImportModule("readline");
1456 if (mod == NULL) {
1457 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 }
1459 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001460 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001462}
1463
1464
1465static FILE*
1466pymain_open_filename(_PyMain *pymain)
1467{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001468 FILE* fp;
1469
Victor Stinnerca719ac2017-12-20 18:00:19 +01001470 fp = _Py_wfopen(pymain->filename, L"r");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001471 if (fp == NULL) {
1472 char *cfilename_buffer;
1473 const char *cfilename;
1474 int err = errno;
Victor Stinner9dd76202017-12-21 16:20:32 +01001475 cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001476 if (cfilename_buffer != NULL)
1477 cfilename = cfilename_buffer;
1478 else
1479 cfilename = "<unprintable file name>";
1480 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001481 pymain->config.program, cfilename, err, strerror(err));
Victor Stinner9dd76202017-12-21 16:20:32 +01001482 PyMem_RawFree(cfilename_buffer);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001483 pymain->status = 2;
1484 return NULL;
1485 }
1486
Victor Stinnerca719ac2017-12-20 18:00:19 +01001487 if (pymain->skip_first_line) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001488 int ch;
1489 /* Push back first newline so line numbers
1490 remain the same */
1491 while ((ch = getc(fp)) != EOF) {
1492 if (ch == '\n') {
1493 (void)ungetc(ch, fp);
1494 break;
1495 }
1496 }
1497 }
1498
1499 struct _Py_stat_struct sb;
1500 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1501 S_ISDIR(sb.st_mode)) {
1502 fprintf(stderr,
1503 "%ls: '%ls' is a directory, cannot continue\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001504 pymain->config.program, pymain->filename);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001505 fclose(fp);
1506 pymain->status = 1;
1507 return NULL;
1508 }
1509
1510 return fp;
1511}
1512
1513
1514static void
Victor Stinner19760862017-12-20 01:41:59 +01001515pymain_run_filename(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001516{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001517 if (pymain->filename == NULL && pymain->stdin_is_interactive) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001518 Py_InspectFlag = 0; /* do exit on SystemExit */
Victor Stinner19760862017-12-20 01:41:59 +01001519 pymain_run_startup(cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001520 pymain_run_interactive_hook();
1521 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001522
1523 if (pymain->main_importer_path != NULL) {
1524 pymain->status = pymain_run_main_from_importer(pymain);
1525 return;
1526 }
1527
1528 FILE *fp;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001529 if (pymain->filename != NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001530 fp = pymain_open_filename(pymain);
1531 if (fp == NULL) {
1532 return;
1533 }
1534 }
1535 else {
1536 fp = stdin;
1537 }
1538
Victor Stinnerca719ac2017-12-20 18:00:19 +01001539 pymain->status = pymain_run_file(fp, pymain->filename, cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001540}
1541
1542
1543static void
Victor Stinner19760862017-12-20 01:41:59 +01001544pymain_repl(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001547 opportunity to set it from Python. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001548 if (!Py_InspectFlag && config_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 Py_InspectFlag = 1;
1550 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001551
Victor Stinner19760862017-12-20 01:41:59 +01001552 if (!(Py_InspectFlag && pymain->stdin_is_interactive && RUN_CODE(pymain))) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001553 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001555
1556 Py_InspectFlag = 0;
1557 pymain_run_interactive_hook();
Victor Stinner33c377e2017-12-05 15:12:41 +01001558
Victor Stinner19760862017-12-20 01:41:59 +01001559 int res = PyRun_AnyFileFlags(stdin, "<stdin>", cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001560 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001561}
1562
1563
1564/* Parse the command line.
1565 Handle --version and --help options directly.
1566
1567 Return 1 if Python must exit.
1568 Return 0 on success.
1569 Set pymain->err and return -1 on failure. */
1570static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001571pymain_parse_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001572{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001573 int res = pymain_parse_cmdline_impl(pymain, cmdline);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001574 if (res < 0) {
1575 return -1;
1576 }
1577 if (res) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001578 pymain_usage(1, pymain->config.program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001579 pymain->status = 2;
1580 return 1;
1581 }
1582
Victor Stinnerca719ac2017-12-20 18:00:19 +01001583 if (pymain->command != NULL || pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001584 /* Backup _PyOS_optind */
1585 _PyOS_optind--;
1586 }
1587
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001588 return 0;
1589}
1590
1591
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001592static const wchar_t*
Victor Stinner9cfc0022017-12-20 19:36:46 +01001593config_get_xoption(_PyCoreConfig *config, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001594{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001595 int nxoption = config->nxoption;
1596 wchar_t **xoptions = config->xoptions;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001597 for (int i=0; i < nxoption; i++) {
1598 wchar_t *option = xoptions[i];
Victor Stinnera7368ac2017-11-15 18:11:45 -08001599 size_t len;
1600 wchar_t *sep = wcschr(option, L'=');
1601 if (sep != NULL) {
1602 len = (sep - option);
1603 }
1604 else {
1605 len = wcslen(option);
1606 }
1607 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1608 return option;
1609 }
1610 }
1611 return NULL;
1612}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001613
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001614
Victor Stinnera7368ac2017-11-15 18:11:45 -08001615static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001616pymain_str_to_int(const char *str, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001617{
1618 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001619 const char *endptr = str;
1620 long value = strtol(str, (char **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001621 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001622 return -1;
1623 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001624 if (value < INT_MIN || value > INT_MAX) {
1625 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001626 }
1627
Victor Stinnera7368ac2017-11-15 18:11:45 -08001628 *result = (int)value;
1629 return 0;
1630}
1631
1632
1633static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001634pymain_wstr_to_int(const wchar_t *wstr, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001635{
1636 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001637 const wchar_t *endptr = wstr;
1638 long value = wcstol(wstr, (wchar_t **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001639 if (*endptr != '\0' || errno == ERANGE) {
1640 return -1;
1641 }
1642 if (value < INT_MIN || value > INT_MAX) {
1643 return -1;
1644 }
1645
1646 *result = (int)value;
1647 return 0;
1648}
1649
1650
Victor Stinner9cfc0022017-12-20 19:36:46 +01001651static _PyInitError
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001652config_init_tracemalloc(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001653{
1654 int nframe;
1655 int valid;
1656
Victor Stinner9cfc0022017-12-20 19:36:46 +01001657 const char *env = config_get_env_var("PYTHONTRACEMALLOC");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001658 if (env) {
1659 if (!pymain_str_to_int(env, &nframe)) {
1660 valid = (nframe >= 1);
1661 }
1662 else {
1663 valid = 0;
1664 }
1665 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001666 return _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid number "
1667 "of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001668 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001669 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001670 }
1671
Victor Stinner9cfc0022017-12-20 19:36:46 +01001672 const wchar_t *xoption = config_get_xoption(config, L"tracemalloc");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001673 if (xoption) {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001674 const wchar_t *sep = wcschr(xoption, L'=');
Victor Stinnera7368ac2017-11-15 18:11:45 -08001675 if (sep) {
1676 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1677 valid = (nframe >= 1);
1678 }
1679 else {
1680 valid = 0;
1681 }
1682 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001683 return _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1684 "invalid number of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001685 }
1686 }
1687 else {
1688 /* -X tracemalloc behaves as -X tracemalloc=1 */
1689 nframe = 1;
1690 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001691 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001692 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001693 return _Py_INIT_OK();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001694}
1695
1696
1697static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001698get_env_flag(int *flag, const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001699{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001700 const char *var = config_get_env_var(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001701 if (!var) {
1702 return;
1703 }
1704 int value;
1705 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1706 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1707 value = 1;
1708 }
1709 if (*flag < value) {
1710 *flag = value;
1711 }
1712}
1713
1714
1715static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001716cmdline_get_env_flags(_Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001717{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001718 get_env_flag(&cmdline->debug, "PYTHONDEBUG");
1719 get_env_flag(&cmdline->verbosity, "PYTHONVERBOSE");
1720 get_env_flag(&cmdline->optimization_level, "PYTHONOPTIMIZE");
1721 get_env_flag(&cmdline->inspect, "PYTHONINSPECT");
1722 get_env_flag(&cmdline->dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
1723 get_env_flag(&cmdline->no_user_site_directory, "PYTHONNOUSERSITE");
1724 get_env_flag(&cmdline->use_unbuffered_io, "PYTHONUNBUFFERED");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001725#ifdef MS_WINDOWS
Victor Stinner9cfc0022017-12-20 19:36:46 +01001726 get_env_flag(&cmdline->legacy_windows_fs_encoding,
1727 "PYTHONLEGACYWINDOWSFSENCODING");
1728 get_env_flag(&cmdline->legacy_windows_stdio,
1729 "PYTHONLEGACYWINDOWSSTDIO");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001730#endif
1731}
1732
1733
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001734/* Set global variable variables from environment variables */
1735void
1736_Py_Initialize_ReadEnvVarsNoAlloc(void)
1737{
1738 _Py_CommandLineDetails cmdline;
1739 memset(&cmdline, 0, sizeof(cmdline));
1740
1741 cmdline_get_global_config(&cmdline);
1742 if (cmdline.isolated) {
1743 Py_IgnoreEnvironmentFlag = 1;
1744 cmdline.no_user_site_directory = 1;
1745 }
1746 if (!Py_IgnoreEnvironmentFlag) {
1747 cmdline_get_env_flags(&cmdline);
1748 }
1749 cmdline_set_global_config(&cmdline);
1750
1751 /* no need to call pymain_clear_cmdline(), no memory has been allocated */
1752}
1753
1754
Victor Stinner46972b72017-11-24 22:55:40 +01001755static _PyInitError
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001756config_init_home(_PyCoreConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001757{
1758 wchar_t *home;
1759
Victor Stinner31a83932017-12-04 13:39:15 +01001760 /* If Py_SetPythonHome() was called, use its value */
1761 home = _Py_path_config.home;
Victor Stinner1f151112017-11-23 10:43:14 +01001762 if (home) {
Victor Stinner46972b72017-11-24 22:55:40 +01001763 config->home = _PyMem_RawWcsdup(home);
1764 if (config->home == NULL) {
1765 return _Py_INIT_NO_MEMORY();
Victor Stinner1f151112017-11-23 10:43:14 +01001766 }
Victor Stinner46972b72017-11-24 22:55:40 +01001767 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001768 }
1769
Victor Stinner46972b72017-11-24 22:55:40 +01001770 int res = config_get_env_var_dup(&home, L"PYTHONHOME", "PYTHONHOME");
Victor Stinner1f151112017-11-23 10:43:14 +01001771 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001772 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinner1f151112017-11-23 10:43:14 +01001773 }
Victor Stinner46972b72017-11-24 22:55:40 +01001774 config->home = home;
1775 return _Py_INIT_OK();
Victor Stinnerd4341102017-11-23 00:12:09 +01001776}
1777
1778
Victor Stinner358e5e12017-12-15 00:51:22 +01001779static _PyInitError
1780config_init_hash_seed(_PyCoreConfig *config)
1781{
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001782 const char *seed_text = config_get_env_var("PYTHONHASHSEED");
1783 int use_hash_seed;
1784 unsigned long hash_seed;
1785 if (_Py_ReadHashSeed(seed_text, &use_hash_seed, &hash_seed) < 0) {
1786 return _Py_INIT_USER_ERR("PYTHONHASHSEED must be \"random\" "
1787 "or an integer in range [0; 4294967295]");
Victor Stinner358e5e12017-12-15 00:51:22 +01001788 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001789 config->use_hash_seed = use_hash_seed;
1790 config->hash_seed = hash_seed;
Victor Stinner358e5e12017-12-15 00:51:22 +01001791 return _Py_INIT_OK();
1792}
1793
1794
Victor Stinner9cfc0022017-12-20 19:36:46 +01001795static _PyInitError
1796config_init_utf8_mode(_PyCoreConfig *config)
Victor Stinner91106cd2017-12-13 12:29:09 +01001797{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001798 const wchar_t *xopt = config_get_xoption(config, L"utf8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001799 if (xopt) {
1800 wchar_t *sep = wcschr(xopt, L'=');
1801 if (sep) {
1802 xopt = sep + 1;
1803 if (wcscmp(xopt, L"1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001804 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001805 }
1806 else if (wcscmp(xopt, L"0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001807 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001808 }
1809 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001810 return _Py_INIT_USER_ERR("invalid -X utf8 option value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001811 }
1812 }
1813 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001814 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001815 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001816 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001817 }
1818
Victor Stinner9cfc0022017-12-20 19:36:46 +01001819 const char *opt = config_get_env_var("PYTHONUTF8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001820 if (opt) {
1821 if (strcmp(opt, "1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001822 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001823 }
1824 else if (strcmp(opt, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001825 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001826 }
1827 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001828 return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment "
1829 "variable value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001830 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001831 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001832 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001833
1834 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001835}
Victor Stinner46972b72017-11-24 22:55:40 +01001836
1837
Victor Stinner9cfc0022017-12-20 19:36:46 +01001838static _PyInitError
1839config_read_env_vars(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001840{
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001841 assert(!config->ignore_environment);
1842
1843 if (config->allocator == NULL) {
1844 config->allocator = config_get_env_var("PYTHONMALLOC");
1845 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001846
Victor Stinner9cfc0022017-12-20 19:36:46 +01001847 if (config_get_env_var("PYTHONDUMPREFS")) {
1848 config->dump_refs = 1;
1849 }
1850 if (config_get_env_var("PYTHONMALLOCSTATS")) {
1851 config->malloc_stats = 1;
Victor Stinner31a83932017-12-04 13:39:15 +01001852 }
1853
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001854 if (config->coerce_c_locale < 0) {
1855 const char *env = config_get_env_var("PYTHONCOERCECLOCALE");
1856 if (env) {
1857 if (strcmp(env, "0") == 0) {
1858 config->coerce_c_locale = 0;
1859 }
1860 else if (strcmp(env, "warn") == 0) {
1861 config->coerce_c_locale_warn = 1;
1862 }
1863 else {
1864 config->coerce_c_locale = 1;
1865 }
Victor Stinner94540602017-12-16 04:54:22 +01001866 }
1867 }
1868
Victor Stinner9cfc0022017-12-20 19:36:46 +01001869 wchar_t *path;
1870 int res = config_get_env_var_dup(&path, L"PYTHONPATH", "PYTHONPATH");
1871 if (res < 0) {
Miss Islington (bot)6414da92018-05-19 16:14:42 -07001872 return DECODE_LOCALE_ERR("PYTHONPATH", res);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001873 }
1874 config->module_search_path_env = path;
1875
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001876 if (config->use_hash_seed < 0) {
1877 _PyInitError err = config_init_hash_seed(config);
1878 if (_Py_INIT_FAILED(err)) {
1879 return err;
1880 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001881 }
1882
1883 return _Py_INIT_OK();
1884}
1885
1886
1887static _PyInitError
1888config_read_complex_options(_PyCoreConfig *config)
1889{
1890 /* More complex options configured by env var and -X option */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001891 if (config->faulthandler < 0) {
1892 if (config_get_env_var("PYTHONFAULTHANDLER")
1893 || config_get_xoption(config, L"faulthandler")) {
1894 config->faulthandler = 1;
1895 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001896 }
1897 if (config_get_env_var("PYTHONPROFILEIMPORTTIME")
1898 || config_get_xoption(config, L"importtime")) {
1899 config->import_time = 1;
1900 }
1901 if (config_get_xoption(config, L"dev" ) ||
1902 config_get_env_var("PYTHONDEVMODE"))
1903 {
1904 config->dev_mode = 1;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001905 }
1906
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001907 if (config->tracemalloc < 0) {
1908 _PyInitError err = config_init_tracemalloc(config);
1909 if (_Py_INIT_FAILED(err)) {
1910 return err;
1911 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001912 }
1913 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001914}
1915
1916
Victor Stinnera7368ac2017-11-15 18:11:45 -08001917/* Parse command line options and environment variables.
1918 This code must not use Python runtime apart PyMem_Raw memory allocator.
1919
1920 Return 0 on success.
1921 Return 1 if Python is done and must exit.
1922 Set pymain->err and return -1 on error. */
1923static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001924pymain_read_conf_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001925{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001926 _PyInitError err;
1927
Victor Stinnerca719ac2017-12-20 18:00:19 +01001928 int res = pymain_parse_cmdline(pymain, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01001929 if (res != 0) {
1930 return res;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001931 }
1932
Victor Stinner9cfc0022017-12-20 19:36:46 +01001933 /* Set Py_IgnoreEnvironmentFlag for Py_GETENV() */
1934 _PyCoreConfig *config = &pymain->config;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001935 Py_IgnoreEnvironmentFlag = config->ignore_environment || cmdline->isolated;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001936
1937 /* Get environment variables */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001938 if (!Py_IgnoreEnvironmentFlag) {
1939 cmdline_get_env_flags(cmdline);
1940 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001941
1942 err = cmdline_init_env_warnoptions(cmdline);
1943 if (_Py_INIT_FAILED(err)) {
1944 pymain->err = err;
1945 return -1;
1946 }
1947
1948#ifdef MS_WINDOWS
1949 if (cmdline->legacy_windows_fs_encoding) {
1950 config->utf8_mode = 0;
1951 }
1952#endif
1953
Victor Stinnerca719ac2017-12-20 18:00:19 +01001954 if (pymain_init_core_argv(pymain, cmdline) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01001955 return -1;
1956 }
1957
Victor Stinner2b822a02018-01-25 09:18:36 +01001958 /* On Windows, _PyPathConfig_Init() modifies Py_IsolatedFlag and
1959 Py_NoSiteFlag variables if a "._pth" file is found. */
1960 int init_isolated = Py_IsolatedFlag;
1961 int init_no_site = Py_NoSiteFlag;
1962 Py_IsolatedFlag = cmdline->isolated;
1963 Py_NoSiteFlag = cmdline->no_site_import;
Victor Stinner8ded5b82018-01-24 17:03:28 +01001964
Victor Stinner9cfc0022017-12-20 19:36:46 +01001965 err = _PyCoreConfig_Read(config);
Victor Stinner2b822a02018-01-25 09:18:36 +01001966
1967 cmdline->isolated = Py_IsolatedFlag;
1968 cmdline->no_site_import = Py_NoSiteFlag;
1969 Py_IsolatedFlag = init_isolated;
1970 Py_NoSiteFlag = init_no_site;
1971
Victor Stinner31a83932017-12-04 13:39:15 +01001972 if (_Py_INIT_FAILED(err)) {
1973 pymain->err = err;
1974 return -1;
1975 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001976 return 0;
1977}
1978
1979
Victor Stinner19760862017-12-20 01:41:59 +01001980/* Read the configuration, but initialize also the LC_CTYPE locale:
1981 enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538) */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001982static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001983pymain_read_conf(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001984{
Victor Stinner80a0eba2018-08-23 12:41:35 +02001985 int init_utf8_mode = Py_UTF8Mode;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001986 _PyCoreConfig *config = &pymain->config;
1987 _PyCoreConfig save_config = _PyCoreConfig_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01001988 int res = -1;
1989
Victor Stinner94540602017-12-16 04:54:22 +01001990 char *oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
1991 if (oldloc == NULL) {
1992 pymain->err = _Py_INIT_NO_MEMORY();
1993 goto done;
1994 }
1995
1996 /* Reconfigure the locale to the default for this process */
1997 _Py_SetLocaleFromEnv(LC_ALL);
1998
1999 int locale_coerced = 0;
2000 int loops = 0;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002001 int init_ignore_env = config->ignore_environment;
2002
2003 if (_PyCoreConfig_Copy(&save_config, config) < 0) {
2004 pymain->err = _Py_INIT_NO_MEMORY();
2005 goto done;
2006 }
Victor Stinner94540602017-12-16 04:54:22 +01002007
2008 while (1) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002009 int init_utf8_mode = config->utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002010 int encoding_changed = 0;
2011
2012 /* Watchdog to prevent an infinite loop */
2013 loops++;
2014 if (loops == 3) {
2015 pymain->err = _Py_INIT_ERR("Encoding changed twice while "
2016 "reading the configuration");
2017 goto done;
2018 }
2019
Victor Stinner80a0eba2018-08-23 12:41:35 +02002020 /* bpo-34207: Py_DecodeLocale(), Py_EncodeLocale() and similar
2021 functions depend on Py_UTF8Mode. */
2022 Py_UTF8Mode = config->utf8_mode;
2023
Victor Stinnerca719ac2017-12-20 18:00:19 +01002024 if (pymain_init_cmdline_argv(pymain, cmdline) < 0) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01002025 goto done;
Victor Stinner94540602017-12-16 04:54:22 +01002026 }
2027
Victor Stinner9cfc0022017-12-20 19:36:46 +01002028 int conf_res = pymain_read_conf_impl(pymain, cmdline);
2029 if (conf_res != 0) {
2030 res = conf_res;
Victor Stinner94540602017-12-16 04:54:22 +01002031 goto done;
2032 }
2033
2034 /* The legacy C locale assumes ASCII as the default text encoding, which
2035 * causes problems not only for the CPython runtime, but also other
2036 * components like GNU readline.
2037 *
2038 * Accordingly, when the CLI detects it, it attempts to coerce it to a
2039 * more capable UTF-8 based alternative.
2040 *
2041 * See the documentation of the PYTHONCOERCECLOCALE setting for more
2042 * details.
2043 */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002044 if (config->coerce_c_locale == 1 && !locale_coerced) {
Victor Stinner94540602017-12-16 04:54:22 +01002045 locale_coerced = 1;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002046 _Py_CoerceLegacyLocale(config);
Victor Stinner94540602017-12-16 04:54:22 +01002047 encoding_changed = 1;
2048 }
2049
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002050 if (init_utf8_mode == -1) {
2051 if (config->utf8_mode == 1) {
Victor Stinner94540602017-12-16 04:54:22 +01002052 /* UTF-8 Mode enabled */
2053 encoding_changed = 1;
2054 }
2055 }
2056 else {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002057 if (config->utf8_mode != init_utf8_mode) {
Victor Stinner94540602017-12-16 04:54:22 +01002058 encoding_changed = 1;
2059 }
2060 }
2061
2062 if (!encoding_changed) {
2063 break;
2064 }
2065
2066 /* Reset the configuration, except UTF-8 Mode. Set Py_UTF8Mode for
2067 Py_DecodeLocale(). Reset Py_IgnoreEnvironmentFlag, modified by
Victor Stinner8ded5b82018-01-24 17:03:28 +01002068 pymain_read_conf_impl(). Reset Py_IsolatedFlag and Py_NoSiteFlag
2069 modified by _PyCoreConfig_Read(). */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002070 int new_utf8_mode = config->utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002071 Py_IgnoreEnvironmentFlag = init_ignore_env;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002072 if (_PyCoreConfig_Copy(config, &save_config) < 0) {
2073 pymain->err = _Py_INIT_NO_MEMORY();
2074 goto done;
2075 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002076 pymain_clear_cmdline(pymain, cmdline);
Miss Islington (bot)046da162018-06-15 15:26:29 -07002077 memset(cmdline, 0, sizeof(*cmdline));
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002078
2079 cmdline_get_global_config(cmdline);
2080 _PyCoreConfig_GetGlobalConfig(config);
2081 config->utf8_mode = new_utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002082
2083 /* The encoding changed: read again the configuration
2084 with the new encoding */
2085 }
2086 res = 0;
2087
2088done:
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002089 _PyCoreConfig_Clear(&save_config);
Victor Stinner94540602017-12-16 04:54:22 +01002090 if (oldloc != NULL) {
2091 setlocale(LC_ALL, oldloc);
2092 PyMem_RawFree(oldloc);
2093 }
Victor Stinner80a0eba2018-08-23 12:41:35 +02002094 Py_UTF8Mode = init_utf8_mode ;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002095 return res;
2096}
2097
Victor Stinner91106cd2017-12-13 12:29:09 +01002098
Victor Stinner9cfc0022017-12-20 19:36:46 +01002099static void
2100config_init_locale(_PyCoreConfig *config)
2101{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002102 if (_Py_LegacyLocaleDetected()) {
2103 /* POSIX locale: enable C locale coercion and UTF-8 Mode */
2104 if (config->utf8_mode < 0) {
2105 config->utf8_mode = 1;
2106 }
2107 if (config->coerce_c_locale < 0) {
2108 config->coerce_c_locale = 1;
2109 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002110 }
2111}
2112
2113
Victor Stinner8ded5b82018-01-24 17:03:28 +01002114static _PyInitError
2115config_init_module_search_paths(_PyCoreConfig *config)
2116{
2117 assert(config->module_search_paths == NULL);
2118 assert(config->nmodule_search_path < 0);
2119
2120 config->nmodule_search_path = 0;
2121
2122 const wchar_t *sys_path = Py_GetPath();
2123 const wchar_t delim = DELIM;
2124 const wchar_t *p = sys_path;
2125 while (1) {
2126 p = wcschr(sys_path, delim);
2127 if (p == NULL) {
2128 p = sys_path + wcslen(sys_path); /* End of string */
2129 }
2130
2131 size_t path_len = (p - sys_path);
2132 wchar_t *path = PyMem_RawMalloc((path_len + 1) * sizeof(wchar_t));
2133 if (path == NULL) {
2134 return _Py_INIT_NO_MEMORY();
2135 }
2136 memcpy(path, sys_path, path_len * sizeof(wchar_t));
2137 path[path_len] = L'\0';
2138
2139 _PyInitError err = wstrlist_append(&config->nmodule_search_path,
2140 &config->module_search_paths,
2141 path);
2142 PyMem_RawFree(path);
2143 if (_Py_INIT_FAILED(err)) {
2144 return err;
2145 }
2146
2147 if (*p == '\0') {
2148 break;
2149 }
2150 sys_path = p + 1;
2151 }
2152 return _Py_INIT_OK();
2153}
2154
2155
2156static _PyInitError
2157config_init_path_config(_PyCoreConfig *config)
2158{
2159 _PyInitError err = _PyPathConfig_Init(config);
2160 if (_Py_INIT_FAILED(err)) {
2161 return err;
2162 }
2163
2164 if (config->nmodule_search_path < 0) {
2165 err = config_init_module_search_paths(config);
2166 if (_Py_INIT_FAILED(err)) {
2167 return err;
2168 }
2169 }
2170
2171 if (config->executable == NULL) {
2172 config->executable = _PyMem_RawWcsdup(Py_GetProgramFullPath());
2173 if (config->executable == NULL) {
2174 return _Py_INIT_NO_MEMORY();
2175 }
2176 }
2177
2178 if (config->prefix == NULL) {
2179 config->prefix = _PyMem_RawWcsdup(Py_GetPrefix());
2180 if (config->prefix == NULL) {
2181 return _Py_INIT_NO_MEMORY();
2182 }
2183 }
2184
2185 if (config->exec_prefix == NULL) {
2186 config->exec_prefix = _PyMem_RawWcsdup(Py_GetExecPrefix());
2187 if (config->exec_prefix == NULL) {
2188 return _Py_INIT_NO_MEMORY();
2189 }
2190 }
2191
2192 if (config->base_prefix == NULL) {
2193 config->base_prefix = _PyMem_RawWcsdup(config->prefix);
2194 if (config->base_prefix == NULL) {
2195 return _Py_INIT_NO_MEMORY();
2196 }
2197 }
2198
2199 if (config->base_exec_prefix == NULL) {
2200 config->base_exec_prefix = _PyMem_RawWcsdup(config->exec_prefix);
2201 if (config->base_exec_prefix == NULL) {
2202 return _Py_INIT_NO_MEMORY();
2203 }
2204 }
2205
2206 return _Py_INIT_OK();
2207}
2208
Victor Stinnerda273412017-12-15 01:46:02 +01002209/* Read configuration settings from standard locations
2210 *
2211 * This function doesn't make any changes to the interpreter state - it
2212 * merely populates any missing configuration settings. This allows an
2213 * embedding application to completely override a config option by
2214 * setting it before calling this function, or else modify the default
2215 * setting before passing the fully populated config to Py_EndInitialization.
2216 *
2217 * More advanced selective initialization tricks are possible by calling
2218 * this function multiple times with various preconfigured settings.
2219 */
2220
2221_PyInitError
2222_PyCoreConfig_Read(_PyCoreConfig *config)
2223{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002224 _PyInitError err;
2225
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002226 _PyCoreConfig_GetGlobalConfig(config);
2227
2228 assert(config->ignore_environment >= 0);
2229 if (!config->ignore_environment) {
2230 err = config_read_env_vars(config);
2231 if (_Py_INIT_FAILED(err)) {
2232 return err;
2233 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002234 }
2235
Victor Stinner9cfc0022017-12-20 19:36:46 +01002236 /* -X options */
2237 if (config_get_xoption(config, L"showrefcount")) {
2238 config->show_ref_count = 1;
2239 }
2240 if (config_get_xoption(config, L"showalloccount")) {
2241 config->show_alloc_count = 1;
2242 }
2243
2244 err = config_read_complex_options(config);
2245 if (_Py_INIT_FAILED(err)) {
2246 return err;
2247 }
2248
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002249 if (config->utf8_mode < 0) {
2250 err = config_init_utf8_mode(config);
2251 if (_Py_INIT_FAILED(err)) {
2252 return err;
2253 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002254 }
2255
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002256 if (config->home == NULL) {
2257 err = config_init_home(config);
2258 if (_Py_INIT_FAILED(err)) {
2259 return err;
2260 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002261 }
2262
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002263 if (config->program_name == NULL) {
2264 err = config_init_program_name(config);
2265 if (_Py_INIT_FAILED(err)) {
2266 return err;
2267 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002268 }
2269
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002270 if (config->utf8_mode < 0 || config->coerce_c_locale < 0) {
2271 config_init_locale(config);
Victor Stinner94540602017-12-16 04:54:22 +01002272 }
2273
Victor Stinner8ded5b82018-01-24 17:03:28 +01002274 if (!config->_disable_importlib) {
2275 err = config_init_path_config(config);
2276 if (_Py_INIT_FAILED(err)) {
2277 return err;
2278 }
2279 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002280
2281 /* default values */
2282 if (config->dev_mode) {
2283 if (config->faulthandler < 0) {
2284 config->faulthandler = 1;
2285 }
2286 if (config->allocator == NULL) {
2287 config->allocator = "debug";
2288 }
2289 }
2290 if (config->install_signal_handlers < 0) {
2291 config->install_signal_handlers = 1;
2292 }
2293 if (config->use_hash_seed < 0) {
2294 config->use_hash_seed = 0;
2295 config->hash_seed = 0;
2296 }
2297 if (config->faulthandler < 0) {
2298 config->faulthandler = 0;
2299 }
2300 if (config->tracemalloc < 0) {
2301 config->tracemalloc = 0;
2302 }
2303 if (config->coerce_c_locale < 0) {
2304 config->coerce_c_locale = 0;
2305 }
2306 if (config->utf8_mode < 0) {
2307 config->utf8_mode = 0;
2308 }
2309 if (config->argc < 0) {
2310 config->argc = 0;
2311 }
2312
Victor Stinnerda273412017-12-15 01:46:02 +01002313 return _Py_INIT_OK();
2314}
2315
2316
2317void
2318_PyCoreConfig_Clear(_PyCoreConfig *config)
2319{
2320#define CLEAR(ATTR) \
2321 do { \
2322 PyMem_RawFree(ATTR); \
2323 ATTR = NULL; \
2324 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002325#define CLEAR_WSTRLIST(LEN, LIST) \
2326 do { \
2327 clear_wstrlist(LEN, LIST); \
2328 LEN = 0; \
2329 LIST = NULL; \
2330 } while (0)
Victor Stinnerda273412017-12-15 01:46:02 +01002331
2332 CLEAR(config->module_search_path_env);
2333 CLEAR(config->home);
2334 CLEAR(config->program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002335 CLEAR(config->program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002336
Victor Stinner8ded5b82018-01-24 17:03:28 +01002337 CLEAR_WSTRLIST(config->argc, config->argv);
2338 config->argc = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002339
Victor Stinner8ded5b82018-01-24 17:03:28 +01002340 CLEAR_WSTRLIST(config->nwarnoption, config->warnoptions);
2341 CLEAR_WSTRLIST(config->nxoption, config->xoptions);
2342 CLEAR_WSTRLIST(config->nmodule_search_path, config->module_search_paths);
2343 config->nmodule_search_path = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002344
Victor Stinner8ded5b82018-01-24 17:03:28 +01002345 CLEAR(config->executable);
2346 CLEAR(config->prefix);
2347 CLEAR(config->base_prefix);
2348 CLEAR(config->exec_prefix);
2349 CLEAR(config->base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002350#undef CLEAR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002351#undef CLEAR_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002352}
2353
2354
2355int
2356_PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
2357{
2358 _PyCoreConfig_Clear(config);
2359
2360#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
Victor Stinnerc4bca952017-12-19 23:48:17 +01002361#define COPY_STR_ATTR(ATTR) \
2362 do { \
2363 if (config2->ATTR != NULL) { \
2364 config->ATTR = _PyMem_RawWcsdup(config2->ATTR); \
2365 if (config->ATTR == NULL) { \
2366 return -1; \
2367 } \
2368 } \
2369 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002370#define COPY_WSTRLIST(LEN, LIST) \
2371 do { \
2372 if (config2->LIST != NULL) { \
2373 config->LIST = copy_wstrlist(config2->LEN, config2->LIST); \
2374 if (config->LIST == NULL) { \
2375 return -1; \
2376 } \
2377 } \
2378 config->LEN = config2->LEN; \
2379 } while (0)
Victor Stinnerc4bca952017-12-19 23:48:17 +01002380
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002381 COPY_ATTR(install_signal_handlers);
Victor Stinnerda273412017-12-15 01:46:02 +01002382 COPY_ATTR(ignore_environment);
2383 COPY_ATTR(use_hash_seed);
2384 COPY_ATTR(hash_seed);
2385 COPY_ATTR(_disable_importlib);
2386 COPY_ATTR(allocator);
2387 COPY_ATTR(dev_mode);
2388 COPY_ATTR(faulthandler);
2389 COPY_ATTR(tracemalloc);
2390 COPY_ATTR(import_time);
2391 COPY_ATTR(show_ref_count);
2392 COPY_ATTR(show_alloc_count);
2393 COPY_ATTR(dump_refs);
2394 COPY_ATTR(malloc_stats);
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002395
2396 COPY_ATTR(coerce_c_locale);
2397 COPY_ATTR(coerce_c_locale_warn);
Victor Stinnerda273412017-12-15 01:46:02 +01002398 COPY_ATTR(utf8_mode);
Victor Stinnerda273412017-12-15 01:46:02 +01002399
2400 COPY_STR_ATTR(module_search_path_env);
2401 COPY_STR_ATTR(home);
2402 COPY_STR_ATTR(program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002403 COPY_STR_ATTR(program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002404
Victor Stinner8ded5b82018-01-24 17:03:28 +01002405 COPY_WSTRLIST(argc, argv);
2406 COPY_WSTRLIST(nwarnoption, warnoptions);
2407 COPY_WSTRLIST(nxoption, xoptions);
2408 COPY_WSTRLIST(nmodule_search_path, module_search_paths);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002409
Victor Stinner8ded5b82018-01-24 17:03:28 +01002410 COPY_STR_ATTR(executable);
2411 COPY_STR_ATTR(prefix);
2412 COPY_STR_ATTR(base_prefix);
2413 COPY_STR_ATTR(exec_prefix);
2414 COPY_STR_ATTR(base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002415
Victor Stinnerc4bca952017-12-19 23:48:17 +01002416#undef COPY_ATTR
Victor Stinnerda273412017-12-15 01:46:02 +01002417#undef COPY_STR_ATTR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002418#undef COPY_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002419 return 0;
2420}
2421
2422
2423void
2424_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config)
2425{
2426 Py_CLEAR(config->argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002427 Py_CLEAR(config->executable);
2428 Py_CLEAR(config->prefix);
2429 Py_CLEAR(config->base_prefix);
2430 Py_CLEAR(config->exec_prefix);
2431 Py_CLEAR(config->base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002432 Py_CLEAR(config->warnoptions);
2433 Py_CLEAR(config->xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002434 Py_CLEAR(config->module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002435}
2436
2437
2438static PyObject*
2439config_copy_attr(PyObject *obj)
2440{
2441 if (PyUnicode_Check(obj)) {
2442 Py_INCREF(obj);
2443 return obj;
2444 }
2445 else if (PyList_Check(obj)) {
2446 return PyList_GetSlice(obj, 0, Py_SIZE(obj));
2447 }
2448 else if (PyDict_Check(obj)) {
2449 /* The dict type is used for xoptions. Make the assumption that keys
2450 and values are immutables */
2451 return PyDict_Copy(obj);
2452 }
2453 else {
2454 PyErr_Format(PyExc_TypeError,
2455 "cannot copy config attribute of type %.200s",
2456 Py_TYPE(obj)->tp_name);
2457 return NULL;
2458 }
2459}
2460
2461
2462int
2463_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config,
2464 const _PyMainInterpreterConfig *config2)
2465{
2466 _PyMainInterpreterConfig_Clear(config);
2467
2468#define COPY_ATTR(ATTR) \
2469 do { \
2470 if (config2->ATTR != NULL) { \
2471 config->ATTR = config_copy_attr(config2->ATTR); \
2472 if (config->ATTR == NULL) { \
2473 return -1; \
2474 } \
2475 } \
2476 } while (0)
2477
2478 COPY_ATTR(argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002479 COPY_ATTR(executable);
2480 COPY_ATTR(prefix);
2481 COPY_ATTR(base_prefix);
2482 COPY_ATTR(exec_prefix);
2483 COPY_ATTR(base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002484 COPY_ATTR(warnoptions);
2485 COPY_ATTR(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002486 COPY_ATTR(module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002487#undef COPY_ATTR
2488 return 0;
2489}
2490
2491
2492
2493
Victor Stinner41264f12017-12-15 02:05:29 +01002494_PyInitError
Victor Stinner9cfc0022017-12-20 19:36:46 +01002495_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config,
2496 const _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002497{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002498 if (main_config->install_signal_handlers < 0) {
2499 main_config->install_signal_handlers = config->install_signal_handlers;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002500 }
2501
Victor Stinner9cfc0022017-12-20 19:36:46 +01002502 if (main_config->xoptions == NULL) {
2503 main_config->xoptions = config_create_xoptions_dict(config);
2504 if (main_config->xoptions == NULL) {
2505 return _Py_INIT_NO_MEMORY();
2506 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002507 }
2508
Victor Stinner8ded5b82018-01-24 17:03:28 +01002509#define COPY_WSTR(ATTR) \
2510 do { \
2511 if (main_config->ATTR == NULL) { \
2512 main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \
2513 if (main_config->ATTR == NULL) { \
2514 return _Py_INIT_NO_MEMORY(); \
2515 } \
2516 } \
2517 } while (0)
2518#define COPY_WSTRLIST(ATTR, LEN, LIST) \
2519 do { \
2520 if (ATTR == NULL) { \
2521 ATTR = wstrlist_as_pylist(LEN, LIST); \
2522 if (ATTR == NULL) { \
2523 return _Py_INIT_NO_MEMORY(); \
2524 } \
2525 } \
2526 } while (0)
2527
2528 COPY_WSTRLIST(main_config->warnoptions,
2529 config->nwarnoption, config->warnoptions);
2530 if (config->argc >= 0) {
2531 COPY_WSTRLIST(main_config->argv,
2532 config->argc, config->argv);
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002533 }
2534
Victor Stinner8ded5b82018-01-24 17:03:28 +01002535 if (!config->_disable_importlib) {
2536 COPY_WSTR(executable);
2537 COPY_WSTR(prefix);
2538 COPY_WSTR(base_prefix);
2539 COPY_WSTR(exec_prefix);
2540 COPY_WSTR(base_exec_prefix);
2541
2542 COPY_WSTRLIST(main_config->module_search_path,
2543 config->nmodule_search_path, config->module_search_paths);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002544 }
Victor Stinner41264f12017-12-15 02:05:29 +01002545
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002546 return _Py_INIT_OK();
Victor Stinner8ded5b82018-01-24 17:03:28 +01002547#undef COPY_WSTR
2548#undef COPY_WSTRLIST
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002549}
2550
2551
2552static int
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002553pymain_init_python_main(_PyMain *pymain, PyInterpreterState *interp)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002554{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002555 _PyInitError err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002556
Victor Stinner9cfc0022017-12-20 19:36:46 +01002557 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002558 err = _PyMainInterpreterConfig_Read(&main_config, &interp->core_config);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002559 if (!_Py_INIT_FAILED(err)) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002560 err = _Py_InitializeMainInterpreter(interp, &main_config);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002561 }
2562 _PyMainInterpreterConfig_Clear(&main_config);
2563
2564 if (_Py_INIT_FAILED(err)) {
2565 pymain->err = err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002566 return -1;
2567 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002568 return 0;
2569}
Victor Stinnera7368ac2017-11-15 18:11:45 -08002570
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002571
2572static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01002573pymain_init_sys_path(_PyMain *pymain)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002574{
Victor Stinnerca719ac2017-12-20 18:00:19 +01002575 if (pymain->filename != NULL) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002576 /* If filename is a package (ex: directory or ZIP file) which contains
2577 __main__.py, main_importer_path is set to filename and will be
2578 prepended to sys.path by pymain_run_main_from_importer(). Otherwise,
2579 main_importer_path is set to NULL. */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002580 pymain->main_importer_path = pymain_get_importer(pymain->filename);
Victor Stinnerd5dda982017-12-13 17:31:16 +01002581 }
2582
Victor Stinner19760862017-12-20 01:41:59 +01002583 PyObject *path0;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002584 if (pymain_compute_path0(pymain, &path0) < 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002585 return -1;
2586 }
Victor Stinner19760862017-12-20 01:41:59 +01002587
Victor Stinner9cfc0022017-12-20 19:36:46 +01002588 pymain_clear_config(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002589
2590 if (path0 != NULL) {
2591 if (pymain_update_sys_path(pymain, path0) < 0) {
2592 Py_DECREF(path0);
2593 return -1;
2594 }
2595 Py_DECREF(path0);
2596 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002597 return 0;
2598}
2599
2600
2601static void
2602pymain_run_python(_PyMain *pymain)
2603{
Victor Stinner19760862017-12-20 01:41:59 +01002604 PyCompilerFlags cf = {.cf_flags = 0};
Victor Stinnera7368ac2017-11-15 18:11:45 -08002605
2606 pymain_header(pymain);
2607 pymain_import_readline(pymain);
2608
Victor Stinnerca719ac2017-12-20 18:00:19 +01002609 if (pymain->command) {
2610 pymain->status = pymain_run_command(pymain->command, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002611 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002612 else if (pymain->module) {
2613 pymain->status = (pymain_run_module(pymain->module, 1) != 0);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002614 }
2615 else {
Victor Stinner19760862017-12-20 01:41:59 +01002616 pymain_run_filename(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002617 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002618
Victor Stinner19760862017-12-20 01:41:59 +01002619 pymain_repl(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002620}
2621
2622
Victor Stinnerc4bca952017-12-19 23:48:17 +01002623static void
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002624pymain_init(_PyMain *pymain)
2625{
Victor Stinner94540602017-12-16 04:54:22 +01002626 /* 754 requires that FP exceptions run in "no stop" mode by default,
2627 * and until C vendors implement C99's ways to control FP exceptions,
2628 * Python requires non-stop mode. Alas, some platforms enable FP
2629 * exceptions by default. Here we disable them.
2630 */
2631#ifdef __FreeBSD__
2632 fedisableexcept(FE_OVERFLOW);
2633#endif
2634
Victor Stinner9cfc0022017-12-20 19:36:46 +01002635 pymain->config._disable_importlib = 0;
Victor Stinnere32e79f2017-11-23 01:49:45 +01002636 pymain->config.install_signal_handlers = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002637}
2638
Victor Stinnera7368ac2017-11-15 18:11:45 -08002639
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002640static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01002641pymain_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002642{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002643 pymain->err = _PyRuntime_Initialize();
2644 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002645 return -1;
2646 }
2647
Victor Stinnerca719ac2017-12-20 18:00:19 +01002648 int res = pymain_read_conf(pymain, cmdline);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002649 if (res < 0) {
2650 return -1;
2651 }
2652 if (res > 0) {
2653 /* --help or --version command: we are done */
Victor Stinner19760862017-12-20 01:41:59 +01002654 return 1;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002655 }
2656
Victor Stinner94540602017-12-16 04:54:22 +01002657 if (cmdline->print_help) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002658 pymain_usage(0, pymain->config.program);
Victor Stinner19760862017-12-20 01:41:59 +01002659 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002660 }
2661
2662 if (cmdline->print_version) {
2663 printf("Python %s\n",
2664 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
Victor Stinner19760862017-12-20 01:41:59 +01002665 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002666 }
2667
Victor Stinnerc4bca952017-12-19 23:48:17 +01002668 /* For Py_GetArgcArgv(). Cleared by pymain_free(). */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002669 orig_argv = copy_wstrlist(pymain->argc, cmdline->argv);
2670 if (orig_argv == NULL) {
2671 pymain->err = _Py_INIT_NO_MEMORY();
2672 return -1;
2673 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01002674 orig_argc = pymain->argc;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002675
Victor Stinner9cfc0022017-12-20 19:36:46 +01002676 _PyInitError err = config_init_warnoptions(&pymain->config, cmdline);
2677 if (_Py_INIT_FAILED(err)) {
2678 pymain->err = err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002679 return -1;
2680 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002681 return 0;
2682}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00002683
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002684
Victor Stinnerca719ac2017-12-20 18:00:19 +01002685/* Read the configuration into _PyCoreConfig and _PyMain, initialize the
2686 LC_CTYPE locale and Py_DecodeLocale().
2687
2688 Configuration:
2689
2690 * Command line arguments
2691 * Environment variables
2692 * Py_xxx global configuration variables
2693
2694 _Py_CommandLineDetails is a temporary structure used to prioritize these
2695 variables. */
2696static int
2697pymain_cmdline(_PyMain *pymain)
2698{
Victor Stinner31e99082017-12-20 23:41:38 +01002699 /* Force default allocator, since pymain_free() and pymain_clear_config()
2700 must use the same allocator than this function. */
2701 PyMemAllocatorEx old_alloc;
2702 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2703#ifdef Py_DEBUG
2704 PyMemAllocatorEx default_alloc;
2705 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &default_alloc);
2706#endif
2707
Victor Stinnerca719ac2017-12-20 18:00:19 +01002708 _Py_CommandLineDetails cmdline;
2709 memset(&cmdline, 0, sizeof(cmdline));
2710
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002711 cmdline_get_global_config(&cmdline);
2712 _PyCoreConfig_GetGlobalConfig(&pymain->config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002713
2714 int res = pymain_cmdline_impl(pymain, &cmdline);
2715
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002716 cmdline_set_global_config(&cmdline);
2717 _PyCoreConfig_SetGlobalConfig(&pymain->config);
2718 if (Py_IsolatedFlag) {
2719 Py_IgnoreEnvironmentFlag = 1;
2720 Py_NoUserSiteDirectory = 1;
2721 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002722
2723 pymain_clear_cmdline(pymain, &cmdline);
Victor Stinner31e99082017-12-20 23:41:38 +01002724
2725#ifdef Py_DEBUG
2726 /* Make sure that PYMEM_DOMAIN_RAW has not been modified */
2727 PyMemAllocatorEx cur_alloc;
2728 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &cur_alloc);
2729 assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0);
2730#endif
2731 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002732 return res;
2733}
2734
2735
Victor Stinner94540602017-12-16 04:54:22 +01002736static int
2737pymain_main(_PyMain *pymain)
2738{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002739 pymain_init(pymain);
Victor Stinner94540602017-12-16 04:54:22 +01002740
Victor Stinnerca719ac2017-12-20 18:00:19 +01002741 int res = pymain_cmdline(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002742 if (res < 0) {
Victor Stinner94540602017-12-16 04:54:22 +01002743 _Py_FatalInitError(pymain->err);
2744 }
Victor Stinner19760862017-12-20 01:41:59 +01002745 if (res == 1) {
2746 goto done;
2747 }
2748
Victor Stinner9cfc0022017-12-20 19:36:46 +01002749 pymain_init_stdio(pymain);
2750
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002751 PyInterpreterState *interp;
2752 pymain->err = _Py_InitializeCore(&interp, &pymain->config);
2753 if (_Py_INIT_FAILED(pymain->err)) {
2754 _Py_FatalInitError(pymain->err);
Victor Stinner19760862017-12-20 01:41:59 +01002755 }
2756
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002757 if (pymain_init_python_main(pymain, interp) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01002758 _Py_FatalInitError(pymain->err);
2759 }
2760
Victor Stinner9cfc0022017-12-20 19:36:46 +01002761 if (pymain_init_sys_path(pymain) < 0) {
2762 _Py_FatalInitError(pymain->err);
2763 }
2764
Victor Stinner19760862017-12-20 01:41:59 +01002765 pymain_run_python(pymain);
2766
2767 if (Py_FinalizeEx() < 0) {
2768 /* Value unlikely to be confused with a non-error exit status or
2769 other special meaning */
2770 pymain->status = 120;
2771 }
2772
2773done:
Victor Stinner94540602017-12-16 04:54:22 +01002774 pymain_free(pymain);
2775
Victor Stinner94540602017-12-16 04:54:22 +01002776 return pymain->status;
2777}
2778
2779
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002780int
2781Py_Main(int argc, wchar_t **argv)
2782{
2783 _PyMain pymain = _PyMain_INIT;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002784 pymain.use_bytes_argv = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002785 pymain.argc = argc;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002786 pymain.wchar_argv = argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002787
Victor Stinner94540602017-12-16 04:54:22 +01002788 return pymain_main(&pymain);
Guido van Rossum667d7041995-08-04 04:20:48 +00002789}
2790
Victor Stinner94540602017-12-16 04:54:22 +01002791
2792int
2793_Py_UnixMain(int argc, char **argv)
2794{
2795 _PyMain pymain = _PyMain_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01002796 pymain.use_bytes_argv = 1;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002797 pymain.argc = argc;
Victor Stinner94540602017-12-16 04:54:22 +01002798 pymain.bytes_argv = argv;
2799
2800 return pymain_main(&pymain);
2801}
2802
2803
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002804/* this is gonna seem *real weird*, but if you put some other code between
2805 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
2806 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00002807
Guido van Rossum667d7041995-08-04 04:20:48 +00002808/* Make the *original* argc/argv available to other modules.
2809 This is rare, but it is needed by the secureware extension. */
2810
2811void
Martin v. Löwis790465f2008-04-05 20:41:37 +00002812Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00002813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 *argc = orig_argc;
2815 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00002816}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002817
2818#ifdef __cplusplus
2819}
2820#endif