blob: f0f7fe55a41cba0502ec0f27307fc93fade75705 [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
Victor Stinnerddc163d2018-09-24 05:03:01 -0700462} _PyCmdline;
Eric Snow6b4be192017-05-22 21:36:03 -0700463
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 Stinner19760862017-12-20 01:41:59 +0100484 PyObject *main_importer_path;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800485} _PyMain;
486
Victor Stinnerddc163d2018-09-24 05:03:01 -0700487#define _PyMain_INIT {.err = _Py_INIT_OK()}
Victor Stinnerd5dda982017-12-13 17:31:16 +0100488/* Note: _PyMain_INIT sets other fields to 0/NULL */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800489
490
Victor Stinner19760862017-12-20 01:41:59 +0100491/* Non-zero if filename, command (-c) or module (-m) is set
492 on the command line */
493#define RUN_CODE(pymain) \
Victor Stinnerca719ac2017-12-20 18:00:19 +0100494 (pymain->command != NULL || pymain->filename != NULL \
495 || pymain->module != NULL)
Victor Stinner19760862017-12-20 01:41:59 +0100496
497
Victor Stinnerca719ac2017-12-20 18:00:19 +0100498static wchar_t*
499pymain_wstrdup(_PyMain *pymain, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800500{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100501 wchar_t *str2 = _PyMem_RawWcsdup(str);
502 if (str2 == NULL) {
503 pymain->err = _Py_INIT_NO_MEMORY();
504 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800505 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100506 return str2;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800507}
508
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100509
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800510static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100511clear_wstrlist(int len, wchar_t **list)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800512{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100513 for (int i=0; i < len; i++) {
514 PyMem_RawFree(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100515 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100516 PyMem_RawFree(list);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100517}
518
519
520static int
Victor Stinnerddc163d2018-09-24 05:03:01 -0700521pymain_init_cmdline_argv(_PyMain *pymain, _PyCoreConfig *config,
522 _PyCmdline *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100523{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100524 assert(cmdline->argv == NULL);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100525
Victor Stinnerca719ac2017-12-20 18:00:19 +0100526 if (pymain->use_bytes_argv) {
527 /* +1 for a the NULL terminator */
528 size_t size = sizeof(wchar_t*) * (pymain->argc + 1);
529 wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size);
530 if (argv == NULL) {
531 pymain->err = _Py_INIT_NO_MEMORY();
532 return -1;
533 }
534
535 for (int i = 0; i < pymain->argc; i++) {
536 size_t len;
537 wchar_t *arg = Py_DecodeLocale(pymain->bytes_argv[i], &len);
538 if (arg == NULL) {
539 clear_wstrlist(i, argv);
540 pymain->err = DECODE_LOCALE_ERR("command line arguments",
541 (Py_ssize_t)len);
542 return -1;
543 }
544 argv[i] = arg;
545 }
546 argv[pymain->argc] = NULL;
547
548 cmdline->argv = argv;
549 }
550 else {
551 cmdline->argv = pymain->wchar_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100552 }
553
Victor Stinnerca719ac2017-12-20 18:00:19 +0100554 wchar_t *program;
555 if (pymain->argc >= 1 && cmdline->argv != NULL) {
556 program = cmdline->argv[0];
557 }
558 else {
559 program = L"";
560 }
Victor Stinnerddc163d2018-09-24 05:03:01 -0700561 config->program = pymain_wstrdup(pymain, program);
562 if (config->program == NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100563 return -1;
564 }
565
Victor Stinnerc4bca952017-12-19 23:48:17 +0100566 return 0;
567}
568
569
570static void
Victor Stinnerddc163d2018-09-24 05:03:01 -0700571pymain_clear_cmdline(_PyMain *pymain, _PyCmdline *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100572{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100573 PyMemAllocatorEx old_alloc;
574 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100575
Victor Stinnerca719ac2017-12-20 18:00:19 +0100576 clear_wstrlist(cmdline->nwarnoption, cmdline->warnoptions);
577 cmdline->nwarnoption = 0;
578 cmdline->warnoptions = NULL;
579
580 clear_wstrlist(cmdline->nenv_warnoption, cmdline->env_warnoptions);
581 cmdline->nenv_warnoption = 0;
582 cmdline->env_warnoptions = NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100583
584 if (pymain->use_bytes_argv && cmdline->argv != NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100585 clear_wstrlist(pymain->argc, cmdline->argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100586 }
587 cmdline->argv = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100588
589 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
590}
591
592
593static void
594pymain_clear_pymain(_PyMain *pymain)
595{
596#define CLEAR(ATTR) \
597 do { \
598 PyMem_RawFree(ATTR); \
599 ATTR = NULL; \
600 } while (0)
601
602 CLEAR(pymain->filename);
603 CLEAR(pymain->command);
604 CLEAR(pymain->module);
605#undef CLEAR
Victor Stinnerc4bca952017-12-19 23:48:17 +0100606}
607
Victor Stinnerc4bca952017-12-19 23:48:17 +0100608static void
Victor Stinnerddc163d2018-09-24 05:03:01 -0700609pymain_clear_config(_PyCoreConfig *config)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100610{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100611 /* Clear core config with the memory allocator
612 used by pymain_read_conf() */
613 PyMemAllocatorEx old_alloc;
614 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
615
Victor Stinnerddc163d2018-09-24 05:03:01 -0700616 _PyCoreConfig_Clear(config);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100617
618 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
619}
620
621
622static void
623pymain_free_python(_PyMain *pymain)
624{
625 Py_CLEAR(pymain->main_importer_path);
Victor Stinnerd4341102017-11-23 00:12:09 +0100626
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800627#ifdef __INSURE__
628 /* Insure++ is a memory analysis tool that aids in discovering
629 * memory leaks and other memory problems. On Python exit, the
630 * interned string dictionaries are flagged as being in use at exit
631 * (which it is). Under normal circumstances, this is fine because
632 * the memory will be automatically reclaimed by the system. Under
633 * memory debugging, it's a huge source of useless noise, so we
634 * trade off slower shutdown for less distraction in the memory
635 * reports. -baw
636 */
637 _Py_ReleaseInternedUnicodeStrings();
638#endif /* __INSURE__ */
639}
640
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100641
642static void
Victor Stinnerc4bca952017-12-19 23:48:17 +0100643pymain_free_raw(_PyMain *pymain)
Victor Stinner94540602017-12-16 04:54:22 +0100644{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100645 _PyImport_Fini2();
Victor Stinner94540602017-12-16 04:54:22 +0100646
Victor Stinnerc4bca952017-12-19 23:48:17 +0100647 /* Free global variables which cannot be freed in Py_Finalize():
648 configuration options set before Py_Initialize() which should
649 remain valid after Py_Finalize(), since
650 Py_Initialize()-Py_Finalize() can be called multiple times. */
651 _PyPathConfig_Clear(&_Py_path_config);
Victor Stinner94540602017-12-16 04:54:22 +0100652
Victor Stinnerc4bca952017-12-19 23:48:17 +0100653 /* Force the allocator used by pymain_read_conf() */
654 PyMemAllocatorEx old_alloc;
655 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner94540602017-12-16 04:54:22 +0100656
Victor Stinnerca719ac2017-12-20 18:00:19 +0100657 pymain_clear_pymain(pymain);
658
659 clear_wstrlist(orig_argc, orig_argv);
660 orig_argc = 0;
661 orig_argv = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100662
Victor Stinnerc4bca952017-12-19 23:48:17 +0100663 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100664}
665
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100666
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800667static void
668pymain_free(_PyMain *pymain)
669{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100670 pymain_free_python(pymain);
671 pymain_free_raw(pymain);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800672}
673
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100674
Eric Snow6b4be192017-05-22 21:36:03 -0700675static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800676pymain_run_main_from_importer(_PyMain *pymain)
Guido van Rossum667d7041995-08-04 04:20:48 +0000677{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800678 /* Assume sys_path0 has already been checked by pymain_get_importer(),
679 * so put it in sys.path[0] and import __main__ */
Victor Stinner11a247d2017-12-13 21:05:57 +0100680 PyObject *sys_path = PySys_GetObject("path");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800681 if (sys_path == NULL) {
682 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
683 goto error;
684 }
685
Victor Stinner11a247d2017-12-13 21:05:57 +0100686 if (PyList_Insert(sys_path, 0, pymain->main_importer_path)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800687 goto error;
688 }
689
Victor Stinner11a247d2017-12-13 21:05:57 +0100690 int sts = pymain_run_module(L"__main__", 0);
691 return (sts != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800692
693error:
694 Py_CLEAR(pymain->main_importer_path);
695 PyErr_Print();
696 return 1;
697}
698
699
Victor Stinner9cfc0022017-12-20 19:36:46 +0100700static _PyInitError
701wstrlist_append(int *len, wchar_t ***list, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800702{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100703 wchar_t *str2 = _PyMem_RawWcsdup(str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800704 if (str2 == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100705 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800706 }
707
Victor Stinnerca719ac2017-12-20 18:00:19 +0100708 size_t size = (*len + 1) * sizeof(list[0]);
709 wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size);
710 if (list2 == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800711 PyMem_RawFree(str2);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100712 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800713 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100714 list2[*len] = str2;
715 *list = list2;
716 (*len)++;
Victor Stinner9cfc0022017-12-20 19:36:46 +0100717 return _Py_INIT_OK();
718}
719
720
721static int
722pymain_wstrlist_append(_PyMain *pymain, int *len, wchar_t ***list, const wchar_t *str)
723{
724 _PyInitError err = wstrlist_append(len, list, str);
725 if (_Py_INIT_FAILED(err)) {
726 pymain->err = err;
727 return -1;
728 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800729 return 0;
730}
731
732
733/* Parse the command line arguments
734 Return 0 on success.
735 Return 1 if parsing failed.
736 Set pymain->err and return -1 on other errors. */
737static int
Victor Stinnerddc163d2018-09-24 05:03:01 -0700738pymain_parse_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config,
739 _PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800740{
Antoine Pitrou86838b02012-02-21 19:03:47 +0100741 _PyOS_ResetGetOpt();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800742 do {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800743 int longindex = -1;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100744 int c = _PyOS_GetOpt(pymain->argc, cmdline->argv, PROGRAM_OPTS,
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800745 longoptions, &longindex);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800746 if (c == EOF) {
747 break;
748 }
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 if (c == 'c') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 /* -c is the last option; following arguments
752 that look like options are left for the
753 command to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800754 size_t len = wcslen(_PyOS_optarg) + 1 + 1;
755 wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
756 if (command == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100757 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800758 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800759 }
Miss Islington (bot)c6de46e2018-05-31 06:43:21 -0700760 memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 command[len - 2] = '\n';
762 command[len - 1] = 0;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100763 pymain->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 break;
765 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 if (c == 'm') {
768 /* -m is the last option; following arguments
769 that look like options are left for the
770 module to interpret. */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100771 pymain->module = pymain_wstrdup(pymain, _PyOS_optarg);
772 if (pymain->module == NULL) {
773 return -1;
774 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 break;
776 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 switch (c) {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800779 case 0:
780 // Handle long option.
781 assert(longindex == 0); // Only one long option now.
782 if (!wcscmp(_PyOS_optarg, L"always")) {
783 cmdline->check_hash_pycs_mode = "always";
784 } else if (!wcscmp(_PyOS_optarg, L"never")) {
785 cmdline->check_hash_pycs_mode = "never";
786 } else if (!wcscmp(_PyOS_optarg, L"default")) {
787 cmdline->check_hash_pycs_mode = "default";
788 } else {
789 fprintf(stderr, "--check-hash-based-pycs must be one of "
790 "'default', 'always', or 'never'\n");
791 return 1;
792 }
793 break;
794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700796 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700800 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700804 cmdline->inspect++;
805 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000807
Christian Heimesad73a9c2013-08-10 16:36:18 +0200808 case 'I':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100809 config->ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700810 cmdline->isolated++;
811 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200812 break;
813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700817 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700821 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700825 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700829 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 case 'E':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100833 config->ignore_environment++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 case 't':
837 /* ignored for backwards compatibility */
838 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700841 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700845 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 case 'x':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100849 pymain->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 case 'h':
853 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700854 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700858 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 case 'W':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100862 if (pymain_wstrlist_append(pymain,
863 &cmdline->nwarnoption,
864 &cmdline->warnoptions,
865 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800866 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000869
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000870 case 'X':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100871 if (pymain_wstrlist_append(pymain,
Victor Stinner9cfc0022017-12-20 19:36:46 +0100872 &config->nxoption,
873 &config->xoptions,
Victor Stinnerca719ac2017-12-20 18:00:19 +0100874 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800875 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800876 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000877 break;
878
Georg Brandl9d871192010-12-04 10:47:18 +0000879 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700880 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000881 break;
882
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100883 case 'R':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100884 config->use_hash_seed = 0;
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100885 break;
886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 default:
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800890 /* unknown argument: parsing failed */
891 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800893 } while (1);
894
Victor Stinnerca719ac2017-12-20 18:00:19 +0100895 if (pymain->command == NULL && pymain->module == NULL
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800896 && _PyOS_optind < pymain->argc
Victor Stinnerc4bca952017-12-19 23:48:17 +0100897 && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800898 {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100899 pymain->filename = pymain_wstrdup(pymain, cmdline->argv[_PyOS_optind]);
900 if (pymain->filename == NULL) {
901 return -1;
902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000904
Victor Stinnerd5dda982017-12-13 17:31:16 +0100905 /* -c and -m options are exclusive */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100906 assert(!(pymain->command != NULL && pymain->module != NULL));
Victor Stinnerd5dda982017-12-13 17:31:16 +0100907
Eric Snow6b4be192017-05-22 21:36:03 -0700908 return 0;
909}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000910
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800911
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800912static int
Victor Stinner9cfc0022017-12-20 19:36:46 +0100913add_xoption(PyObject *opts, const wchar_t *s)
Victor Stinner374c6e12017-12-14 12:05:26 +0100914{
915 PyObject *name, *value;
916
917 const wchar_t *name_end = wcschr(s, L'=');
918 if (!name_end) {
919 name = PyUnicode_FromWideChar(s, -1);
920 value = Py_True;
921 Py_INCREF(value);
922 }
923 else {
924 name = PyUnicode_FromWideChar(s, name_end - s);
925 value = PyUnicode_FromWideChar(name_end + 1, -1);
926 }
927 if (name == NULL || value == NULL) {
928 goto error;
929 }
930 if (PyDict_SetItem(opts, name, value) < 0) {
931 goto error;
932 }
933 Py_DECREF(name);
934 Py_DECREF(value);
935 return 0;
936
937error:
938 Py_XDECREF(name);
939 Py_XDECREF(value);
940 return -1;
941}
942
Victor Stinner9cfc0022017-12-20 19:36:46 +0100943
944static PyObject*
945config_create_xoptions_dict(const _PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800946{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100947 int nxoption = config->nxoption;
948 wchar_t **xoptions = config->xoptions;
Victor Stinner374c6e12017-12-14 12:05:26 +0100949 PyObject *dict = PyDict_New();
950 if (dict == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100951 return NULL;
Victor Stinner374c6e12017-12-14 12:05:26 +0100952 }
953
Victor Stinnerca719ac2017-12-20 18:00:19 +0100954 for (int i=0; i < nxoption; i++) {
955 wchar_t *option = xoptions[i];
Victor Stinner9cfc0022017-12-20 19:36:46 +0100956 if (add_xoption(dict, option) < 0) {
Victor Stinner374c6e12017-12-14 12:05:26 +0100957 Py_DECREF(dict);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100958 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800959 }
960 }
Victor Stinner374c6e12017-12-14 12:05:26 +0100961
Victor Stinner9cfc0022017-12-20 19:36:46 +0100962 return dict;
Eric Snow6b4be192017-05-22 21:36:03 -0700963}
964
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800965
Victor Stinner9cfc0022017-12-20 19:36:46 +0100966static _PyInitError
967config_add_warnings_optlist(_PyCoreConfig *config, int len, wchar_t **options)
Eric Snow6b4be192017-05-22 21:36:03 -0700968{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100969 for (int i = 0; i < len; i++) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100970 _PyInitError err = wstrlist_append(&config->nwarnoption,
971 &config->warnoptions,
972 options[i]);
973 if (_Py_INIT_FAILED(err)) {
974 return err;
Eric Snow6b4be192017-05-22 21:36:03 -0700975 }
Eric Snow6b4be192017-05-22 21:36:03 -0700976 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100977 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800978}
Eric Snow6b4be192017-05-22 21:36:03 -0700979
Victor Stinner747f48e2017-12-12 22:59:48 +0100980
Victor Stinner9cfc0022017-12-20 19:36:46 +0100981static _PyInitError
Victor Stinnerddc163d2018-09-24 05:03:01 -0700982config_init_warnoptions(_PyCoreConfig *config, _PyCmdline *cmdline)
Victor Stinner747f48e2017-12-12 22:59:48 +0100983{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100984 _PyInitError err;
985
986 assert(config->nwarnoption == 0);
987
Victor Stinner747f48e2017-12-12 22:59:48 +0100988 /* The priority order for warnings configuration is (highest precedence
989 * first):
990 *
991 * - the BytesWarning filter, if needed ('-b', '-bb')
992 * - any '-W' command line options; then
993 * - the 'PYTHONWARNINGS' environment variable; then
994 * - the dev mode filter ('-X dev', 'PYTHONDEVMODE'); then
995 * - any implicit filters added by _warnings.c/warnings.py
996 *
997 * All settings except the last are passed to the warnings module via
998 * the `sys.warnoptions` list. Since the warnings module works on the basis
999 * of "the most recently added filter will be checked first", we add
1000 * the lowest precedence entries first so that later entries override them.
1001 */
1002
Victor Stinner9cfc0022017-12-20 19:36:46 +01001003 if (config->dev_mode) {
1004 err = wstrlist_append(&config->nwarnoption,
1005 &config->warnoptions,
1006 L"default");
1007 if (_Py_INIT_FAILED(err)) {
1008 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001009 }
Victor Stinner747f48e2017-12-12 22:59:48 +01001010 }
Victor Stinner374c6e12017-12-14 12:05:26 +01001011
Victor Stinner9cfc0022017-12-20 19:36:46 +01001012 err = config_add_warnings_optlist(config,
1013 cmdline->nenv_warnoption,
1014 cmdline->env_warnoptions);
1015 if (_Py_INIT_FAILED(err)) {
1016 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001017 }
1018
Victor Stinner9cfc0022017-12-20 19:36:46 +01001019 err = config_add_warnings_optlist(config,
1020 cmdline->nwarnoption,
1021 cmdline->warnoptions);
1022 if (_Py_INIT_FAILED(err)) {
1023 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001024 }
1025
1026 /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c
1027 * don't even try to emit a warning, so we skip setting the filter in that
1028 * case.
1029 */
1030 if (cmdline->bytes_warning) {
1031 wchar_t *filter;
1032 if (cmdline->bytes_warning> 1) {
1033 filter = L"error::BytesWarning";
1034 }
1035 else {
1036 filter = L"default::BytesWarning";
1037 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001038 err = wstrlist_append(&config->nwarnoption,
1039 &config->warnoptions,
1040 filter);
1041 if (_Py_INIT_FAILED(err)) {
1042 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001043 }
1044 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001045 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001046}
1047
1048
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001049/* Get warning options from PYTHONWARNINGS environment variable.
1050 Return 0 on success.
1051 Set pymain->err and return -1 on error. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001052static _PyInitError
Victor Stinnerddc163d2018-09-24 05:03:01 -07001053cmdline_init_env_warnoptions(_PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001054{
1055 if (Py_IgnoreEnvironmentFlag) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001056 return _Py_INIT_OK();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +00001058
Victor Stinnerca719ac2017-12-20 18:00:19 +01001059 wchar_t *env;
1060 int res = config_get_env_var_dup(&env, L"PYTHONWARNINGS", "PYTHONWARNINGS");
1061 if (res < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001062 return DECODE_LOCALE_ERR("PYTHONWARNINGS", res);
Victor Stinnerca719ac2017-12-20 18:00:19 +01001063 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001064
Victor Stinnerca719ac2017-12-20 18:00:19 +01001065 if (env == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001066 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001067 }
Philip Jenvey0805ca32010-04-07 04:04:10 +00001068
Victor Stinnerca719ac2017-12-20 18:00:19 +01001069
1070 wchar_t *warning, *context = NULL;
1071 for (warning = WCSTOK(env, L",", &context);
1072 warning != NULL;
1073 warning = WCSTOK(NULL, L",", &context))
1074 {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001075 _PyInitError err = wstrlist_append(&cmdline->nenv_warnoption,
1076 &cmdline->env_warnoptions,
1077 warning);
1078 if (_Py_INIT_FAILED(err)) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001079 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001080 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001081 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001083 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001084 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001085}
1086
1087
1088static void
1089pymain_init_stdio(_PyMain *pymain)
1090{
1091 pymain->stdin_is_interactive = (isatty(fileno(stdin))
1092 || Py_InteractiveFlag);
Guido van Rossum775af911997-02-14 19:50:32 +00001093
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00001094#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +00001095 /* don't translate newlines (\r\n <=> \n) */
1096 _setmode(fileno(stdin), O_BINARY);
1097 _setmode(fileno(stdout), O_BINARY);
1098 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +00001099#endif
Victor Stinner89e34362011-01-07 18:47:22 +00001100
1101 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +00001102#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
1104 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
1105 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001106#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 setbuf(stdin, (char *)NULL);
1108 setbuf(stdout, (char *)NULL);
1109 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001110#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 }
1112 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +00001113#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 /* Doesn't have to have line-buffered -- use unbuffered */
1115 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
1116 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001117#else /* !MS_WINDOWS */
1118#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
1120 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001121#endif /* HAVE_SETVBUF */
1122#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 /* Leave stderr alone - it should be unbuffered anyway. */
1124 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001125}
Guido van Rossum667d7041995-08-04 04:20:48 +00001126
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001127
1128/* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__
Victor Stinner31a83932017-12-04 13:39:15 +01001129 environment variables on macOS if available. */
1130static _PyInitError
Victor Stinnerca719ac2017-12-20 18:00:19 +01001131config_init_program_name(_PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001132{
Victor Stinner31a83932017-12-04 13:39:15 +01001133 assert(config->program_name == NULL);
1134
1135 /* If Py_SetProgramName() was called, use its value */
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001136 const wchar_t *program_name = _Py_path_config.program_name;
Victor Stinner31a83932017-12-04 13:39:15 +01001137 if (program_name != NULL) {
1138 config->program_name = _PyMem_RawWcsdup(program_name);
1139 if (config->program_name == NULL) {
1140 return _Py_INIT_NO_MEMORY();
1141 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001142 return _Py_INIT_OK();
Victor Stinner31a83932017-12-04 13:39:15 +01001143 }
1144
Just van Rossum2ac79ef2003-03-05 15:46:54 +00001145#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 /* On MacOS X, when the Python interpreter is embedded in an
1147 application bundle, it gets executed by a bootstrapping script
1148 that does os.execve() with an argv[0] that's different from the
1149 actual Python executable. This is needed to keep the Finder happy,
1150 or rather, to work around Apple's overly strict requirements of
1151 the process name. However, we still need a usable sys.executable,
1152 so the actual executable path is passed in an environment variable.
1153 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
1154 script. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001155 const char *p = config_get_env_var("PYTHONEXECUTABLE");
Victor Stinner6bf992a2017-12-06 17:26:10 +01001156 if (p != NULL) {
Victor Stinner31a83932017-12-04 13:39:15 +01001157 size_t len;
1158 wchar_t* program_name = Py_DecodeLocale(p, &len);
1159 if (program_name == NULL) {
1160 return DECODE_LOCALE_ERR("PYTHONEXECUTABLE environment "
1161 "variable", (Py_ssize_t)len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 }
Victor Stinner31a83932017-12-04 13:39:15 +01001163 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001164 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001165 }
Vinay Sajip90db6612012-07-17 17:33:46 +01001166#ifdef WITH_NEXT_FRAMEWORK
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001167 else {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001168 const char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
Vinay Sajip90db6612012-07-17 17:33:46 +01001169 if (pyvenv_launcher && *pyvenv_launcher) {
1170 /* Used by Mac/Tools/pythonw.c to forward
1171 * the argv0 of the stub executable
1172 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001173 size_t len;
Victor Stinner31a83932017-12-04 13:39:15 +01001174 wchar_t* program_name = Py_DecodeLocale(pyvenv_launcher, &len);
1175 if (program_name == NULL) {
1176 return DECODE_LOCALE_ERR("__PYVENV_LAUNCHER__ environment "
1177 "variable", (Py_ssize_t)len);
Vinay Sajip90db6612012-07-17 17:33:46 +01001178 }
Victor Stinner31a83932017-12-04 13:39:15 +01001179 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001180 return _Py_INIT_OK();
Vinay Sajip90db6612012-07-17 17:33:46 +01001181 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001183#endif /* WITH_NEXT_FRAMEWORK */
1184#endif /* __APPLE__ */
Victor Stinneraf5a8952017-12-02 10:11:32 +01001185
Victor Stinnerca719ac2017-12-20 18:00:19 +01001186 /* Use argv[0] by default, if available */
1187 if (config->program != NULL) {
1188 config->program_name = _PyMem_RawWcsdup(config->program);
1189 if (config->program_name == NULL) {
1190 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001191 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001192 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001193 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001194
1195 /* Last fall back: hardcoded string */
1196#ifdef MS_WINDOWS
1197 const wchar_t *default_program_name = L"python";
1198#else
1199 const wchar_t *default_program_name = L"python3";
1200#endif
1201 config->program_name = _PyMem_RawWcsdup(default_program_name);
1202 if (config->program_name == NULL) {
1203 return _Py_INIT_NO_MEMORY();
1204 }
1205 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001206}
1207
1208
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001209static void
1210pymain_header(_PyMain *pymain)
1211{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001212 if (Py_QuietFlag) {
1213 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 }
Guido van Rossum393661d2001-08-31 17:40:15 +00001215
Victor Stinner19760862017-12-20 01:41:59 +01001216 if (!Py_VerboseFlag && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001217 return;
1218 }
1219
1220 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
1221 if (!Py_NoSiteFlag) {
1222 fprintf(stderr, "%s\n", COPYRIGHT);
1223 }
1224}
1225
1226
Victor Stinnerc4bca952017-12-19 23:48:17 +01001227static wchar_t**
Victor Stinnerca719ac2017-12-20 18:00:19 +01001228copy_wstrlist(int len, wchar_t **list)
Victor Stinner11a247d2017-12-13 21:05:57 +01001229{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001230 assert((len > 0 && list != NULL) || len == 0);
1231 size_t size = len * sizeof(list[0]);
1232 wchar_t **list_copy = PyMem_RawMalloc(size);
Alexey Izbyshev388bd4b2018-08-25 19:46:58 +03001233 if (list_copy == NULL) {
1234 return NULL;
1235 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001236 for (int i=0; i < len; i++) {
1237 wchar_t* arg = _PyMem_RawWcsdup(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001238 if (arg == NULL) {
Alexey Izbyshev388bd4b2018-08-25 19:46:58 +03001239 clear_wstrlist(i, list_copy);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001240 return NULL;
1241 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001242 list_copy[i] = arg;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001243 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001244 return list_copy;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001245}
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001246
Victor Stinnerc4bca952017-12-19 23:48:17 +01001247
1248static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07001249pymain_init_core_argv(_PyMain *pymain, _PyCoreConfig *config,
1250 _PyCmdline *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001251{
Victor Stinnerc4bca952017-12-19 23:48:17 +01001252 /* Copy argv to be able to modify it (to force -c/-m) */
1253 int argc = pymain->argc - _PyOS_optind;
1254 wchar_t **argv;
1255
1256 if (argc <= 0 || cmdline->argv == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01001257 /* Ensure at least one (empty) argument is seen */
1258 static wchar_t *empty_argv[1] = {L""};
Victor Stinner11a247d2017-12-13 21:05:57 +01001259 argc = 1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001260 argv = copy_wstrlist(1, empty_argv);
Victor Stinner11a247d2017-12-13 21:05:57 +01001261 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01001262 else {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001263 argv = copy_wstrlist(argc, &cmdline->argv[_PyOS_optind]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001264 }
1265
1266 if (argv == NULL) {
1267 pymain->err = _Py_INIT_NO_MEMORY();
1268 return -1;
1269 }
1270
1271 wchar_t *arg0 = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001272 if (pymain->command != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001273 /* Force sys.argv[0] = '-c' */
1274 arg0 = L"-c";
1275 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001276 else if (pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001277 /* Force sys.argv[0] = '-m'*/
1278 arg0 = L"-m";
1279 }
1280 if (arg0 != NULL) {
1281 arg0 = _PyMem_RawWcsdup(arg0);
1282 if (arg0 == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001283 clear_wstrlist(argc, argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001284 pymain->err = _Py_INIT_NO_MEMORY();
1285 return -1;
1286 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001287
1288 assert(argc >= 1);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001289 PyMem_RawFree(argv[0]);
1290 argv[0] = arg0;
1291 }
1292
Victor Stinnerddc163d2018-09-24 05:03:01 -07001293 config->argc = argc;
1294 config->argv = argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001295 return 0;
1296}
1297
1298
Victor Stinner8ded5b82018-01-24 17:03:28 +01001299static PyObject*
Victor Stinner35c28d52018-11-14 02:01:52 +01001300_Py_wstrlist_as_pylist(int len, wchar_t **list)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001301{
Victor Stinner8ded5b82018-01-24 17:03:28 +01001302 assert(list != NULL || len < 1);
1303
1304 PyObject *pylist = PyList_New(len);
1305 if (pylist == NULL) {
1306 return NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001307 }
1308
Victor Stinner8ded5b82018-01-24 17:03:28 +01001309 for (int i = 0; i < len; i++) {
1310 PyObject *v = PyUnicode_FromWideChar(list[i], -1);
Victor Stinner11a247d2017-12-13 21:05:57 +01001311 if (v == NULL) {
Victor Stinner8ded5b82018-01-24 17:03:28 +01001312 Py_DECREF(pylist);
1313 return NULL;
Victor Stinner11a247d2017-12-13 21:05:57 +01001314 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001315 PyList_SET_ITEM(pylist, i, v);
Victor Stinner11a247d2017-12-13 21:05:57 +01001316 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001317 return pylist;
Victor Stinner11a247d2017-12-13 21:05:57 +01001318}
1319
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001320
Victor Stinner11a247d2017-12-13 21:05:57 +01001321static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07001322pymain_compute_path0(_PyMain *pymain, _PyCoreConfig *config, PyObject **path0)
Victor Stinner11a247d2017-12-13 21:05:57 +01001323{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001324 if (pymain->main_importer_path != NULL) {
1325 /* Let pymain_run_main_from_importer() adjust sys.path[0] later */
Victor Stinner19760862017-12-20 01:41:59 +01001326 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001327 return 0;
1328 }
1329
1330 if (Py_IsolatedFlag) {
Victor Stinner19760862017-12-20 01:41:59 +01001331 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001332 return 0;
1333 }
1334
Victor Stinnerddc163d2018-09-24 05:03:01 -07001335 *path0 = _PyPathConfig_ComputeArgv0(config->argc, config->argv);
Victor Stinner19760862017-12-20 01:41:59 +01001336 if (*path0 == NULL) {
1337 pymain->err = _Py_INIT_NO_MEMORY();
1338 return -1;
1339 }
1340 return 0;
1341}
1342
1343
1344static int
1345pymain_update_sys_path(_PyMain *pymain, PyObject *path0)
1346{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001347 /* Prepend argv[0] to sys.path.
1348 If argv[0] is a symlink, use the real path. */
1349 PyObject *sys_path = PySys_GetObject("path");
1350 if (sys_path == NULL) {
1351 pymain->err = _Py_INIT_ERR("can't get sys.path");
Victor Stinnerd5dda982017-12-13 17:31:16 +01001352 return -1;
1353 }
1354
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001355 /* Prepend path0 to sys.path */
1356 if (PyList_Insert(sys_path, 0, path0) < 0) {
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001357 pymain->err = _Py_INIT_ERR("sys.path.insert(0, path0) failed");
1358 return -1;
1359 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01001360 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001361}
1362
1363
Victor Stinner35c28d52018-11-14 02:01:52 +01001364PyObject *
1365_Py_GetGlobalVariablesAsDict(void)
1366{
1367 PyObject *dict, *obj;
1368
1369 dict = PyDict_New();
1370 if (dict == NULL) {
1371 return NULL;
1372 }
1373
1374#define SET_ITEM(KEY, EXPR) \
1375 do { \
1376 obj = (EXPR); \
1377 if (obj == NULL) { \
1378 return NULL; \
1379 } \
1380 int res = PyDict_SetItemString(dict, (KEY), obj); \
1381 Py_DECREF(obj); \
1382 if (res < 0) { \
1383 goto fail; \
1384 } \
1385 } while (0)
1386#define SET_ITEM_INT(VAR) \
1387 SET_ITEM(#VAR, PyLong_FromLong(VAR))
1388#define FROM_STRING(STR) \
1389 ((STR != NULL) ? \
1390 PyUnicode_FromString(STR) \
1391 : (Py_INCREF(Py_None), Py_None))
1392#define SET_ITEM_STR(VAR) \
1393 SET_ITEM(#VAR, FROM_STRING(VAR))
1394
1395 SET_ITEM_STR(Py_FileSystemDefaultEncoding);
1396 SET_ITEM_INT(Py_HasFileSystemDefaultEncoding);
1397 SET_ITEM_STR(Py_FileSystemDefaultEncodeErrors);
1398
1399 SET_ITEM_INT(Py_UTF8Mode);
1400 SET_ITEM_INT(Py_DebugFlag);
1401 SET_ITEM_INT(Py_VerboseFlag);
1402 SET_ITEM_INT(Py_QuietFlag);
1403 SET_ITEM_INT(Py_InteractiveFlag);
1404 SET_ITEM_INT(Py_InspectFlag);
1405
1406 SET_ITEM_INT(Py_OptimizeFlag);
1407 SET_ITEM_INT(Py_NoSiteFlag);
1408 SET_ITEM_INT(Py_BytesWarningFlag);
1409 SET_ITEM_INT(Py_FrozenFlag);
1410 SET_ITEM_INT(Py_IgnoreEnvironmentFlag);
1411 SET_ITEM_INT(Py_DontWriteBytecodeFlag);
1412 SET_ITEM_INT(Py_NoUserSiteDirectory);
1413 SET_ITEM_INT(Py_UnbufferedStdioFlag);
1414 SET_ITEM_INT(Py_HashRandomizationFlag);
1415 SET_ITEM_INT(Py_IsolatedFlag);
1416
1417#ifdef MS_WINDOWS
1418 SET_ITEM_INT(Py_LegacyWindowsFSEncodingFlag);
1419 SET_ITEM_INT(Py_LegacyWindowsStdioFlag);
1420#endif
1421
1422 return dict;
1423
1424fail:
1425 Py_DECREF(dict);
1426 return NULL;
1427
1428#undef FROM_STRING
1429#undef SET_ITEM
1430#undef SET_ITEM_INT
1431#undef SET_ITEM_STR
1432}
1433
1434
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001435void
1436_PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
1437{
1438#define COPY_FLAG(ATTR, VALUE) \
1439 if (config->ATTR == -1) { \
1440 config->ATTR = VALUE; \
1441 }
1442
1443 COPY_FLAG(ignore_environment, Py_IgnoreEnvironmentFlag);
1444 COPY_FLAG(utf8_mode, Py_UTF8Mode);
1445
1446#undef COPY_FLAG
1447}
1448
1449
Victor Stinner6bf992a2017-12-06 17:26:10 +01001450/* Get Py_xxx global configuration variables */
1451static void
Victor Stinnerddc163d2018-09-24 05:03:01 -07001452cmdline_get_global_config(_PyCmdline *cmdline)
Victor Stinner6bf992a2017-12-06 17:26:10 +01001453{
Victor Stinner91106cd2017-12-13 12:29:09 +01001454 cmdline->bytes_warning = Py_BytesWarningFlag;
1455 cmdline->debug = Py_DebugFlag;
1456 cmdline->inspect = Py_InspectFlag;
1457 cmdline->interactive = Py_InteractiveFlag;
1458 cmdline->isolated = Py_IsolatedFlag;
1459 cmdline->optimization_level = Py_OptimizeFlag;
1460 cmdline->dont_write_bytecode = Py_DontWriteBytecodeFlag;
1461 cmdline->no_user_site_directory = Py_NoUserSiteDirectory;
1462 cmdline->no_site_import = Py_NoSiteFlag;
1463 cmdline->use_unbuffered_io = Py_UnbufferedStdioFlag;
1464 cmdline->verbosity = Py_VerboseFlag;
1465 cmdline->quiet_flag = Py_QuietFlag;
1466#ifdef MS_WINDOWS
1467 cmdline->legacy_windows_fs_encoding = Py_LegacyWindowsFSEncodingFlag;
1468 cmdline->legacy_windows_stdio = Py_LegacyWindowsStdioFlag;
1469#endif
1470 cmdline->check_hash_pycs_mode = _Py_CheckHashBasedPycsMode ;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001471}
Victor Stinner91106cd2017-12-13 12:29:09 +01001472
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001473
1474void
1475_PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config)
1476{
1477 Py_IgnoreEnvironmentFlag = config->ignore_environment;
1478 Py_UTF8Mode = config->utf8_mode;
1479
1480 /* Random or non-zero hash seed */
1481 Py_HashRandomizationFlag = (config->use_hash_seed == 0 ||
1482 config->hash_seed != 0);
Victor Stinner6bf992a2017-12-06 17:26:10 +01001483}
1484
1485
Victor Stinner19760862017-12-20 01:41:59 +01001486/* Set Py_xxx global configuration variables */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001487static void
Victor Stinnerddc163d2018-09-24 05:03:01 -07001488cmdline_set_global_config(_PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001489{
Victor Stinner91106cd2017-12-13 12:29:09 +01001490 Py_BytesWarningFlag = cmdline->bytes_warning;
1491 Py_DebugFlag = cmdline->debug;
1492 Py_InspectFlag = cmdline->inspect;
1493 Py_InteractiveFlag = cmdline->interactive;
1494 Py_IsolatedFlag = cmdline->isolated;
1495 Py_OptimizeFlag = cmdline->optimization_level;
1496 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
1497 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
1498 Py_NoSiteFlag = cmdline->no_site_import;
1499 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
1500 Py_VerboseFlag = cmdline->verbosity;
1501 Py_QuietFlag = cmdline->quiet_flag;
1502 _Py_CheckHashBasedPycsMode = cmdline->check_hash_pycs_mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001503#ifdef MS_WINDOWS
Victor Stinner91106cd2017-12-13 12:29:09 +01001504 Py_LegacyWindowsFSEncodingFlag = cmdline->legacy_windows_fs_encoding;
1505 Py_LegacyWindowsStdioFlag = cmdline->legacy_windows_stdio;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001506#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001507}
1508
1509
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001510static void
1511pymain_import_readline(_PyMain *pymain)
1512{
1513 if (Py_IsolatedFlag) {
1514 return;
1515 }
Victor Stinner19760862017-12-20 01:41:59 +01001516 if (!Py_InspectFlag && RUN_CODE(pymain)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001517 return;
1518 }
1519 if (!isatty(fileno(stdin))) {
1520 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001521 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001522
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001523 PyObject *mod = PyImport_ImportModule("readline");
1524 if (mod == NULL) {
1525 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 }
1527 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001528 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001530}
1531
1532
1533static FILE*
1534pymain_open_filename(_PyMain *pymain)
1535{
Victor Stinnerddc163d2018-09-24 05:03:01 -07001536 const _PyCoreConfig *config = &_PyGILState_GetInterpreterStateUnsafe()->core_config;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001537 FILE* fp;
1538
Victor Stinnerca719ac2017-12-20 18:00:19 +01001539 fp = _Py_wfopen(pymain->filename, L"r");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001540 if (fp == NULL) {
1541 char *cfilename_buffer;
1542 const char *cfilename;
1543 int err = errno;
Victor Stinner9dd76202017-12-21 16:20:32 +01001544 cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001545 if (cfilename_buffer != NULL)
1546 cfilename = cfilename_buffer;
1547 else
1548 cfilename = "<unprintable file name>";
1549 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Victor Stinnerddc163d2018-09-24 05:03:01 -07001550 config->program, cfilename, err, strerror(err));
Victor Stinner9dd76202017-12-21 16:20:32 +01001551 PyMem_RawFree(cfilename_buffer);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001552 pymain->status = 2;
1553 return NULL;
1554 }
1555
Victor Stinnerca719ac2017-12-20 18:00:19 +01001556 if (pymain->skip_first_line) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001557 int ch;
1558 /* Push back first newline so line numbers
1559 remain the same */
1560 while ((ch = getc(fp)) != EOF) {
1561 if (ch == '\n') {
1562 (void)ungetc(ch, fp);
1563 break;
1564 }
1565 }
1566 }
1567
1568 struct _Py_stat_struct sb;
1569 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1570 S_ISDIR(sb.st_mode)) {
1571 fprintf(stderr,
1572 "%ls: '%ls' is a directory, cannot continue\n",
Victor Stinnerddc163d2018-09-24 05:03:01 -07001573 config->program, pymain->filename);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001574 fclose(fp);
1575 pymain->status = 1;
1576 return NULL;
1577 }
1578
1579 return fp;
1580}
1581
1582
1583static void
Victor Stinner19760862017-12-20 01:41:59 +01001584pymain_run_filename(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001585{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001586 if (pymain->filename == NULL && pymain->stdin_is_interactive) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001587 Py_InspectFlag = 0; /* do exit on SystemExit */
Victor Stinner19760862017-12-20 01:41:59 +01001588 pymain_run_startup(cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001589 pymain_run_interactive_hook();
1590 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001591
1592 if (pymain->main_importer_path != NULL) {
1593 pymain->status = pymain_run_main_from_importer(pymain);
1594 return;
1595 }
1596
1597 FILE *fp;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001598 if (pymain->filename != NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001599 fp = pymain_open_filename(pymain);
1600 if (fp == NULL) {
1601 return;
1602 }
1603 }
1604 else {
1605 fp = stdin;
1606 }
1607
Victor Stinnerca719ac2017-12-20 18:00:19 +01001608 pymain->status = pymain_run_file(fp, pymain->filename, cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001609}
1610
1611
1612static void
Victor Stinner19760862017-12-20 01:41:59 +01001613pymain_repl(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001616 opportunity to set it from Python. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001617 if (!Py_InspectFlag && config_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 Py_InspectFlag = 1;
1619 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001620
Victor Stinner19760862017-12-20 01:41:59 +01001621 if (!(Py_InspectFlag && pymain->stdin_is_interactive && RUN_CODE(pymain))) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001622 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001624
1625 Py_InspectFlag = 0;
1626 pymain_run_interactive_hook();
Victor Stinner33c377e2017-12-05 15:12:41 +01001627
Victor Stinner19760862017-12-20 01:41:59 +01001628 int res = PyRun_AnyFileFlags(stdin, "<stdin>", cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001629 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001630}
1631
1632
1633/* Parse the command line.
1634 Handle --version and --help options directly.
1635
1636 Return 1 if Python must exit.
1637 Return 0 on success.
1638 Set pymain->err and return -1 on failure. */
1639static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07001640pymain_parse_cmdline(_PyMain *pymain, _PyCoreConfig *config,
1641 _PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001642{
Victor Stinnerddc163d2018-09-24 05:03:01 -07001643 int res = pymain_parse_cmdline_impl(pymain, config, cmdline);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001644 if (res < 0) {
1645 return -1;
1646 }
1647 if (res) {
Victor Stinnerddc163d2018-09-24 05:03:01 -07001648 pymain_usage(1, config->program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001649 pymain->status = 2;
1650 return 1;
1651 }
1652
Victor Stinnerca719ac2017-12-20 18:00:19 +01001653 if (pymain->command != NULL || pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001654 /* Backup _PyOS_optind */
1655 _PyOS_optind--;
1656 }
1657
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001658 return 0;
1659}
1660
1661
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001662static const wchar_t*
Victor Stinner9cfc0022017-12-20 19:36:46 +01001663config_get_xoption(_PyCoreConfig *config, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001664{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001665 int nxoption = config->nxoption;
1666 wchar_t **xoptions = config->xoptions;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001667 for (int i=0; i < nxoption; i++) {
1668 wchar_t *option = xoptions[i];
Victor Stinnera7368ac2017-11-15 18:11:45 -08001669 size_t len;
1670 wchar_t *sep = wcschr(option, L'=');
1671 if (sep != NULL) {
1672 len = (sep - option);
1673 }
1674 else {
1675 len = wcslen(option);
1676 }
1677 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1678 return option;
1679 }
1680 }
1681 return NULL;
1682}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001683
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001684
Victor Stinnera7368ac2017-11-15 18:11:45 -08001685static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001686pymain_str_to_int(const char *str, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001687{
1688 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001689 const char *endptr = str;
1690 long value = strtol(str, (char **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001691 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001692 return -1;
1693 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001694 if (value < INT_MIN || value > INT_MAX) {
1695 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001696 }
1697
Victor Stinnera7368ac2017-11-15 18:11:45 -08001698 *result = (int)value;
1699 return 0;
1700}
1701
1702
1703static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001704pymain_wstr_to_int(const wchar_t *wstr, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001705{
1706 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001707 const wchar_t *endptr = wstr;
1708 long value = wcstol(wstr, (wchar_t **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001709 if (*endptr != '\0' || errno == ERANGE) {
1710 return -1;
1711 }
1712 if (value < INT_MIN || value > INT_MAX) {
1713 return -1;
1714 }
1715
1716 *result = (int)value;
1717 return 0;
1718}
1719
1720
Victor Stinner9cfc0022017-12-20 19:36:46 +01001721static _PyInitError
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001722config_init_tracemalloc(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001723{
1724 int nframe;
1725 int valid;
1726
Victor Stinner9cfc0022017-12-20 19:36:46 +01001727 const char *env = config_get_env_var("PYTHONTRACEMALLOC");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001728 if (env) {
1729 if (!pymain_str_to_int(env, &nframe)) {
1730 valid = (nframe >= 1);
1731 }
1732 else {
1733 valid = 0;
1734 }
1735 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001736 return _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid number "
1737 "of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001738 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001739 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001740 }
1741
Victor Stinner9cfc0022017-12-20 19:36:46 +01001742 const wchar_t *xoption = config_get_xoption(config, L"tracemalloc");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001743 if (xoption) {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001744 const wchar_t *sep = wcschr(xoption, L'=');
Victor Stinnera7368ac2017-11-15 18:11:45 -08001745 if (sep) {
1746 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1747 valid = (nframe >= 1);
1748 }
1749 else {
1750 valid = 0;
1751 }
1752 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001753 return _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1754 "invalid number of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001755 }
1756 }
1757 else {
1758 /* -X tracemalloc behaves as -X tracemalloc=1 */
1759 nframe = 1;
1760 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001761 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001762 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001763 return _Py_INIT_OK();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001764}
1765
1766
1767static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001768get_env_flag(int *flag, const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001769{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001770 const char *var = config_get_env_var(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001771 if (!var) {
1772 return;
1773 }
1774 int value;
1775 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1776 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1777 value = 1;
1778 }
1779 if (*flag < value) {
1780 *flag = value;
1781 }
1782}
1783
1784
1785static void
Victor Stinnerddc163d2018-09-24 05:03:01 -07001786cmdline_get_env_flags(_PyCmdline *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001787{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001788 get_env_flag(&cmdline->debug, "PYTHONDEBUG");
1789 get_env_flag(&cmdline->verbosity, "PYTHONVERBOSE");
1790 get_env_flag(&cmdline->optimization_level, "PYTHONOPTIMIZE");
1791 get_env_flag(&cmdline->inspect, "PYTHONINSPECT");
1792 get_env_flag(&cmdline->dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
1793 get_env_flag(&cmdline->no_user_site_directory, "PYTHONNOUSERSITE");
1794 get_env_flag(&cmdline->use_unbuffered_io, "PYTHONUNBUFFERED");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001795#ifdef MS_WINDOWS
Victor Stinner9cfc0022017-12-20 19:36:46 +01001796 get_env_flag(&cmdline->legacy_windows_fs_encoding,
1797 "PYTHONLEGACYWINDOWSFSENCODING");
1798 get_env_flag(&cmdline->legacy_windows_stdio,
1799 "PYTHONLEGACYWINDOWSSTDIO");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001800#endif
1801}
1802
1803
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001804/* Set global variable variables from environment variables */
1805void
1806_Py_Initialize_ReadEnvVarsNoAlloc(void)
1807{
Victor Stinnerddc163d2018-09-24 05:03:01 -07001808 _PyCmdline cmdline;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001809 memset(&cmdline, 0, sizeof(cmdline));
1810
1811 cmdline_get_global_config(&cmdline);
1812 if (cmdline.isolated) {
1813 Py_IgnoreEnvironmentFlag = 1;
1814 cmdline.no_user_site_directory = 1;
1815 }
1816 if (!Py_IgnoreEnvironmentFlag) {
1817 cmdline_get_env_flags(&cmdline);
1818 }
1819 cmdline_set_global_config(&cmdline);
1820
1821 /* no need to call pymain_clear_cmdline(), no memory has been allocated */
1822}
1823
1824
Victor Stinner46972b72017-11-24 22:55:40 +01001825static _PyInitError
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001826config_init_home(_PyCoreConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001827{
1828 wchar_t *home;
1829
Victor Stinner31a83932017-12-04 13:39:15 +01001830 /* If Py_SetPythonHome() was called, use its value */
1831 home = _Py_path_config.home;
Victor Stinner1f151112017-11-23 10:43:14 +01001832 if (home) {
Victor Stinner46972b72017-11-24 22:55:40 +01001833 config->home = _PyMem_RawWcsdup(home);
1834 if (config->home == NULL) {
1835 return _Py_INIT_NO_MEMORY();
Victor Stinner1f151112017-11-23 10:43:14 +01001836 }
Victor Stinner46972b72017-11-24 22:55:40 +01001837 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001838 }
1839
Victor Stinner46972b72017-11-24 22:55:40 +01001840 int res = config_get_env_var_dup(&home, L"PYTHONHOME", "PYTHONHOME");
Victor Stinner1f151112017-11-23 10:43:14 +01001841 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001842 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinner1f151112017-11-23 10:43:14 +01001843 }
Victor Stinner46972b72017-11-24 22:55:40 +01001844 config->home = home;
1845 return _Py_INIT_OK();
Victor Stinnerd4341102017-11-23 00:12:09 +01001846}
1847
1848
Victor Stinner358e5e12017-12-15 00:51:22 +01001849static _PyInitError
1850config_init_hash_seed(_PyCoreConfig *config)
1851{
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001852 const char *seed_text = config_get_env_var("PYTHONHASHSEED");
1853 int use_hash_seed;
1854 unsigned long hash_seed;
1855 if (_Py_ReadHashSeed(seed_text, &use_hash_seed, &hash_seed) < 0) {
1856 return _Py_INIT_USER_ERR("PYTHONHASHSEED must be \"random\" "
1857 "or an integer in range [0; 4294967295]");
Victor Stinner358e5e12017-12-15 00:51:22 +01001858 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001859 config->use_hash_seed = use_hash_seed;
1860 config->hash_seed = hash_seed;
Victor Stinner358e5e12017-12-15 00:51:22 +01001861 return _Py_INIT_OK();
1862}
1863
1864
Victor Stinner9cfc0022017-12-20 19:36:46 +01001865static _PyInitError
1866config_init_utf8_mode(_PyCoreConfig *config)
Victor Stinner91106cd2017-12-13 12:29:09 +01001867{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001868 const wchar_t *xopt = config_get_xoption(config, L"utf8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001869 if (xopt) {
1870 wchar_t *sep = wcschr(xopt, L'=');
1871 if (sep) {
1872 xopt = sep + 1;
1873 if (wcscmp(xopt, L"1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001874 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001875 }
1876 else if (wcscmp(xopt, L"0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001877 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001878 }
1879 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001880 return _Py_INIT_USER_ERR("invalid -X utf8 option value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001881 }
1882 }
1883 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001884 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001885 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001886 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001887 }
1888
Victor Stinner9cfc0022017-12-20 19:36:46 +01001889 const char *opt = config_get_env_var("PYTHONUTF8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001890 if (opt) {
1891 if (strcmp(opt, "1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001892 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001893 }
1894 else if (strcmp(opt, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001895 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001896 }
1897 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001898 return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment "
1899 "variable value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001900 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001901 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001902 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001903
1904 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001905}
Victor Stinner46972b72017-11-24 22:55:40 +01001906
1907
Victor Stinner9cfc0022017-12-20 19:36:46 +01001908static _PyInitError
1909config_read_env_vars(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001910{
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001911 assert(!config->ignore_environment);
1912
1913 if (config->allocator == NULL) {
1914 config->allocator = config_get_env_var("PYTHONMALLOC");
1915 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001916
Victor Stinner9cfc0022017-12-20 19:36:46 +01001917 if (config_get_env_var("PYTHONDUMPREFS")) {
1918 config->dump_refs = 1;
1919 }
1920 if (config_get_env_var("PYTHONMALLOCSTATS")) {
1921 config->malloc_stats = 1;
Victor Stinner31a83932017-12-04 13:39:15 +01001922 }
1923
Victor Stinner98c49c62018-08-29 01:13:29 +02001924 const char *env = config_get_env_var("PYTHONCOERCECLOCALE");
1925 if (env) {
1926 if (strcmp(env, "0") == 0) {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07001927 if (config->coerce_c_locale < 0) {
1928 config->coerce_c_locale = 0;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001929 }
Victor Stinner98c49c62018-08-29 01:13:29 +02001930 }
1931 else if (strcmp(env, "warn") == 0) {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07001932 config->coerce_c_locale_warn = 1;
Victor Stinner98c49c62018-08-29 01:13:29 +02001933 }
1934 else {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07001935 if (config->coerce_c_locale < 0) {
1936 config->coerce_c_locale = 1;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001937 }
Victor Stinner94540602017-12-16 04:54:22 +01001938 }
1939 }
1940
Victor Stinner9cfc0022017-12-20 19:36:46 +01001941 wchar_t *path;
1942 int res = config_get_env_var_dup(&path, L"PYTHONPATH", "PYTHONPATH");
1943 if (res < 0) {
Miss Islington (bot)6414da92018-05-19 16:14:42 -07001944 return DECODE_LOCALE_ERR("PYTHONPATH", res);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001945 }
1946 config->module_search_path_env = path;
1947
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001948 if (config->use_hash_seed < 0) {
1949 _PyInitError err = config_init_hash_seed(config);
1950 if (_Py_INIT_FAILED(err)) {
1951 return err;
1952 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001953 }
1954
1955 return _Py_INIT_OK();
1956}
1957
1958
1959static _PyInitError
1960config_read_complex_options(_PyCoreConfig *config)
1961{
1962 /* More complex options configured by env var and -X option */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001963 if (config->faulthandler < 0) {
1964 if (config_get_env_var("PYTHONFAULTHANDLER")
1965 || config_get_xoption(config, L"faulthandler")) {
1966 config->faulthandler = 1;
1967 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001968 }
1969 if (config_get_env_var("PYTHONPROFILEIMPORTTIME")
1970 || config_get_xoption(config, L"importtime")) {
1971 config->import_time = 1;
1972 }
1973 if (config_get_xoption(config, L"dev" ) ||
1974 config_get_env_var("PYTHONDEVMODE"))
1975 {
1976 config->dev_mode = 1;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001977 }
1978
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001979 if (config->tracemalloc < 0) {
1980 _PyInitError err = config_init_tracemalloc(config);
1981 if (_Py_INIT_FAILED(err)) {
1982 return err;
1983 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001984 }
1985 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001986}
1987
1988
Victor Stinnera7368ac2017-11-15 18:11:45 -08001989/* Parse command line options and environment variables.
1990 This code must not use Python runtime apart PyMem_Raw memory allocator.
1991
1992 Return 0 on success.
1993 Return 1 if Python is done and must exit.
1994 Set pymain->err and return -1 on error. */
1995static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07001996pymain_read_conf_impl(_PyMain *pymain, _PyCoreConfig *config,
1997 _PyCmdline *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001998{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001999 _PyInitError err;
2000
Victor Stinnerddc163d2018-09-24 05:03:01 -07002001 int res = pymain_parse_cmdline(pymain, config, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01002002 if (res != 0) {
2003 return res;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002004 }
2005
Victor Stinner9cfc0022017-12-20 19:36:46 +01002006 /* Set Py_IgnoreEnvironmentFlag for Py_GETENV() */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002007 Py_IgnoreEnvironmentFlag = config->ignore_environment || cmdline->isolated;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002008
2009 /* Get environment variables */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002010 if (!Py_IgnoreEnvironmentFlag) {
2011 cmdline_get_env_flags(cmdline);
2012 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002013
2014 err = cmdline_init_env_warnoptions(cmdline);
2015 if (_Py_INIT_FAILED(err)) {
2016 pymain->err = err;
2017 return -1;
2018 }
2019
2020#ifdef MS_WINDOWS
2021 if (cmdline->legacy_windows_fs_encoding) {
2022 config->utf8_mode = 0;
2023 }
2024#endif
2025
Victor Stinnerddc163d2018-09-24 05:03:01 -07002026 if (pymain_init_core_argv(pymain, config, cmdline) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01002027 return -1;
2028 }
2029
Victor Stinner2b822a02018-01-25 09:18:36 +01002030 /* On Windows, _PyPathConfig_Init() modifies Py_IsolatedFlag and
2031 Py_NoSiteFlag variables if a "._pth" file is found. */
2032 int init_isolated = Py_IsolatedFlag;
2033 int init_no_site = Py_NoSiteFlag;
2034 Py_IsolatedFlag = cmdline->isolated;
2035 Py_NoSiteFlag = cmdline->no_site_import;
Victor Stinner8ded5b82018-01-24 17:03:28 +01002036
Victor Stinner9cfc0022017-12-20 19:36:46 +01002037 err = _PyCoreConfig_Read(config);
Victor Stinner2b822a02018-01-25 09:18:36 +01002038
2039 cmdline->isolated = Py_IsolatedFlag;
2040 cmdline->no_site_import = Py_NoSiteFlag;
2041 Py_IsolatedFlag = init_isolated;
2042 Py_NoSiteFlag = init_no_site;
2043
Victor Stinner31a83932017-12-04 13:39:15 +01002044 if (_Py_INIT_FAILED(err)) {
2045 pymain->err = err;
2046 return -1;
2047 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002048 return 0;
2049}
2050
2051
Victor Stinner19760862017-12-20 01:41:59 +01002052/* Read the configuration, but initialize also the LC_CTYPE locale:
2053 enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538) */
Victor Stinnera7368ac2017-11-15 18:11:45 -08002054static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002055pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08002056{
Victor Stinner80a0eba2018-08-23 12:41:35 +02002057 int init_utf8_mode = Py_UTF8Mode;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002058 _PyCoreConfig save_config = _PyCoreConfig_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01002059 int res = -1;
2060
Victor Stinner94540602017-12-16 04:54:22 +01002061 char *oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
2062 if (oldloc == NULL) {
2063 pymain->err = _Py_INIT_NO_MEMORY();
2064 goto done;
2065 }
2066
2067 /* Reconfigure the locale to the default for this process */
2068 _Py_SetLocaleFromEnv(LC_ALL);
2069
2070 int locale_coerced = 0;
2071 int loops = 0;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002072 int init_ignore_env = config->ignore_environment;
2073
2074 if (_PyCoreConfig_Copy(&save_config, config) < 0) {
2075 pymain->err = _Py_INIT_NO_MEMORY();
2076 goto done;
2077 }
Victor Stinner94540602017-12-16 04:54:22 +01002078
2079 while (1) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002080 int init_utf8_mode = config->utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002081 int encoding_changed = 0;
2082
2083 /* Watchdog to prevent an infinite loop */
2084 loops++;
2085 if (loops == 3) {
2086 pymain->err = _Py_INIT_ERR("Encoding changed twice while "
2087 "reading the configuration");
2088 goto done;
2089 }
2090
Victor Stinner80a0eba2018-08-23 12:41:35 +02002091 /* bpo-34207: Py_DecodeLocale(), Py_EncodeLocale() and similar
2092 functions depend on Py_UTF8Mode. */
2093 Py_UTF8Mode = config->utf8_mode;
2094
Victor Stinnerddc163d2018-09-24 05:03:01 -07002095 if (pymain_init_cmdline_argv(pymain, config, cmdline) < 0) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01002096 goto done;
Victor Stinner94540602017-12-16 04:54:22 +01002097 }
2098
Victor Stinnerddc163d2018-09-24 05:03:01 -07002099 int conf_res = pymain_read_conf_impl(pymain, config, cmdline);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002100 if (conf_res != 0) {
2101 res = conf_res;
Victor Stinner94540602017-12-16 04:54:22 +01002102 goto done;
2103 }
2104
2105 /* The legacy C locale assumes ASCII as the default text encoding, which
2106 * causes problems not only for the CPython runtime, but also other
2107 * components like GNU readline.
2108 *
2109 * Accordingly, when the CLI detects it, it attempts to coerce it to a
2110 * more capable UTF-8 based alternative.
2111 *
2112 * See the documentation of the PYTHONCOERCECLOCALE setting for more
2113 * details.
2114 */
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002115 if (config->coerce_c_locale && !locale_coerced) {
Victor Stinner94540602017-12-16 04:54:22 +01002116 locale_coerced = 1;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002117 _Py_CoerceLegacyLocale(config);
Victor Stinner94540602017-12-16 04:54:22 +01002118 encoding_changed = 1;
2119 }
2120
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002121 if (init_utf8_mode == -1) {
2122 if (config->utf8_mode == 1) {
Victor Stinner94540602017-12-16 04:54:22 +01002123 /* UTF-8 Mode enabled */
2124 encoding_changed = 1;
2125 }
2126 }
2127 else {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002128 if (config->utf8_mode != init_utf8_mode) {
Victor Stinner94540602017-12-16 04:54:22 +01002129 encoding_changed = 1;
2130 }
2131 }
2132
2133 if (!encoding_changed) {
2134 break;
2135 }
2136
2137 /* Reset the configuration, except UTF-8 Mode. Set Py_UTF8Mode for
2138 Py_DecodeLocale(). Reset Py_IgnoreEnvironmentFlag, modified by
Victor Stinner8ded5b82018-01-24 17:03:28 +01002139 pymain_read_conf_impl(). Reset Py_IsolatedFlag and Py_NoSiteFlag
2140 modified by _PyCoreConfig_Read(). */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002141 int new_utf8_mode = config->utf8_mode;
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002142 int new_coerce_c_locale = config->coerce_c_locale;
Victor Stinner94540602017-12-16 04:54:22 +01002143 Py_IgnoreEnvironmentFlag = init_ignore_env;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002144 if (_PyCoreConfig_Copy(config, &save_config) < 0) {
2145 pymain->err = _Py_INIT_NO_MEMORY();
2146 goto done;
2147 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002148 pymain_clear_cmdline(pymain, cmdline);
Miss Islington (bot)046da162018-06-15 15:26:29 -07002149 memset(cmdline, 0, sizeof(*cmdline));
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002150
2151 cmdline_get_global_config(cmdline);
2152 _PyCoreConfig_GetGlobalConfig(config);
2153 config->utf8_mode = new_utf8_mode;
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002154 config->coerce_c_locale = new_coerce_c_locale;
Victor Stinner94540602017-12-16 04:54:22 +01002155
2156 /* The encoding changed: read again the configuration
2157 with the new encoding */
2158 }
2159 res = 0;
2160
2161done:
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002162 _PyCoreConfig_Clear(&save_config);
Victor Stinner94540602017-12-16 04:54:22 +01002163 if (oldloc != NULL) {
2164 setlocale(LC_ALL, oldloc);
2165 PyMem_RawFree(oldloc);
2166 }
Victor Stinner80a0eba2018-08-23 12:41:35 +02002167 Py_UTF8Mode = init_utf8_mode ;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002168 return res;
2169}
2170
Victor Stinner91106cd2017-12-13 12:29:09 +01002171
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002172static void
2173config_init_locale(_PyCoreConfig *config)
Victor Stinner9cfc0022017-12-20 19:36:46 +01002174{
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002175 if (config->coerce_c_locale < 0) {
Victor Stinner144f1e22018-09-17 18:01:39 -07002176 /* The C locale enables the C locale coercion (PEP 538) */
2177 if (_Py_LegacyLocaleDetected()) {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002178 config->coerce_c_locale = 1;
Victor Stinner144f1e22018-09-17 18:01:39 -07002179 }
2180 }
2181
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002182#ifndef MS_WINDOWS
2183 if (config->utf8_mode < 0) {
2184 /* The C locale and the POSIX locale enable the UTF-8 Mode (PEP 540) */
2185 const char *ctype_loc = setlocale(LC_CTYPE, NULL);
2186 if (ctype_loc != NULL
2187 && (strcmp(ctype_loc, "C") == 0
2188 || strcmp(ctype_loc, "POSIX") == 0))
2189 {
2190 config->utf8_mode = 1;
2191 }
2192 }
2193#endif
Victor Stinner9cfc0022017-12-20 19:36:46 +01002194}
2195
2196
Victor Stinner8ded5b82018-01-24 17:03:28 +01002197static _PyInitError
2198config_init_module_search_paths(_PyCoreConfig *config)
2199{
2200 assert(config->module_search_paths == NULL);
2201 assert(config->nmodule_search_path < 0);
2202
2203 config->nmodule_search_path = 0;
2204
2205 const wchar_t *sys_path = Py_GetPath();
2206 const wchar_t delim = DELIM;
2207 const wchar_t *p = sys_path;
2208 while (1) {
2209 p = wcschr(sys_path, delim);
2210 if (p == NULL) {
2211 p = sys_path + wcslen(sys_path); /* End of string */
2212 }
2213
2214 size_t path_len = (p - sys_path);
2215 wchar_t *path = PyMem_RawMalloc((path_len + 1) * sizeof(wchar_t));
2216 if (path == NULL) {
2217 return _Py_INIT_NO_MEMORY();
2218 }
2219 memcpy(path, sys_path, path_len * sizeof(wchar_t));
2220 path[path_len] = L'\0';
2221
2222 _PyInitError err = wstrlist_append(&config->nmodule_search_path,
2223 &config->module_search_paths,
2224 path);
2225 PyMem_RawFree(path);
2226 if (_Py_INIT_FAILED(err)) {
2227 return err;
2228 }
2229
2230 if (*p == '\0') {
2231 break;
2232 }
2233 sys_path = p + 1;
2234 }
2235 return _Py_INIT_OK();
2236}
2237
2238
2239static _PyInitError
2240config_init_path_config(_PyCoreConfig *config)
2241{
2242 _PyInitError err = _PyPathConfig_Init(config);
2243 if (_Py_INIT_FAILED(err)) {
2244 return err;
2245 }
2246
2247 if (config->nmodule_search_path < 0) {
2248 err = config_init_module_search_paths(config);
2249 if (_Py_INIT_FAILED(err)) {
2250 return err;
2251 }
2252 }
2253
2254 if (config->executable == NULL) {
2255 config->executable = _PyMem_RawWcsdup(Py_GetProgramFullPath());
2256 if (config->executable == NULL) {
2257 return _Py_INIT_NO_MEMORY();
2258 }
2259 }
2260
2261 if (config->prefix == NULL) {
2262 config->prefix = _PyMem_RawWcsdup(Py_GetPrefix());
2263 if (config->prefix == NULL) {
2264 return _Py_INIT_NO_MEMORY();
2265 }
2266 }
2267
2268 if (config->exec_prefix == NULL) {
2269 config->exec_prefix = _PyMem_RawWcsdup(Py_GetExecPrefix());
2270 if (config->exec_prefix == NULL) {
2271 return _Py_INIT_NO_MEMORY();
2272 }
2273 }
2274
2275 if (config->base_prefix == NULL) {
2276 config->base_prefix = _PyMem_RawWcsdup(config->prefix);
2277 if (config->base_prefix == NULL) {
2278 return _Py_INIT_NO_MEMORY();
2279 }
2280 }
2281
2282 if (config->base_exec_prefix == NULL) {
2283 config->base_exec_prefix = _PyMem_RawWcsdup(config->exec_prefix);
2284 if (config->base_exec_prefix == NULL) {
2285 return _Py_INIT_NO_MEMORY();
2286 }
2287 }
2288
2289 return _Py_INIT_OK();
2290}
2291
Victor Stinnerda273412017-12-15 01:46:02 +01002292/* Read configuration settings from standard locations
2293 *
2294 * This function doesn't make any changes to the interpreter state - it
2295 * merely populates any missing configuration settings. This allows an
2296 * embedding application to completely override a config option by
2297 * setting it before calling this function, or else modify the default
2298 * setting before passing the fully populated config to Py_EndInitialization.
2299 *
2300 * More advanced selective initialization tricks are possible by calling
2301 * this function multiple times with various preconfigured settings.
2302 */
2303
2304_PyInitError
2305_PyCoreConfig_Read(_PyCoreConfig *config)
2306{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002307 _PyInitError err;
2308
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002309 _PyCoreConfig_GetGlobalConfig(config);
2310
2311 assert(config->ignore_environment >= 0);
2312 if (!config->ignore_environment) {
2313 err = config_read_env_vars(config);
2314 if (_Py_INIT_FAILED(err)) {
2315 return err;
2316 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002317 }
2318
Victor Stinner9cfc0022017-12-20 19:36:46 +01002319 /* -X options */
2320 if (config_get_xoption(config, L"showrefcount")) {
2321 config->show_ref_count = 1;
2322 }
2323 if (config_get_xoption(config, L"showalloccount")) {
2324 config->show_alloc_count = 1;
2325 }
2326
2327 err = config_read_complex_options(config);
2328 if (_Py_INIT_FAILED(err)) {
2329 return err;
2330 }
2331
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002332 if (config->utf8_mode < 0) {
2333 err = config_init_utf8_mode(config);
2334 if (_Py_INIT_FAILED(err)) {
2335 return err;
2336 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002337 }
2338
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002339 if (config->home == NULL) {
2340 err = config_init_home(config);
2341 if (_Py_INIT_FAILED(err)) {
2342 return err;
2343 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002344 }
2345
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002346 if (config->program_name == NULL) {
2347 err = config_init_program_name(config);
2348 if (_Py_INIT_FAILED(err)) {
2349 return err;
2350 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002351 }
2352
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002353 if (config->utf8_mode < 0 || config->coerce_c_locale < 0) {
2354 config_init_locale(config);
Victor Stinner94540602017-12-16 04:54:22 +01002355 }
2356
Victor Stinner8ded5b82018-01-24 17:03:28 +01002357 if (!config->_disable_importlib) {
2358 err = config_init_path_config(config);
2359 if (_Py_INIT_FAILED(err)) {
2360 return err;
2361 }
2362 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002363
2364 /* default values */
2365 if (config->dev_mode) {
2366 if (config->faulthandler < 0) {
2367 config->faulthandler = 1;
2368 }
2369 if (config->allocator == NULL) {
2370 config->allocator = "debug";
2371 }
2372 }
2373 if (config->install_signal_handlers < 0) {
2374 config->install_signal_handlers = 1;
2375 }
2376 if (config->use_hash_seed < 0) {
2377 config->use_hash_seed = 0;
2378 config->hash_seed = 0;
2379 }
2380 if (config->faulthandler < 0) {
2381 config->faulthandler = 0;
2382 }
2383 if (config->tracemalloc < 0) {
2384 config->tracemalloc = 0;
2385 }
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002386 if (config->coerce_c_locale < 0) {
2387 config->coerce_c_locale = 0;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002388 }
2389 if (config->utf8_mode < 0) {
2390 config->utf8_mode = 0;
2391 }
2392 if (config->argc < 0) {
2393 config->argc = 0;
2394 }
2395
Victor Stinnerda273412017-12-15 01:46:02 +01002396 return _Py_INIT_OK();
2397}
2398
2399
2400void
2401_PyCoreConfig_Clear(_PyCoreConfig *config)
2402{
2403#define CLEAR(ATTR) \
2404 do { \
2405 PyMem_RawFree(ATTR); \
2406 ATTR = NULL; \
2407 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002408#define CLEAR_WSTRLIST(LEN, LIST) \
2409 do { \
2410 clear_wstrlist(LEN, LIST); \
2411 LEN = 0; \
2412 LIST = NULL; \
2413 } while (0)
Victor Stinnerda273412017-12-15 01:46:02 +01002414
2415 CLEAR(config->module_search_path_env);
2416 CLEAR(config->home);
2417 CLEAR(config->program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002418 CLEAR(config->program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002419
Victor Stinner8ded5b82018-01-24 17:03:28 +01002420 CLEAR_WSTRLIST(config->argc, config->argv);
2421 config->argc = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002422
Victor Stinner8ded5b82018-01-24 17:03:28 +01002423 CLEAR_WSTRLIST(config->nwarnoption, config->warnoptions);
2424 CLEAR_WSTRLIST(config->nxoption, config->xoptions);
2425 CLEAR_WSTRLIST(config->nmodule_search_path, config->module_search_paths);
2426 config->nmodule_search_path = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002427
Victor Stinner8ded5b82018-01-24 17:03:28 +01002428 CLEAR(config->executable);
2429 CLEAR(config->prefix);
2430 CLEAR(config->base_prefix);
2431 CLEAR(config->exec_prefix);
2432 CLEAR(config->base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002433#undef CLEAR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002434#undef CLEAR_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002435}
2436
2437
2438int
2439_PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
2440{
2441 _PyCoreConfig_Clear(config);
2442
2443#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
Victor Stinnerc4bca952017-12-19 23:48:17 +01002444#define COPY_STR_ATTR(ATTR) \
2445 do { \
2446 if (config2->ATTR != NULL) { \
2447 config->ATTR = _PyMem_RawWcsdup(config2->ATTR); \
2448 if (config->ATTR == NULL) { \
2449 return -1; \
2450 } \
2451 } \
2452 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002453#define COPY_WSTRLIST(LEN, LIST) \
2454 do { \
2455 if (config2->LIST != NULL) { \
2456 config->LIST = copy_wstrlist(config2->LEN, config2->LIST); \
2457 if (config->LIST == NULL) { \
2458 return -1; \
2459 } \
2460 } \
2461 config->LEN = config2->LEN; \
2462 } while (0)
Victor Stinnerc4bca952017-12-19 23:48:17 +01002463
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002464 COPY_ATTR(install_signal_handlers);
Victor Stinnerda273412017-12-15 01:46:02 +01002465 COPY_ATTR(ignore_environment);
2466 COPY_ATTR(use_hash_seed);
2467 COPY_ATTR(hash_seed);
2468 COPY_ATTR(_disable_importlib);
2469 COPY_ATTR(allocator);
2470 COPY_ATTR(dev_mode);
2471 COPY_ATTR(faulthandler);
2472 COPY_ATTR(tracemalloc);
2473 COPY_ATTR(import_time);
2474 COPY_ATTR(show_ref_count);
2475 COPY_ATTR(show_alloc_count);
2476 COPY_ATTR(dump_refs);
2477 COPY_ATTR(malloc_stats);
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002478
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002479 COPY_ATTR(coerce_c_locale);
2480 COPY_ATTR(coerce_c_locale_warn);
Victor Stinnerda273412017-12-15 01:46:02 +01002481 COPY_ATTR(utf8_mode);
Victor Stinnerda273412017-12-15 01:46:02 +01002482
2483 COPY_STR_ATTR(module_search_path_env);
2484 COPY_STR_ATTR(home);
2485 COPY_STR_ATTR(program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002486 COPY_STR_ATTR(program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002487
Victor Stinner8ded5b82018-01-24 17:03:28 +01002488 COPY_WSTRLIST(argc, argv);
2489 COPY_WSTRLIST(nwarnoption, warnoptions);
2490 COPY_WSTRLIST(nxoption, xoptions);
2491 COPY_WSTRLIST(nmodule_search_path, module_search_paths);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002492
Victor Stinner8ded5b82018-01-24 17:03:28 +01002493 COPY_STR_ATTR(executable);
2494 COPY_STR_ATTR(prefix);
2495 COPY_STR_ATTR(base_prefix);
2496 COPY_STR_ATTR(exec_prefix);
2497 COPY_STR_ATTR(base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002498
Victor Stinnerc4bca952017-12-19 23:48:17 +01002499#undef COPY_ATTR
Victor Stinnerda273412017-12-15 01:46:02 +01002500#undef COPY_STR_ATTR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002501#undef COPY_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002502 return 0;
2503}
2504
2505
Victor Stinner35c28d52018-11-14 02:01:52 +01002506PyObject *
2507_PyCoreConfig_AsDict(const _PyCoreConfig *config)
2508{
2509 PyObject *dict, *obj;
2510
2511 dict = PyDict_New();
2512 if (dict == NULL) {
2513 return NULL;
2514 }
2515
Victor Stinner35c28d52018-11-14 02:01:52 +01002516#define SET_ITEM(KEY, EXPR) \
2517 do { \
2518 obj = (EXPR); \
2519 if (obj == NULL) { \
2520 return NULL; \
2521 } \
2522 int res = PyDict_SetItemString(dict, (KEY), obj); \
2523 Py_DECREF(obj); \
2524 if (res < 0) { \
2525 goto fail; \
2526 } \
2527 } while (0)
Victor Stinner9ee1d422018-11-14 18:58:01 +01002528#define FROM_STRING(STR) \
2529 ((STR != NULL) ? \
2530 PyUnicode_FromString(STR) \
2531 : (Py_INCREF(Py_None), Py_None))
2532#define SET_ITEM_INT(ATTR) \
2533 SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR))
2534#define SET_ITEM_UINT(ATTR) \
2535 SET_ITEM(#ATTR, PyLong_FromUnsignedLong(config->ATTR))
2536#define SET_ITEM_STR(ATTR) \
2537 SET_ITEM(#ATTR, FROM_STRING(config->ATTR))
2538#define FROM_WSTRING(STR) \
2539 ((STR != NULL) ? \
2540 PyUnicode_FromWideChar(STR, -1) \
2541 : (Py_INCREF(Py_None), Py_None))
2542#define SET_ITEM_WSTR(ATTR) \
2543 SET_ITEM(#ATTR, FROM_WSTRING(config->ATTR))
2544#define SET_ITEM_WSTRLIST(NOPTION, OPTIONS) \
2545 SET_ITEM(#OPTIONS, _Py_wstrlist_as_pylist(config->NOPTION, config->OPTIONS))
Victor Stinner35c28d52018-11-14 02:01:52 +01002546
Victor Stinner9ee1d422018-11-14 18:58:01 +01002547 SET_ITEM_INT(install_signal_handlers);
2548 SET_ITEM_INT(ignore_environment);
2549 SET_ITEM_INT(use_hash_seed);
2550 SET_ITEM_UINT(hash_seed);
2551 SET_ITEM_STR(allocator);
2552 SET_ITEM_INT(dev_mode);
2553 SET_ITEM_INT(faulthandler);
2554 SET_ITEM_INT(tracemalloc);
2555 SET_ITEM_INT(import_time);
2556 SET_ITEM_INT(show_ref_count);
2557 SET_ITEM_INT(show_alloc_count);
2558 SET_ITEM_INT(dump_refs);
2559 SET_ITEM_INT(malloc_stats);
2560 SET_ITEM_INT(coerce_c_locale);
2561 SET_ITEM_INT(coerce_c_locale_warn);
2562 SET_ITEM_INT(utf8_mode);
2563 SET_ITEM_WSTR(program_name);
2564 SET_ITEM_WSTRLIST(argc, argv);
2565 SET_ITEM_WSTR(program);
2566 SET_ITEM_WSTRLIST(nxoption, xoptions);
2567 SET_ITEM_WSTRLIST(nwarnoption, warnoptions);
2568 SET_ITEM_WSTR(module_search_path_env);
2569 SET_ITEM_WSTR(home);
2570 SET_ITEM_WSTRLIST(nmodule_search_path, module_search_paths);
2571 SET_ITEM_WSTR(executable);
2572 SET_ITEM_WSTR(prefix);
2573 SET_ITEM_WSTR(base_prefix);
2574 SET_ITEM_WSTR(exec_prefix);
2575 SET_ITEM_WSTR(base_exec_prefix);
2576 SET_ITEM_INT(_disable_importlib);
Victor Stinner35c28d52018-11-14 02:01:52 +01002577
2578 return dict;
2579
2580fail:
2581 Py_DECREF(dict);
2582 return NULL;
2583
2584#undef FROM_STRING
2585#undef FROM_WSTRING
2586#undef SET_ITEM
Victor Stinner9ee1d422018-11-14 18:58:01 +01002587#undef SET_ITEM_INT
2588#undef SET_ITEM_UINT
2589#undef SET_ITEM_STR
2590#undef SET_ITEM_WSTR
2591#undef SET_ITEM_WSTRLIST
Victor Stinner35c28d52018-11-14 02:01:52 +01002592}
2593
2594
Victor Stinnerda273412017-12-15 01:46:02 +01002595void
2596_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config)
2597{
2598 Py_CLEAR(config->argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002599 Py_CLEAR(config->executable);
2600 Py_CLEAR(config->prefix);
2601 Py_CLEAR(config->base_prefix);
2602 Py_CLEAR(config->exec_prefix);
2603 Py_CLEAR(config->base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002604 Py_CLEAR(config->warnoptions);
2605 Py_CLEAR(config->xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002606 Py_CLEAR(config->module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002607}
2608
2609
2610static PyObject*
2611config_copy_attr(PyObject *obj)
2612{
2613 if (PyUnicode_Check(obj)) {
2614 Py_INCREF(obj);
2615 return obj;
2616 }
2617 else if (PyList_Check(obj)) {
2618 return PyList_GetSlice(obj, 0, Py_SIZE(obj));
2619 }
2620 else if (PyDict_Check(obj)) {
2621 /* The dict type is used for xoptions. Make the assumption that keys
2622 and values are immutables */
2623 return PyDict_Copy(obj);
2624 }
2625 else {
2626 PyErr_Format(PyExc_TypeError,
2627 "cannot copy config attribute of type %.200s",
2628 Py_TYPE(obj)->tp_name);
2629 return NULL;
2630 }
2631}
2632
2633
2634int
2635_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config,
2636 const _PyMainInterpreterConfig *config2)
2637{
2638 _PyMainInterpreterConfig_Clear(config);
2639
Victor Stinner88cbea42018-11-14 02:45:25 +01002640#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
Victor Stinner9ee1d422018-11-14 18:58:01 +01002641#define COPY_OBJ_ATTR(ATTR) \
Victor Stinnerda273412017-12-15 01:46:02 +01002642 do { \
Victor Stinner9ee1d422018-11-14 18:58:01 +01002643 if (config2->ATTR != NULL) { \
2644 config->ATTR = config_copy_attr(config2->ATTR); \
2645 if (config->ATTR == NULL) { \
Victor Stinnerda273412017-12-15 01:46:02 +01002646 return -1; \
2647 } \
2648 } \
2649 } while (0)
2650
Victor Stinner88cbea42018-11-14 02:45:25 +01002651 COPY_ATTR(install_signal_handlers);
2652 COPY_OBJ_ATTR(argv);
2653 COPY_OBJ_ATTR(executable);
2654 COPY_OBJ_ATTR(prefix);
2655 COPY_OBJ_ATTR(base_prefix);
2656 COPY_OBJ_ATTR(exec_prefix);
2657 COPY_OBJ_ATTR(base_exec_prefix);
2658 COPY_OBJ_ATTR(warnoptions);
2659 COPY_OBJ_ATTR(xoptions);
2660 COPY_OBJ_ATTR(module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002661#undef COPY_ATTR
Victor Stinner88cbea42018-11-14 02:45:25 +01002662#undef COPY_OBJ_ATTR
Victor Stinnerda273412017-12-15 01:46:02 +01002663 return 0;
2664}
2665
2666
Victor Stinner35c28d52018-11-14 02:01:52 +01002667PyObject*
2668_PyMainInterpreterConfig_AsDict(const _PyMainInterpreterConfig *config)
2669{
2670 PyObject *dict, *obj;
2671 int res;
2672
2673 dict = PyDict_New();
2674 if (dict == NULL) {
2675 return NULL;
2676 }
2677
Victor Stinner9ee1d422018-11-14 18:58:01 +01002678#define SET_ITEM_INT(ATTR) \
2679 do { \
2680 obj = PyLong_FromLong(config->ATTR); \
2681 if (obj == NULL) { \
2682 goto fail; \
2683 } \
2684 res = PyDict_SetItemString(dict, #ATTR, obj); \
2685 Py_DECREF(obj); \
2686 if (res < 0) { \
2687 goto fail; \
2688 } \
2689 } while (0)
Victor Stinner35c28d52018-11-14 02:01:52 +01002690
Victor Stinner9ee1d422018-11-14 18:58:01 +01002691#define SET_ITEM_OBJ(ATTR) \
2692 do { \
2693 obj = config->ATTR; \
2694 if (obj == NULL) { \
2695 obj = Py_None; \
2696 } \
2697 res = PyDict_SetItemString(dict, #ATTR, obj); \
2698 if (res < 0) { \
2699 goto fail; \
2700 } \
2701 } while (0)
Victor Stinner35c28d52018-11-14 02:01:52 +01002702
Victor Stinner9ee1d422018-11-14 18:58:01 +01002703 SET_ITEM_INT(install_signal_handlers);
2704 SET_ITEM_OBJ(argv);
2705 SET_ITEM_OBJ(executable);
2706 SET_ITEM_OBJ(prefix);
2707 SET_ITEM_OBJ(base_prefix);
2708 SET_ITEM_OBJ(exec_prefix);
2709 SET_ITEM_OBJ(base_exec_prefix);
2710 SET_ITEM_OBJ(warnoptions);
2711 SET_ITEM_OBJ(xoptions);
2712 SET_ITEM_OBJ(module_search_path);
Victor Stinner35c28d52018-11-14 02:01:52 +01002713
2714 return dict;
2715
2716fail:
2717 Py_DECREF(dict);
2718 return NULL;
2719
Victor Stinner9ee1d422018-11-14 18:58:01 +01002720#undef SET_ITEM_OBJ
Victor Stinner35c28d52018-11-14 02:01:52 +01002721}
Victor Stinnerda273412017-12-15 01:46:02 +01002722
2723
Victor Stinner41264f12017-12-15 02:05:29 +01002724_PyInitError
Victor Stinner9cfc0022017-12-20 19:36:46 +01002725_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config,
2726 const _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002727{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002728 if (main_config->install_signal_handlers < 0) {
2729 main_config->install_signal_handlers = config->install_signal_handlers;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002730 }
2731
Victor Stinner9cfc0022017-12-20 19:36:46 +01002732 if (main_config->xoptions == NULL) {
2733 main_config->xoptions = config_create_xoptions_dict(config);
2734 if (main_config->xoptions == NULL) {
2735 return _Py_INIT_NO_MEMORY();
2736 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002737 }
2738
Victor Stinner8ded5b82018-01-24 17:03:28 +01002739#define COPY_WSTR(ATTR) \
2740 do { \
2741 if (main_config->ATTR == NULL) { \
2742 main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \
2743 if (main_config->ATTR == NULL) { \
2744 return _Py_INIT_NO_MEMORY(); \
2745 } \
2746 } \
2747 } while (0)
2748#define COPY_WSTRLIST(ATTR, LEN, LIST) \
2749 do { \
2750 if (ATTR == NULL) { \
Victor Stinner35c28d52018-11-14 02:01:52 +01002751 ATTR = _Py_wstrlist_as_pylist(LEN, LIST); \
Victor Stinner8ded5b82018-01-24 17:03:28 +01002752 if (ATTR == NULL) { \
2753 return _Py_INIT_NO_MEMORY(); \
2754 } \
2755 } \
2756 } while (0)
2757
2758 COPY_WSTRLIST(main_config->warnoptions,
2759 config->nwarnoption, config->warnoptions);
2760 if (config->argc >= 0) {
2761 COPY_WSTRLIST(main_config->argv,
2762 config->argc, config->argv);
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002763 }
2764
Victor Stinner8ded5b82018-01-24 17:03:28 +01002765 if (!config->_disable_importlib) {
2766 COPY_WSTR(executable);
2767 COPY_WSTR(prefix);
2768 COPY_WSTR(base_prefix);
2769 COPY_WSTR(exec_prefix);
2770 COPY_WSTR(base_exec_prefix);
2771
2772 COPY_WSTRLIST(main_config->module_search_path,
2773 config->nmodule_search_path, config->module_search_paths);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002774 }
Victor Stinner41264f12017-12-15 02:05:29 +01002775
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002776 return _Py_INIT_OK();
Victor Stinner8ded5b82018-01-24 17:03:28 +01002777#undef COPY_WSTR
2778#undef COPY_WSTRLIST
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002779}
2780
2781
2782static int
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002783pymain_init_python_main(_PyMain *pymain, PyInterpreterState *interp)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002784{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002785 _PyInitError err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002786
Victor Stinner9cfc0022017-12-20 19:36:46 +01002787 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002788 err = _PyMainInterpreterConfig_Read(&main_config, &interp->core_config);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002789 if (!_Py_INIT_FAILED(err)) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002790 err = _Py_InitializeMainInterpreter(interp, &main_config);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002791 }
2792 _PyMainInterpreterConfig_Clear(&main_config);
2793
2794 if (_Py_INIT_FAILED(err)) {
2795 pymain->err = err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002796 return -1;
2797 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002798 return 0;
2799}
Victor Stinnera7368ac2017-11-15 18:11:45 -08002800
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002801
2802static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002803pymain_init_sys_path(_PyMain *pymain, _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002804{
Victor Stinnerca719ac2017-12-20 18:00:19 +01002805 if (pymain->filename != NULL) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002806 /* If filename is a package (ex: directory or ZIP file) which contains
2807 __main__.py, main_importer_path is set to filename and will be
2808 prepended to sys.path by pymain_run_main_from_importer(). Otherwise,
2809 main_importer_path is set to NULL. */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002810 pymain->main_importer_path = pymain_get_importer(pymain->filename);
Victor Stinnerd5dda982017-12-13 17:31:16 +01002811 }
2812
Victor Stinner19760862017-12-20 01:41:59 +01002813 PyObject *path0;
Victor Stinnerddc163d2018-09-24 05:03:01 -07002814 if (pymain_compute_path0(pymain, config, &path0) < 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002815 return -1;
2816 }
Victor Stinner19760862017-12-20 01:41:59 +01002817
Victor Stinner19760862017-12-20 01:41:59 +01002818 if (path0 != NULL) {
2819 if (pymain_update_sys_path(pymain, path0) < 0) {
2820 Py_DECREF(path0);
2821 return -1;
2822 }
2823 Py_DECREF(path0);
2824 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002825 return 0;
2826}
2827
2828
2829static void
2830pymain_run_python(_PyMain *pymain)
2831{
Victor Stinner19760862017-12-20 01:41:59 +01002832 PyCompilerFlags cf = {.cf_flags = 0};
Victor Stinnera7368ac2017-11-15 18:11:45 -08002833
2834 pymain_header(pymain);
2835 pymain_import_readline(pymain);
2836
Victor Stinnerca719ac2017-12-20 18:00:19 +01002837 if (pymain->command) {
2838 pymain->status = pymain_run_command(pymain->command, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002839 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002840 else if (pymain->module) {
2841 pymain->status = (pymain_run_module(pymain->module, 1) != 0);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002842 }
2843 else {
Victor Stinner19760862017-12-20 01:41:59 +01002844 pymain_run_filename(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002845 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002846
Victor Stinner19760862017-12-20 01:41:59 +01002847 pymain_repl(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002848}
2849
2850
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002851static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002852pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config,
2853 _PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002854{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002855 pymain->err = _PyRuntime_Initialize();
2856 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002857 return -1;
2858 }
2859
Victor Stinnerddc163d2018-09-24 05:03:01 -07002860 int res = pymain_read_conf(pymain, config, cmdline);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002861 if (res < 0) {
2862 return -1;
2863 }
2864 if (res > 0) {
2865 /* --help or --version command: we are done */
Victor Stinner19760862017-12-20 01:41:59 +01002866 return 1;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002867 }
2868
Victor Stinner94540602017-12-16 04:54:22 +01002869 if (cmdline->print_help) {
Victor Stinnerddc163d2018-09-24 05:03:01 -07002870 pymain_usage(0, config->program);
Victor Stinner19760862017-12-20 01:41:59 +01002871 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002872 }
2873
2874 if (cmdline->print_version) {
2875 printf("Python %s\n",
2876 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
Victor Stinner19760862017-12-20 01:41:59 +01002877 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002878 }
2879
Victor Stinnerc4bca952017-12-19 23:48:17 +01002880 /* For Py_GetArgcArgv(). Cleared by pymain_free(). */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002881 orig_argv = copy_wstrlist(pymain->argc, cmdline->argv);
2882 if (orig_argv == NULL) {
2883 pymain->err = _Py_INIT_NO_MEMORY();
2884 return -1;
2885 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01002886 orig_argc = pymain->argc;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002887
Victor Stinnerddc163d2018-09-24 05:03:01 -07002888 _PyInitError err = config_init_warnoptions(config, cmdline);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002889 if (_Py_INIT_FAILED(err)) {
2890 pymain->err = err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002891 return -1;
2892 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002893 return 0;
2894}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00002895
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002896
Victor Stinnerca719ac2017-12-20 18:00:19 +01002897/* Read the configuration into _PyCoreConfig and _PyMain, initialize the
2898 LC_CTYPE locale and Py_DecodeLocale().
2899
2900 Configuration:
2901
2902 * Command line arguments
2903 * Environment variables
2904 * Py_xxx global configuration variables
2905
Victor Stinnerddc163d2018-09-24 05:03:01 -07002906 _PyCmdline is a temporary structure used to prioritize these
Victor Stinnerca719ac2017-12-20 18:00:19 +01002907 variables. */
2908static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002909pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config)
Victor Stinnerca719ac2017-12-20 18:00:19 +01002910{
Victor Stinner31e99082017-12-20 23:41:38 +01002911 /* Force default allocator, since pymain_free() and pymain_clear_config()
2912 must use the same allocator than this function. */
2913 PyMemAllocatorEx old_alloc;
2914 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2915#ifdef Py_DEBUG
2916 PyMemAllocatorEx default_alloc;
2917 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &default_alloc);
2918#endif
2919
Victor Stinnerddc163d2018-09-24 05:03:01 -07002920 _PyCmdline cmdline;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002921 memset(&cmdline, 0, sizeof(cmdline));
2922
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002923 cmdline_get_global_config(&cmdline);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002924
Victor Stinnerddc163d2018-09-24 05:03:01 -07002925 int res = pymain_cmdline_impl(pymain, config, &cmdline);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002926
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002927 cmdline_set_global_config(&cmdline);
Victor Stinnerddc163d2018-09-24 05:03:01 -07002928 _PyCoreConfig_SetGlobalConfig(config);
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002929 if (Py_IsolatedFlag) {
2930 Py_IgnoreEnvironmentFlag = 1;
2931 Py_NoUserSiteDirectory = 1;
2932 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002933
2934 pymain_clear_cmdline(pymain, &cmdline);
Victor Stinner31e99082017-12-20 23:41:38 +01002935
2936#ifdef Py_DEBUG
2937 /* Make sure that PYMEM_DOMAIN_RAW has not been modified */
2938 PyMemAllocatorEx cur_alloc;
2939 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &cur_alloc);
2940 assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0);
2941#endif
2942 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002943 return res;
2944}
2945
2946
Victor Stinner94540602017-12-16 04:54:22 +01002947static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002948pymain_init(_PyMain *pymain)
Victor Stinner94540602017-12-16 04:54:22 +01002949{
Victor Stinnerddc163d2018-09-24 05:03:01 -07002950 _PyCoreConfig local_config = _PyCoreConfig_INIT;
2951 _PyCoreConfig *config = &local_config;
Victor Stinner94540602017-12-16 04:54:22 +01002952
Victor Stinnerddc163d2018-09-24 05:03:01 -07002953 /* 754 requires that FP exceptions run in "no stop" mode by default,
2954 * and until C vendors implement C99's ways to control FP exceptions,
2955 * Python requires non-stop mode. Alas, some platforms enable FP
2956 * exceptions by default. Here we disable them.
2957 */
2958#ifdef __FreeBSD__
2959 fedisableexcept(FE_OVERFLOW);
2960#endif
2961
2962 config->_disable_importlib = 0;
2963 config->install_signal_handlers = 1;
2964 _PyCoreConfig_GetGlobalConfig(config);
2965
2966 int res = pymain_cmdline(pymain, config);
Victor Stinner19760862017-12-20 01:41:59 +01002967 if (res < 0) {
Victor Stinner94540602017-12-16 04:54:22 +01002968 _Py_FatalInitError(pymain->err);
2969 }
Victor Stinner19760862017-12-20 01:41:59 +01002970 if (res == 1) {
Victor Stinnerddc163d2018-09-24 05:03:01 -07002971 pymain_clear_config(&local_config);
2972 return res;
Victor Stinner19760862017-12-20 01:41:59 +01002973 }
2974
Victor Stinner9cfc0022017-12-20 19:36:46 +01002975 pymain_init_stdio(pymain);
2976
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002977 PyInterpreterState *interp;
Victor Stinnerddc163d2018-09-24 05:03:01 -07002978 pymain->err = _Py_InitializeCore(&interp, config);
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002979 if (_Py_INIT_FAILED(pymain->err)) {
2980 _Py_FatalInitError(pymain->err);
Victor Stinner19760862017-12-20 01:41:59 +01002981 }
2982
Victor Stinnerddc163d2018-09-24 05:03:01 -07002983 pymain_clear_config(&local_config);
2984 config = &interp->core_config;
2985
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002986 if (pymain_init_python_main(pymain, interp) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01002987 _Py_FatalInitError(pymain->err);
2988 }
2989
Victor Stinnerddc163d2018-09-24 05:03:01 -07002990 if (pymain_init_sys_path(pymain, config) < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002991 _Py_FatalInitError(pymain->err);
2992 }
Victor Stinnerddc163d2018-09-24 05:03:01 -07002993 return 0;
2994}
2995
2996
2997static int
2998pymain_main(_PyMain *pymain)
2999{
3000 int res = pymain_init(pymain);
3001 if (res == 1) {
3002 goto done;
3003 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01003004
Victor Stinner19760862017-12-20 01:41:59 +01003005 pymain_run_python(pymain);
3006
3007 if (Py_FinalizeEx() < 0) {
3008 /* Value unlikely to be confused with a non-error exit status or
3009 other special meaning */
3010 pymain->status = 120;
3011 }
3012
3013done:
Victor Stinner94540602017-12-16 04:54:22 +01003014 pymain_free(pymain);
3015
Victor Stinner94540602017-12-16 04:54:22 +01003016 return pymain->status;
3017}
3018
3019
Victor Stinnerf7e5b562017-11-15 15:48:08 -08003020int
3021Py_Main(int argc, wchar_t **argv)
3022{
3023 _PyMain pymain = _PyMain_INIT;
Victor Stinnerc4bca952017-12-19 23:48:17 +01003024 pymain.use_bytes_argv = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08003025 pymain.argc = argc;
Victor Stinnerc4bca952017-12-19 23:48:17 +01003026 pymain.wchar_argv = argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08003027
Victor Stinner95cc3ee2018-09-19 12:01:52 -07003028 return pymain_main(&pymain);
Guido van Rossum667d7041995-08-04 04:20:48 +00003029}
3030
Victor Stinner94540602017-12-16 04:54:22 +01003031
3032int
3033_Py_UnixMain(int argc, char **argv)
3034{
3035 _PyMain pymain = _PyMain_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01003036 pymain.use_bytes_argv = 1;
Victor Stinnerc4bca952017-12-19 23:48:17 +01003037 pymain.argc = argc;
Victor Stinner94540602017-12-16 04:54:22 +01003038 pymain.bytes_argv = argv;
3039
Victor Stinner95cc3ee2018-09-19 12:01:52 -07003040 return pymain_main(&pymain);
Victor Stinner94540602017-12-16 04:54:22 +01003041}
3042
3043
Skip Montanaro786ea6b2004-03-01 15:44:05 +00003044/* this is gonna seem *real weird*, but if you put some other code between
3045 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
3046 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00003047
Guido van Rossum667d7041995-08-04 04:20:48 +00003048/* Make the *original* argc/argv available to other modules.
3049 This is rare, but it is needed by the secureware extension. */
3050
3051void
Martin v. Löwis790465f2008-04-05 20:41:37 +00003052Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00003053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 *argc = orig_argc;
3055 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00003056}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003057
3058#ifdef __cplusplus
3059}
3060#endif