blob: 7771d27500971d47e8d5258064f2841aadc3e130 [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*
1300wstrlist_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 Stinner0c90d6f2018-08-05 12:31:59 +02001364void
1365_PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
1366{
1367#define COPY_FLAG(ATTR, VALUE) \
1368 if (config->ATTR == -1) { \
1369 config->ATTR = VALUE; \
1370 }
1371
1372 COPY_FLAG(ignore_environment, Py_IgnoreEnvironmentFlag);
1373 COPY_FLAG(utf8_mode, Py_UTF8Mode);
1374
1375#undef COPY_FLAG
1376}
1377
1378
Victor Stinner6bf992a2017-12-06 17:26:10 +01001379/* Get Py_xxx global configuration variables */
1380static void
Victor Stinnerddc163d2018-09-24 05:03:01 -07001381cmdline_get_global_config(_PyCmdline *cmdline)
Victor Stinner6bf992a2017-12-06 17:26:10 +01001382{
Victor Stinner91106cd2017-12-13 12:29:09 +01001383 cmdline->bytes_warning = Py_BytesWarningFlag;
1384 cmdline->debug = Py_DebugFlag;
1385 cmdline->inspect = Py_InspectFlag;
1386 cmdline->interactive = Py_InteractiveFlag;
1387 cmdline->isolated = Py_IsolatedFlag;
1388 cmdline->optimization_level = Py_OptimizeFlag;
1389 cmdline->dont_write_bytecode = Py_DontWriteBytecodeFlag;
1390 cmdline->no_user_site_directory = Py_NoUserSiteDirectory;
1391 cmdline->no_site_import = Py_NoSiteFlag;
1392 cmdline->use_unbuffered_io = Py_UnbufferedStdioFlag;
1393 cmdline->verbosity = Py_VerboseFlag;
1394 cmdline->quiet_flag = Py_QuietFlag;
1395#ifdef MS_WINDOWS
1396 cmdline->legacy_windows_fs_encoding = Py_LegacyWindowsFSEncodingFlag;
1397 cmdline->legacy_windows_stdio = Py_LegacyWindowsStdioFlag;
1398#endif
1399 cmdline->check_hash_pycs_mode = _Py_CheckHashBasedPycsMode ;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001400}
Victor Stinner91106cd2017-12-13 12:29:09 +01001401
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001402
1403void
1404_PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config)
1405{
1406 Py_IgnoreEnvironmentFlag = config->ignore_environment;
1407 Py_UTF8Mode = config->utf8_mode;
1408
1409 /* Random or non-zero hash seed */
1410 Py_HashRandomizationFlag = (config->use_hash_seed == 0 ||
1411 config->hash_seed != 0);
Victor Stinner6bf992a2017-12-06 17:26:10 +01001412}
1413
1414
Victor Stinner19760862017-12-20 01:41:59 +01001415/* Set Py_xxx global configuration variables */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001416static void
Victor Stinnerddc163d2018-09-24 05:03:01 -07001417cmdline_set_global_config(_PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001418{
Victor Stinner91106cd2017-12-13 12:29:09 +01001419 Py_BytesWarningFlag = cmdline->bytes_warning;
1420 Py_DebugFlag = cmdline->debug;
1421 Py_InspectFlag = cmdline->inspect;
1422 Py_InteractiveFlag = cmdline->interactive;
1423 Py_IsolatedFlag = cmdline->isolated;
1424 Py_OptimizeFlag = cmdline->optimization_level;
1425 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
1426 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
1427 Py_NoSiteFlag = cmdline->no_site_import;
1428 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
1429 Py_VerboseFlag = cmdline->verbosity;
1430 Py_QuietFlag = cmdline->quiet_flag;
1431 _Py_CheckHashBasedPycsMode = cmdline->check_hash_pycs_mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001432#ifdef MS_WINDOWS
Victor Stinner91106cd2017-12-13 12:29:09 +01001433 Py_LegacyWindowsFSEncodingFlag = cmdline->legacy_windows_fs_encoding;
1434 Py_LegacyWindowsStdioFlag = cmdline->legacy_windows_stdio;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001435#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001436}
1437
1438
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001439static void
1440pymain_import_readline(_PyMain *pymain)
1441{
1442 if (Py_IsolatedFlag) {
1443 return;
1444 }
Victor Stinner19760862017-12-20 01:41:59 +01001445 if (!Py_InspectFlag && RUN_CODE(pymain)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001446 return;
1447 }
1448 if (!isatty(fileno(stdin))) {
1449 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001450 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001451
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001452 PyObject *mod = PyImport_ImportModule("readline");
1453 if (mod == NULL) {
1454 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 }
1456 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001457 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001459}
1460
1461
1462static FILE*
1463pymain_open_filename(_PyMain *pymain)
1464{
Victor Stinnerddc163d2018-09-24 05:03:01 -07001465 const _PyCoreConfig *config = &_PyGILState_GetInterpreterStateUnsafe()->core_config;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001466 FILE* fp;
1467
Victor Stinnerca719ac2017-12-20 18:00:19 +01001468 fp = _Py_wfopen(pymain->filename, L"r");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001469 if (fp == NULL) {
1470 char *cfilename_buffer;
1471 const char *cfilename;
1472 int err = errno;
Victor Stinner9dd76202017-12-21 16:20:32 +01001473 cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001474 if (cfilename_buffer != NULL)
1475 cfilename = cfilename_buffer;
1476 else
1477 cfilename = "<unprintable file name>";
1478 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Victor Stinnerddc163d2018-09-24 05:03:01 -07001479 config->program, cfilename, err, strerror(err));
Victor Stinner9dd76202017-12-21 16:20:32 +01001480 PyMem_RawFree(cfilename_buffer);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001481 pymain->status = 2;
1482 return NULL;
1483 }
1484
Victor Stinnerca719ac2017-12-20 18:00:19 +01001485 if (pymain->skip_first_line) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001486 int ch;
1487 /* Push back first newline so line numbers
1488 remain the same */
1489 while ((ch = getc(fp)) != EOF) {
1490 if (ch == '\n') {
1491 (void)ungetc(ch, fp);
1492 break;
1493 }
1494 }
1495 }
1496
1497 struct _Py_stat_struct sb;
1498 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1499 S_ISDIR(sb.st_mode)) {
1500 fprintf(stderr,
1501 "%ls: '%ls' is a directory, cannot continue\n",
Victor Stinnerddc163d2018-09-24 05:03:01 -07001502 config->program, pymain->filename);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001503 fclose(fp);
1504 pymain->status = 1;
1505 return NULL;
1506 }
1507
1508 return fp;
1509}
1510
1511
1512static void
Victor Stinner19760862017-12-20 01:41:59 +01001513pymain_run_filename(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001514{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001515 if (pymain->filename == NULL && pymain->stdin_is_interactive) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001516 Py_InspectFlag = 0; /* do exit on SystemExit */
Victor Stinner19760862017-12-20 01:41:59 +01001517 pymain_run_startup(cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001518 pymain_run_interactive_hook();
1519 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001520
1521 if (pymain->main_importer_path != NULL) {
1522 pymain->status = pymain_run_main_from_importer(pymain);
1523 return;
1524 }
1525
1526 FILE *fp;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001527 if (pymain->filename != NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001528 fp = pymain_open_filename(pymain);
1529 if (fp == NULL) {
1530 return;
1531 }
1532 }
1533 else {
1534 fp = stdin;
1535 }
1536
Victor Stinnerca719ac2017-12-20 18:00:19 +01001537 pymain->status = pymain_run_file(fp, pymain->filename, cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001538}
1539
1540
1541static void
Victor Stinner19760862017-12-20 01:41:59 +01001542pymain_repl(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001545 opportunity to set it from Python. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001546 if (!Py_InspectFlag && config_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 Py_InspectFlag = 1;
1548 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001549
Victor Stinner19760862017-12-20 01:41:59 +01001550 if (!(Py_InspectFlag && pymain->stdin_is_interactive && RUN_CODE(pymain))) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001551 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001553
1554 Py_InspectFlag = 0;
1555 pymain_run_interactive_hook();
Victor Stinner33c377e2017-12-05 15:12:41 +01001556
Victor Stinner19760862017-12-20 01:41:59 +01001557 int res = PyRun_AnyFileFlags(stdin, "<stdin>", cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001558 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001559}
1560
1561
1562/* Parse the command line.
1563 Handle --version and --help options directly.
1564
1565 Return 1 if Python must exit.
1566 Return 0 on success.
1567 Set pymain->err and return -1 on failure. */
1568static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07001569pymain_parse_cmdline(_PyMain *pymain, _PyCoreConfig *config,
1570 _PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001571{
Victor Stinnerddc163d2018-09-24 05:03:01 -07001572 int res = pymain_parse_cmdline_impl(pymain, config, cmdline);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001573 if (res < 0) {
1574 return -1;
1575 }
1576 if (res) {
Victor Stinnerddc163d2018-09-24 05:03:01 -07001577 pymain_usage(1, config->program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001578 pymain->status = 2;
1579 return 1;
1580 }
1581
Victor Stinnerca719ac2017-12-20 18:00:19 +01001582 if (pymain->command != NULL || pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001583 /* Backup _PyOS_optind */
1584 _PyOS_optind--;
1585 }
1586
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001587 return 0;
1588}
1589
1590
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001591static const wchar_t*
Victor Stinner9cfc0022017-12-20 19:36:46 +01001592config_get_xoption(_PyCoreConfig *config, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001593{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001594 int nxoption = config->nxoption;
1595 wchar_t **xoptions = config->xoptions;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001596 for (int i=0; i < nxoption; i++) {
1597 wchar_t *option = xoptions[i];
Victor Stinnera7368ac2017-11-15 18:11:45 -08001598 size_t len;
1599 wchar_t *sep = wcschr(option, L'=');
1600 if (sep != NULL) {
1601 len = (sep - option);
1602 }
1603 else {
1604 len = wcslen(option);
1605 }
1606 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1607 return option;
1608 }
1609 }
1610 return NULL;
1611}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001612
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001613
Victor Stinnera7368ac2017-11-15 18:11:45 -08001614static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001615pymain_str_to_int(const char *str, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001616{
1617 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001618 const char *endptr = str;
1619 long value = strtol(str, (char **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001620 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001621 return -1;
1622 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001623 if (value < INT_MIN || value > INT_MAX) {
1624 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001625 }
1626
Victor Stinnera7368ac2017-11-15 18:11:45 -08001627 *result = (int)value;
1628 return 0;
1629}
1630
1631
1632static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001633pymain_wstr_to_int(const wchar_t *wstr, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001634{
1635 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001636 const wchar_t *endptr = wstr;
1637 long value = wcstol(wstr, (wchar_t **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001638 if (*endptr != '\0' || errno == ERANGE) {
1639 return -1;
1640 }
1641 if (value < INT_MIN || value > INT_MAX) {
1642 return -1;
1643 }
1644
1645 *result = (int)value;
1646 return 0;
1647}
1648
1649
Victor Stinner9cfc0022017-12-20 19:36:46 +01001650static _PyInitError
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001651config_init_tracemalloc(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001652{
1653 int nframe;
1654 int valid;
1655
Victor Stinner9cfc0022017-12-20 19:36:46 +01001656 const char *env = config_get_env_var("PYTHONTRACEMALLOC");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001657 if (env) {
1658 if (!pymain_str_to_int(env, &nframe)) {
1659 valid = (nframe >= 1);
1660 }
1661 else {
1662 valid = 0;
1663 }
1664 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001665 return _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid number "
1666 "of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001667 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001668 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001669 }
1670
Victor Stinner9cfc0022017-12-20 19:36:46 +01001671 const wchar_t *xoption = config_get_xoption(config, L"tracemalloc");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001672 if (xoption) {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001673 const wchar_t *sep = wcschr(xoption, L'=');
Victor Stinnera7368ac2017-11-15 18:11:45 -08001674 if (sep) {
1675 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1676 valid = (nframe >= 1);
1677 }
1678 else {
1679 valid = 0;
1680 }
1681 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001682 return _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1683 "invalid number of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001684 }
1685 }
1686 else {
1687 /* -X tracemalloc behaves as -X tracemalloc=1 */
1688 nframe = 1;
1689 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001690 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001691 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001692 return _Py_INIT_OK();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001693}
1694
1695
1696static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001697get_env_flag(int *flag, const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001698{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001699 const char *var = config_get_env_var(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001700 if (!var) {
1701 return;
1702 }
1703 int value;
1704 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1705 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1706 value = 1;
1707 }
1708 if (*flag < value) {
1709 *flag = value;
1710 }
1711}
1712
1713
1714static void
Victor Stinnerddc163d2018-09-24 05:03:01 -07001715cmdline_get_env_flags(_PyCmdline *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001716{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001717 get_env_flag(&cmdline->debug, "PYTHONDEBUG");
1718 get_env_flag(&cmdline->verbosity, "PYTHONVERBOSE");
1719 get_env_flag(&cmdline->optimization_level, "PYTHONOPTIMIZE");
1720 get_env_flag(&cmdline->inspect, "PYTHONINSPECT");
1721 get_env_flag(&cmdline->dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
1722 get_env_flag(&cmdline->no_user_site_directory, "PYTHONNOUSERSITE");
1723 get_env_flag(&cmdline->use_unbuffered_io, "PYTHONUNBUFFERED");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001724#ifdef MS_WINDOWS
Victor Stinner9cfc0022017-12-20 19:36:46 +01001725 get_env_flag(&cmdline->legacy_windows_fs_encoding,
1726 "PYTHONLEGACYWINDOWSFSENCODING");
1727 get_env_flag(&cmdline->legacy_windows_stdio,
1728 "PYTHONLEGACYWINDOWSSTDIO");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001729#endif
1730}
1731
1732
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001733/* Set global variable variables from environment variables */
1734void
1735_Py_Initialize_ReadEnvVarsNoAlloc(void)
1736{
Victor Stinnerddc163d2018-09-24 05:03:01 -07001737 _PyCmdline cmdline;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001738 memset(&cmdline, 0, sizeof(cmdline));
1739
1740 cmdline_get_global_config(&cmdline);
1741 if (cmdline.isolated) {
1742 Py_IgnoreEnvironmentFlag = 1;
1743 cmdline.no_user_site_directory = 1;
1744 }
1745 if (!Py_IgnoreEnvironmentFlag) {
1746 cmdline_get_env_flags(&cmdline);
1747 }
1748 cmdline_set_global_config(&cmdline);
1749
1750 /* no need to call pymain_clear_cmdline(), no memory has been allocated */
1751}
1752
1753
Victor Stinner46972b72017-11-24 22:55:40 +01001754static _PyInitError
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001755config_init_home(_PyCoreConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001756{
1757 wchar_t *home;
1758
Victor Stinner31a83932017-12-04 13:39:15 +01001759 /* If Py_SetPythonHome() was called, use its value */
1760 home = _Py_path_config.home;
Victor Stinner1f151112017-11-23 10:43:14 +01001761 if (home) {
Victor Stinner46972b72017-11-24 22:55:40 +01001762 config->home = _PyMem_RawWcsdup(home);
1763 if (config->home == NULL) {
1764 return _Py_INIT_NO_MEMORY();
Victor Stinner1f151112017-11-23 10:43:14 +01001765 }
Victor Stinner46972b72017-11-24 22:55:40 +01001766 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001767 }
1768
Victor Stinner46972b72017-11-24 22:55:40 +01001769 int res = config_get_env_var_dup(&home, L"PYTHONHOME", "PYTHONHOME");
Victor Stinner1f151112017-11-23 10:43:14 +01001770 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001771 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinner1f151112017-11-23 10:43:14 +01001772 }
Victor Stinner46972b72017-11-24 22:55:40 +01001773 config->home = home;
1774 return _Py_INIT_OK();
Victor Stinnerd4341102017-11-23 00:12:09 +01001775}
1776
1777
Victor Stinner358e5e12017-12-15 00:51:22 +01001778static _PyInitError
1779config_init_hash_seed(_PyCoreConfig *config)
1780{
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001781 const char *seed_text = config_get_env_var("PYTHONHASHSEED");
1782 int use_hash_seed;
1783 unsigned long hash_seed;
1784 if (_Py_ReadHashSeed(seed_text, &use_hash_seed, &hash_seed) < 0) {
1785 return _Py_INIT_USER_ERR("PYTHONHASHSEED must be \"random\" "
1786 "or an integer in range [0; 4294967295]");
Victor Stinner358e5e12017-12-15 00:51:22 +01001787 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001788 config->use_hash_seed = use_hash_seed;
1789 config->hash_seed = hash_seed;
Victor Stinner358e5e12017-12-15 00:51:22 +01001790 return _Py_INIT_OK();
1791}
1792
1793
Victor Stinner9cfc0022017-12-20 19:36:46 +01001794static _PyInitError
1795config_init_utf8_mode(_PyCoreConfig *config)
Victor Stinner91106cd2017-12-13 12:29:09 +01001796{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001797 const wchar_t *xopt = config_get_xoption(config, L"utf8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001798 if (xopt) {
1799 wchar_t *sep = wcschr(xopt, L'=');
1800 if (sep) {
1801 xopt = sep + 1;
1802 if (wcscmp(xopt, L"1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001803 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001804 }
1805 else if (wcscmp(xopt, L"0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001806 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001807 }
1808 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001809 return _Py_INIT_USER_ERR("invalid -X utf8 option value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001810 }
1811 }
1812 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001813 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001814 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001815 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001816 }
1817
Victor Stinner9cfc0022017-12-20 19:36:46 +01001818 const char *opt = config_get_env_var("PYTHONUTF8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001819 if (opt) {
1820 if (strcmp(opt, "1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001821 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001822 }
1823 else if (strcmp(opt, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001824 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001825 }
1826 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001827 return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment "
1828 "variable value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001829 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001830 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001831 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001832
1833 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001834}
Victor Stinner46972b72017-11-24 22:55:40 +01001835
1836
Victor Stinner9cfc0022017-12-20 19:36:46 +01001837static _PyInitError
1838config_read_env_vars(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001839{
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001840 assert(!config->ignore_environment);
1841
1842 if (config->allocator == NULL) {
1843 config->allocator = config_get_env_var("PYTHONMALLOC");
1844 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001845
Victor Stinner9cfc0022017-12-20 19:36:46 +01001846 if (config_get_env_var("PYTHONDUMPREFS")) {
1847 config->dump_refs = 1;
1848 }
1849 if (config_get_env_var("PYTHONMALLOCSTATS")) {
1850 config->malloc_stats = 1;
Victor Stinner31a83932017-12-04 13:39:15 +01001851 }
1852
Victor Stinner98c49c62018-08-29 01:13:29 +02001853 const char *env = config_get_env_var("PYTHONCOERCECLOCALE");
1854 if (env) {
1855 if (strcmp(env, "0") == 0) {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07001856 if (config->coerce_c_locale < 0) {
1857 config->coerce_c_locale = 0;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001858 }
Victor Stinner98c49c62018-08-29 01:13:29 +02001859 }
1860 else if (strcmp(env, "warn") == 0) {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07001861 config->coerce_c_locale_warn = 1;
Victor Stinner98c49c62018-08-29 01:13:29 +02001862 }
1863 else {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07001864 if (config->coerce_c_locale < 0) {
1865 config->coerce_c_locale = 1;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001866 }
Victor Stinner94540602017-12-16 04:54:22 +01001867 }
1868 }
1869
Victor Stinner9cfc0022017-12-20 19:36:46 +01001870 wchar_t *path;
1871 int res = config_get_env_var_dup(&path, L"PYTHONPATH", "PYTHONPATH");
1872 if (res < 0) {
Miss Islington (bot)6414da92018-05-19 16:14:42 -07001873 return DECODE_LOCALE_ERR("PYTHONPATH", res);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001874 }
1875 config->module_search_path_env = path;
1876
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001877 if (config->use_hash_seed < 0) {
1878 _PyInitError err = config_init_hash_seed(config);
1879 if (_Py_INIT_FAILED(err)) {
1880 return err;
1881 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001882 }
1883
1884 return _Py_INIT_OK();
1885}
1886
1887
1888static _PyInitError
1889config_read_complex_options(_PyCoreConfig *config)
1890{
1891 /* More complex options configured by env var and -X option */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001892 if (config->faulthandler < 0) {
1893 if (config_get_env_var("PYTHONFAULTHANDLER")
1894 || config_get_xoption(config, L"faulthandler")) {
1895 config->faulthandler = 1;
1896 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001897 }
1898 if (config_get_env_var("PYTHONPROFILEIMPORTTIME")
1899 || config_get_xoption(config, L"importtime")) {
1900 config->import_time = 1;
1901 }
1902 if (config_get_xoption(config, L"dev" ) ||
1903 config_get_env_var("PYTHONDEVMODE"))
1904 {
1905 config->dev_mode = 1;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001906 }
1907
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001908 if (config->tracemalloc < 0) {
1909 _PyInitError err = config_init_tracemalloc(config);
1910 if (_Py_INIT_FAILED(err)) {
1911 return err;
1912 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001913 }
1914 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001915}
1916
1917
Victor Stinnera7368ac2017-11-15 18:11:45 -08001918/* Parse command line options and environment variables.
1919 This code must not use Python runtime apart PyMem_Raw memory allocator.
1920
1921 Return 0 on success.
1922 Return 1 if Python is done and must exit.
1923 Set pymain->err and return -1 on error. */
1924static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07001925pymain_read_conf_impl(_PyMain *pymain, _PyCoreConfig *config,
1926 _PyCmdline *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001927{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001928 _PyInitError err;
1929
Victor Stinnerddc163d2018-09-24 05:03:01 -07001930 int res = pymain_parse_cmdline(pymain, config, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01001931 if (res != 0) {
1932 return res;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001933 }
1934
Victor Stinner9cfc0022017-12-20 19:36:46 +01001935 /* Set Py_IgnoreEnvironmentFlag for Py_GETENV() */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001936 Py_IgnoreEnvironmentFlag = config->ignore_environment || cmdline->isolated;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001937
1938 /* Get environment variables */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001939 if (!Py_IgnoreEnvironmentFlag) {
1940 cmdline_get_env_flags(cmdline);
1941 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001942
1943 err = cmdline_init_env_warnoptions(cmdline);
1944 if (_Py_INIT_FAILED(err)) {
1945 pymain->err = err;
1946 return -1;
1947 }
1948
1949#ifdef MS_WINDOWS
1950 if (cmdline->legacy_windows_fs_encoding) {
1951 config->utf8_mode = 0;
1952 }
1953#endif
1954
Victor Stinnerddc163d2018-09-24 05:03:01 -07001955 if (pymain_init_core_argv(pymain, config, cmdline) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01001956 return -1;
1957 }
1958
Victor Stinner2b822a02018-01-25 09:18:36 +01001959 /* On Windows, _PyPathConfig_Init() modifies Py_IsolatedFlag and
1960 Py_NoSiteFlag variables if a "._pth" file is found. */
1961 int init_isolated = Py_IsolatedFlag;
1962 int init_no_site = Py_NoSiteFlag;
1963 Py_IsolatedFlag = cmdline->isolated;
1964 Py_NoSiteFlag = cmdline->no_site_import;
Victor Stinner8ded5b82018-01-24 17:03:28 +01001965
Victor Stinner9cfc0022017-12-20 19:36:46 +01001966 err = _PyCoreConfig_Read(config);
Victor Stinner2b822a02018-01-25 09:18:36 +01001967
1968 cmdline->isolated = Py_IsolatedFlag;
1969 cmdline->no_site_import = Py_NoSiteFlag;
1970 Py_IsolatedFlag = init_isolated;
1971 Py_NoSiteFlag = init_no_site;
1972
Victor Stinner31a83932017-12-04 13:39:15 +01001973 if (_Py_INIT_FAILED(err)) {
1974 pymain->err = err;
1975 return -1;
1976 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001977 return 0;
1978}
1979
1980
Victor Stinner19760862017-12-20 01:41:59 +01001981/* Read the configuration, but initialize also the LC_CTYPE locale:
1982 enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538) */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001983static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07001984pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, _PyCmdline *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001985{
Victor Stinner80a0eba2018-08-23 12:41:35 +02001986 int init_utf8_mode = Py_UTF8Mode;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001987 _PyCoreConfig save_config = _PyCoreConfig_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01001988 int res = -1;
1989
Victor Stinner94540602017-12-16 04:54:22 +01001990 char *oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
1991 if (oldloc == NULL) {
1992 pymain->err = _Py_INIT_NO_MEMORY();
1993 goto done;
1994 }
1995
1996 /* Reconfigure the locale to the default for this process */
1997 _Py_SetLocaleFromEnv(LC_ALL);
1998
1999 int locale_coerced = 0;
2000 int loops = 0;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002001 int init_ignore_env = config->ignore_environment;
2002
2003 if (_PyCoreConfig_Copy(&save_config, config) < 0) {
2004 pymain->err = _Py_INIT_NO_MEMORY();
2005 goto done;
2006 }
Victor Stinner94540602017-12-16 04:54:22 +01002007
2008 while (1) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002009 int init_utf8_mode = config->utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002010 int encoding_changed = 0;
2011
2012 /* Watchdog to prevent an infinite loop */
2013 loops++;
2014 if (loops == 3) {
2015 pymain->err = _Py_INIT_ERR("Encoding changed twice while "
2016 "reading the configuration");
2017 goto done;
2018 }
2019
Victor Stinner80a0eba2018-08-23 12:41:35 +02002020 /* bpo-34207: Py_DecodeLocale(), Py_EncodeLocale() and similar
2021 functions depend on Py_UTF8Mode. */
2022 Py_UTF8Mode = config->utf8_mode;
2023
Victor Stinnerddc163d2018-09-24 05:03:01 -07002024 if (pymain_init_cmdline_argv(pymain, config, cmdline) < 0) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01002025 goto done;
Victor Stinner94540602017-12-16 04:54:22 +01002026 }
2027
Victor Stinnerddc163d2018-09-24 05:03:01 -07002028 int conf_res = pymain_read_conf_impl(pymain, config, cmdline);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002029 if (conf_res != 0) {
2030 res = conf_res;
Victor Stinner94540602017-12-16 04:54:22 +01002031 goto done;
2032 }
2033
2034 /* The legacy C locale assumes ASCII as the default text encoding, which
2035 * causes problems not only for the CPython runtime, but also other
2036 * components like GNU readline.
2037 *
2038 * Accordingly, when the CLI detects it, it attempts to coerce it to a
2039 * more capable UTF-8 based alternative.
2040 *
2041 * See the documentation of the PYTHONCOERCECLOCALE setting for more
2042 * details.
2043 */
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002044 if (config->coerce_c_locale && !locale_coerced) {
Victor Stinner94540602017-12-16 04:54:22 +01002045 locale_coerced = 1;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002046 _Py_CoerceLegacyLocale(config);
Victor Stinner94540602017-12-16 04:54:22 +01002047 encoding_changed = 1;
2048 }
2049
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002050 if (init_utf8_mode == -1) {
2051 if (config->utf8_mode == 1) {
Victor Stinner94540602017-12-16 04:54:22 +01002052 /* UTF-8 Mode enabled */
2053 encoding_changed = 1;
2054 }
2055 }
2056 else {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002057 if (config->utf8_mode != init_utf8_mode) {
Victor Stinner94540602017-12-16 04:54:22 +01002058 encoding_changed = 1;
2059 }
2060 }
2061
2062 if (!encoding_changed) {
2063 break;
2064 }
2065
2066 /* Reset the configuration, except UTF-8 Mode. Set Py_UTF8Mode for
2067 Py_DecodeLocale(). Reset Py_IgnoreEnvironmentFlag, modified by
Victor Stinner8ded5b82018-01-24 17:03:28 +01002068 pymain_read_conf_impl(). Reset Py_IsolatedFlag and Py_NoSiteFlag
2069 modified by _PyCoreConfig_Read(). */
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002070 int new_utf8_mode = config->utf8_mode;
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002071 int new_coerce_c_locale = config->coerce_c_locale;
Victor Stinner94540602017-12-16 04:54:22 +01002072 Py_IgnoreEnvironmentFlag = init_ignore_env;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002073 if (_PyCoreConfig_Copy(config, &save_config) < 0) {
2074 pymain->err = _Py_INIT_NO_MEMORY();
2075 goto done;
2076 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002077 pymain_clear_cmdline(pymain, cmdline);
Miss Islington (bot)046da162018-06-15 15:26:29 -07002078 memset(cmdline, 0, sizeof(*cmdline));
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002079
2080 cmdline_get_global_config(cmdline);
2081 _PyCoreConfig_GetGlobalConfig(config);
2082 config->utf8_mode = new_utf8_mode;
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002083 config->coerce_c_locale = new_coerce_c_locale;
Victor Stinner94540602017-12-16 04:54:22 +01002084
2085 /* The encoding changed: read again the configuration
2086 with the new encoding */
2087 }
2088 res = 0;
2089
2090done:
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002091 _PyCoreConfig_Clear(&save_config);
Victor Stinner94540602017-12-16 04:54:22 +01002092 if (oldloc != NULL) {
2093 setlocale(LC_ALL, oldloc);
2094 PyMem_RawFree(oldloc);
2095 }
Victor Stinner80a0eba2018-08-23 12:41:35 +02002096 Py_UTF8Mode = init_utf8_mode ;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002097 return res;
2098}
2099
Victor Stinner91106cd2017-12-13 12:29:09 +01002100
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002101static void
2102config_init_locale(_PyCoreConfig *config)
Victor Stinner9cfc0022017-12-20 19:36:46 +01002103{
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002104 if (config->coerce_c_locale < 0) {
Victor Stinner144f1e22018-09-17 18:01:39 -07002105 /* The C locale enables the C locale coercion (PEP 538) */
2106 if (_Py_LegacyLocaleDetected()) {
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002107 config->coerce_c_locale = 1;
Victor Stinner144f1e22018-09-17 18:01:39 -07002108 }
2109 }
2110
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002111#ifndef MS_WINDOWS
2112 if (config->utf8_mode < 0) {
2113 /* The C locale and the POSIX locale enable the UTF-8 Mode (PEP 540) */
2114 const char *ctype_loc = setlocale(LC_CTYPE, NULL);
2115 if (ctype_loc != NULL
2116 && (strcmp(ctype_loc, "C") == 0
2117 || strcmp(ctype_loc, "POSIX") == 0))
2118 {
2119 config->utf8_mode = 1;
2120 }
2121 }
2122#endif
Victor Stinner9cfc0022017-12-20 19:36:46 +01002123}
2124
2125
Victor Stinner8ded5b82018-01-24 17:03:28 +01002126static _PyInitError
2127config_init_module_search_paths(_PyCoreConfig *config)
2128{
2129 assert(config->module_search_paths == NULL);
2130 assert(config->nmodule_search_path < 0);
2131
2132 config->nmodule_search_path = 0;
2133
2134 const wchar_t *sys_path = Py_GetPath();
2135 const wchar_t delim = DELIM;
2136 const wchar_t *p = sys_path;
2137 while (1) {
2138 p = wcschr(sys_path, delim);
2139 if (p == NULL) {
2140 p = sys_path + wcslen(sys_path); /* End of string */
2141 }
2142
2143 size_t path_len = (p - sys_path);
2144 wchar_t *path = PyMem_RawMalloc((path_len + 1) * sizeof(wchar_t));
2145 if (path == NULL) {
2146 return _Py_INIT_NO_MEMORY();
2147 }
2148 memcpy(path, sys_path, path_len * sizeof(wchar_t));
2149 path[path_len] = L'\0';
2150
2151 _PyInitError err = wstrlist_append(&config->nmodule_search_path,
2152 &config->module_search_paths,
2153 path);
2154 PyMem_RawFree(path);
2155 if (_Py_INIT_FAILED(err)) {
2156 return err;
2157 }
2158
2159 if (*p == '\0') {
2160 break;
2161 }
2162 sys_path = p + 1;
2163 }
2164 return _Py_INIT_OK();
2165}
2166
2167
2168static _PyInitError
2169config_init_path_config(_PyCoreConfig *config)
2170{
2171 _PyInitError err = _PyPathConfig_Init(config);
2172 if (_Py_INIT_FAILED(err)) {
2173 return err;
2174 }
2175
2176 if (config->nmodule_search_path < 0) {
2177 err = config_init_module_search_paths(config);
2178 if (_Py_INIT_FAILED(err)) {
2179 return err;
2180 }
2181 }
2182
2183 if (config->executable == NULL) {
2184 config->executable = _PyMem_RawWcsdup(Py_GetProgramFullPath());
2185 if (config->executable == NULL) {
2186 return _Py_INIT_NO_MEMORY();
2187 }
2188 }
2189
2190 if (config->prefix == NULL) {
2191 config->prefix = _PyMem_RawWcsdup(Py_GetPrefix());
2192 if (config->prefix == NULL) {
2193 return _Py_INIT_NO_MEMORY();
2194 }
2195 }
2196
2197 if (config->exec_prefix == NULL) {
2198 config->exec_prefix = _PyMem_RawWcsdup(Py_GetExecPrefix());
2199 if (config->exec_prefix == NULL) {
2200 return _Py_INIT_NO_MEMORY();
2201 }
2202 }
2203
2204 if (config->base_prefix == NULL) {
2205 config->base_prefix = _PyMem_RawWcsdup(config->prefix);
2206 if (config->base_prefix == NULL) {
2207 return _Py_INIT_NO_MEMORY();
2208 }
2209 }
2210
2211 if (config->base_exec_prefix == NULL) {
2212 config->base_exec_prefix = _PyMem_RawWcsdup(config->exec_prefix);
2213 if (config->base_exec_prefix == NULL) {
2214 return _Py_INIT_NO_MEMORY();
2215 }
2216 }
2217
2218 return _Py_INIT_OK();
2219}
2220
Victor Stinnerda273412017-12-15 01:46:02 +01002221/* Read configuration settings from standard locations
2222 *
2223 * This function doesn't make any changes to the interpreter state - it
2224 * merely populates any missing configuration settings. This allows an
2225 * embedding application to completely override a config option by
2226 * setting it before calling this function, or else modify the default
2227 * setting before passing the fully populated config to Py_EndInitialization.
2228 *
2229 * More advanced selective initialization tricks are possible by calling
2230 * this function multiple times with various preconfigured settings.
2231 */
2232
2233_PyInitError
2234_PyCoreConfig_Read(_PyCoreConfig *config)
2235{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002236 _PyInitError err;
2237
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002238 _PyCoreConfig_GetGlobalConfig(config);
2239
2240 assert(config->ignore_environment >= 0);
2241 if (!config->ignore_environment) {
2242 err = config_read_env_vars(config);
2243 if (_Py_INIT_FAILED(err)) {
2244 return err;
2245 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002246 }
2247
Victor Stinner9cfc0022017-12-20 19:36:46 +01002248 /* -X options */
2249 if (config_get_xoption(config, L"showrefcount")) {
2250 config->show_ref_count = 1;
2251 }
2252 if (config_get_xoption(config, L"showalloccount")) {
2253 config->show_alloc_count = 1;
2254 }
2255
2256 err = config_read_complex_options(config);
2257 if (_Py_INIT_FAILED(err)) {
2258 return err;
2259 }
2260
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002261 if (config->utf8_mode < 0) {
2262 err = config_init_utf8_mode(config);
2263 if (_Py_INIT_FAILED(err)) {
2264 return err;
2265 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002266 }
2267
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002268 if (config->home == NULL) {
2269 err = config_init_home(config);
2270 if (_Py_INIT_FAILED(err)) {
2271 return err;
2272 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002273 }
2274
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002275 if (config->program_name == NULL) {
2276 err = config_init_program_name(config);
2277 if (_Py_INIT_FAILED(err)) {
2278 return err;
2279 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002280 }
2281
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002282 if (config->utf8_mode < 0 || config->coerce_c_locale < 0) {
2283 config_init_locale(config);
Victor Stinner94540602017-12-16 04:54:22 +01002284 }
2285
Victor Stinner8ded5b82018-01-24 17:03:28 +01002286 if (!config->_disable_importlib) {
2287 err = config_init_path_config(config);
2288 if (_Py_INIT_FAILED(err)) {
2289 return err;
2290 }
2291 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002292
2293 /* default values */
2294 if (config->dev_mode) {
2295 if (config->faulthandler < 0) {
2296 config->faulthandler = 1;
2297 }
2298 if (config->allocator == NULL) {
2299 config->allocator = "debug";
2300 }
2301 }
2302 if (config->install_signal_handlers < 0) {
2303 config->install_signal_handlers = 1;
2304 }
2305 if (config->use_hash_seed < 0) {
2306 config->use_hash_seed = 0;
2307 config->hash_seed = 0;
2308 }
2309 if (config->faulthandler < 0) {
2310 config->faulthandler = 0;
2311 }
2312 if (config->tracemalloc < 0) {
2313 config->tracemalloc = 0;
2314 }
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002315 if (config->coerce_c_locale < 0) {
2316 config->coerce_c_locale = 0;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002317 }
2318 if (config->utf8_mode < 0) {
2319 config->utf8_mode = 0;
2320 }
2321 if (config->argc < 0) {
2322 config->argc = 0;
2323 }
2324
Victor Stinnerda273412017-12-15 01:46:02 +01002325 return _Py_INIT_OK();
2326}
2327
2328
2329void
2330_PyCoreConfig_Clear(_PyCoreConfig *config)
2331{
2332#define CLEAR(ATTR) \
2333 do { \
2334 PyMem_RawFree(ATTR); \
2335 ATTR = NULL; \
2336 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002337#define CLEAR_WSTRLIST(LEN, LIST) \
2338 do { \
2339 clear_wstrlist(LEN, LIST); \
2340 LEN = 0; \
2341 LIST = NULL; \
2342 } while (0)
Victor Stinnerda273412017-12-15 01:46:02 +01002343
2344 CLEAR(config->module_search_path_env);
2345 CLEAR(config->home);
2346 CLEAR(config->program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002347 CLEAR(config->program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002348
Victor Stinner8ded5b82018-01-24 17:03:28 +01002349 CLEAR_WSTRLIST(config->argc, config->argv);
2350 config->argc = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002351
Victor Stinner8ded5b82018-01-24 17:03:28 +01002352 CLEAR_WSTRLIST(config->nwarnoption, config->warnoptions);
2353 CLEAR_WSTRLIST(config->nxoption, config->xoptions);
2354 CLEAR_WSTRLIST(config->nmodule_search_path, config->module_search_paths);
2355 config->nmodule_search_path = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002356
Victor Stinner8ded5b82018-01-24 17:03:28 +01002357 CLEAR(config->executable);
2358 CLEAR(config->prefix);
2359 CLEAR(config->base_prefix);
2360 CLEAR(config->exec_prefix);
2361 CLEAR(config->base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002362#undef CLEAR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002363#undef CLEAR_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002364}
2365
2366
2367int
2368_PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
2369{
2370 _PyCoreConfig_Clear(config);
2371
2372#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
Victor Stinnerc4bca952017-12-19 23:48:17 +01002373#define COPY_STR_ATTR(ATTR) \
2374 do { \
2375 if (config2->ATTR != NULL) { \
2376 config->ATTR = _PyMem_RawWcsdup(config2->ATTR); \
2377 if (config->ATTR == NULL) { \
2378 return -1; \
2379 } \
2380 } \
2381 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002382#define COPY_WSTRLIST(LEN, LIST) \
2383 do { \
2384 if (config2->LIST != NULL) { \
2385 config->LIST = copy_wstrlist(config2->LEN, config2->LIST); \
2386 if (config->LIST == NULL) { \
2387 return -1; \
2388 } \
2389 } \
2390 config->LEN = config2->LEN; \
2391 } while (0)
Victor Stinnerc4bca952017-12-19 23:48:17 +01002392
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002393 COPY_ATTR(install_signal_handlers);
Victor Stinnerda273412017-12-15 01:46:02 +01002394 COPY_ATTR(ignore_environment);
2395 COPY_ATTR(use_hash_seed);
2396 COPY_ATTR(hash_seed);
2397 COPY_ATTR(_disable_importlib);
2398 COPY_ATTR(allocator);
2399 COPY_ATTR(dev_mode);
2400 COPY_ATTR(faulthandler);
2401 COPY_ATTR(tracemalloc);
2402 COPY_ATTR(import_time);
2403 COPY_ATTR(show_ref_count);
2404 COPY_ATTR(show_alloc_count);
2405 COPY_ATTR(dump_refs);
2406 COPY_ATTR(malloc_stats);
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002407
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002408 COPY_ATTR(coerce_c_locale);
2409 COPY_ATTR(coerce_c_locale_warn);
Victor Stinnerda273412017-12-15 01:46:02 +01002410 COPY_ATTR(utf8_mode);
Victor Stinnerda273412017-12-15 01:46:02 +01002411
2412 COPY_STR_ATTR(module_search_path_env);
2413 COPY_STR_ATTR(home);
2414 COPY_STR_ATTR(program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002415 COPY_STR_ATTR(program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002416
Victor Stinner8ded5b82018-01-24 17:03:28 +01002417 COPY_WSTRLIST(argc, argv);
2418 COPY_WSTRLIST(nwarnoption, warnoptions);
2419 COPY_WSTRLIST(nxoption, xoptions);
2420 COPY_WSTRLIST(nmodule_search_path, module_search_paths);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002421
Victor Stinner8ded5b82018-01-24 17:03:28 +01002422 COPY_STR_ATTR(executable);
2423 COPY_STR_ATTR(prefix);
2424 COPY_STR_ATTR(base_prefix);
2425 COPY_STR_ATTR(exec_prefix);
2426 COPY_STR_ATTR(base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002427
Victor Stinnerc4bca952017-12-19 23:48:17 +01002428#undef COPY_ATTR
Victor Stinnerda273412017-12-15 01:46:02 +01002429#undef COPY_STR_ATTR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002430#undef COPY_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002431 return 0;
2432}
2433
2434
2435void
2436_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config)
2437{
2438 Py_CLEAR(config->argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002439 Py_CLEAR(config->executable);
2440 Py_CLEAR(config->prefix);
2441 Py_CLEAR(config->base_prefix);
2442 Py_CLEAR(config->exec_prefix);
2443 Py_CLEAR(config->base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002444 Py_CLEAR(config->warnoptions);
2445 Py_CLEAR(config->xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002446 Py_CLEAR(config->module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002447}
2448
2449
2450static PyObject*
2451config_copy_attr(PyObject *obj)
2452{
2453 if (PyUnicode_Check(obj)) {
2454 Py_INCREF(obj);
2455 return obj;
2456 }
2457 else if (PyList_Check(obj)) {
2458 return PyList_GetSlice(obj, 0, Py_SIZE(obj));
2459 }
2460 else if (PyDict_Check(obj)) {
2461 /* The dict type is used for xoptions. Make the assumption that keys
2462 and values are immutables */
2463 return PyDict_Copy(obj);
2464 }
2465 else {
2466 PyErr_Format(PyExc_TypeError,
2467 "cannot copy config attribute of type %.200s",
2468 Py_TYPE(obj)->tp_name);
2469 return NULL;
2470 }
2471}
2472
2473
2474int
2475_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config,
2476 const _PyMainInterpreterConfig *config2)
2477{
2478 _PyMainInterpreterConfig_Clear(config);
2479
2480#define COPY_ATTR(ATTR) \
2481 do { \
2482 if (config2->ATTR != NULL) { \
2483 config->ATTR = config_copy_attr(config2->ATTR); \
2484 if (config->ATTR == NULL) { \
2485 return -1; \
2486 } \
2487 } \
2488 } while (0)
2489
2490 COPY_ATTR(argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002491 COPY_ATTR(executable);
2492 COPY_ATTR(prefix);
2493 COPY_ATTR(base_prefix);
2494 COPY_ATTR(exec_prefix);
2495 COPY_ATTR(base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002496 COPY_ATTR(warnoptions);
2497 COPY_ATTR(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002498 COPY_ATTR(module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002499#undef COPY_ATTR
2500 return 0;
2501}
2502
2503
2504
2505
Victor Stinner41264f12017-12-15 02:05:29 +01002506_PyInitError
Victor Stinner9cfc0022017-12-20 19:36:46 +01002507_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config,
2508 const _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002509{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002510 if (main_config->install_signal_handlers < 0) {
2511 main_config->install_signal_handlers = config->install_signal_handlers;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002512 }
2513
Victor Stinner9cfc0022017-12-20 19:36:46 +01002514 if (main_config->xoptions == NULL) {
2515 main_config->xoptions = config_create_xoptions_dict(config);
2516 if (main_config->xoptions == NULL) {
2517 return _Py_INIT_NO_MEMORY();
2518 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002519 }
2520
Victor Stinner8ded5b82018-01-24 17:03:28 +01002521#define COPY_WSTR(ATTR) \
2522 do { \
2523 if (main_config->ATTR == NULL) { \
2524 main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \
2525 if (main_config->ATTR == NULL) { \
2526 return _Py_INIT_NO_MEMORY(); \
2527 } \
2528 } \
2529 } while (0)
2530#define COPY_WSTRLIST(ATTR, LEN, LIST) \
2531 do { \
2532 if (ATTR == NULL) { \
2533 ATTR = wstrlist_as_pylist(LEN, LIST); \
2534 if (ATTR == NULL) { \
2535 return _Py_INIT_NO_MEMORY(); \
2536 } \
2537 } \
2538 } while (0)
2539
2540 COPY_WSTRLIST(main_config->warnoptions,
2541 config->nwarnoption, config->warnoptions);
2542 if (config->argc >= 0) {
2543 COPY_WSTRLIST(main_config->argv,
2544 config->argc, config->argv);
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002545 }
2546
Victor Stinner8ded5b82018-01-24 17:03:28 +01002547 if (!config->_disable_importlib) {
2548 COPY_WSTR(executable);
2549 COPY_WSTR(prefix);
2550 COPY_WSTR(base_prefix);
2551 COPY_WSTR(exec_prefix);
2552 COPY_WSTR(base_exec_prefix);
2553
2554 COPY_WSTRLIST(main_config->module_search_path,
2555 config->nmodule_search_path, config->module_search_paths);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002556 }
Victor Stinner41264f12017-12-15 02:05:29 +01002557
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002558 return _Py_INIT_OK();
Victor Stinner8ded5b82018-01-24 17:03:28 +01002559#undef COPY_WSTR
2560#undef COPY_WSTRLIST
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002561}
2562
2563
2564static int
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002565pymain_init_python_main(_PyMain *pymain, PyInterpreterState *interp)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002566{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002567 _PyInitError err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002568
Victor Stinner9cfc0022017-12-20 19:36:46 +01002569 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002570 err = _PyMainInterpreterConfig_Read(&main_config, &interp->core_config);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002571 if (!_Py_INIT_FAILED(err)) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002572 err = _Py_InitializeMainInterpreter(interp, &main_config);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002573 }
2574 _PyMainInterpreterConfig_Clear(&main_config);
2575
2576 if (_Py_INIT_FAILED(err)) {
2577 pymain->err = err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002578 return -1;
2579 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002580 return 0;
2581}
Victor Stinnera7368ac2017-11-15 18:11:45 -08002582
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002583
2584static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002585pymain_init_sys_path(_PyMain *pymain, _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002586{
Victor Stinnerca719ac2017-12-20 18:00:19 +01002587 if (pymain->filename != NULL) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002588 /* If filename is a package (ex: directory or ZIP file) which contains
2589 __main__.py, main_importer_path is set to filename and will be
2590 prepended to sys.path by pymain_run_main_from_importer(). Otherwise,
2591 main_importer_path is set to NULL. */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002592 pymain->main_importer_path = pymain_get_importer(pymain->filename);
Victor Stinnerd5dda982017-12-13 17:31:16 +01002593 }
2594
Victor Stinner19760862017-12-20 01:41:59 +01002595 PyObject *path0;
Victor Stinnerddc163d2018-09-24 05:03:01 -07002596 if (pymain_compute_path0(pymain, config, &path0) < 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002597 return -1;
2598 }
Victor Stinner19760862017-12-20 01:41:59 +01002599
Victor Stinner19760862017-12-20 01:41:59 +01002600 if (path0 != NULL) {
2601 if (pymain_update_sys_path(pymain, path0) < 0) {
2602 Py_DECREF(path0);
2603 return -1;
2604 }
2605 Py_DECREF(path0);
2606 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002607 return 0;
2608}
2609
2610
2611static void
2612pymain_run_python(_PyMain *pymain)
2613{
Victor Stinner19760862017-12-20 01:41:59 +01002614 PyCompilerFlags cf = {.cf_flags = 0};
Victor Stinnera7368ac2017-11-15 18:11:45 -08002615
2616 pymain_header(pymain);
2617 pymain_import_readline(pymain);
2618
Victor Stinnerca719ac2017-12-20 18:00:19 +01002619 if (pymain->command) {
2620 pymain->status = pymain_run_command(pymain->command, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002621 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002622 else if (pymain->module) {
2623 pymain->status = (pymain_run_module(pymain->module, 1) != 0);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002624 }
2625 else {
Victor Stinner19760862017-12-20 01:41:59 +01002626 pymain_run_filename(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002627 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002628
Victor Stinner19760862017-12-20 01:41:59 +01002629 pymain_repl(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002630}
2631
2632
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002633static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002634pymain_cmdline_impl(_PyMain *pymain, _PyCoreConfig *config,
2635 _PyCmdline *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002636{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002637 pymain->err = _PyRuntime_Initialize();
2638 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002639 return -1;
2640 }
2641
Victor Stinnerddc163d2018-09-24 05:03:01 -07002642 int res = pymain_read_conf(pymain, config, cmdline);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002643 if (res < 0) {
2644 return -1;
2645 }
2646 if (res > 0) {
2647 /* --help or --version command: we are done */
Victor Stinner19760862017-12-20 01:41:59 +01002648 return 1;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002649 }
2650
Victor Stinner94540602017-12-16 04:54:22 +01002651 if (cmdline->print_help) {
Victor Stinnerddc163d2018-09-24 05:03:01 -07002652 pymain_usage(0, config->program);
Victor Stinner19760862017-12-20 01:41:59 +01002653 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002654 }
2655
2656 if (cmdline->print_version) {
2657 printf("Python %s\n",
2658 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
Victor Stinner19760862017-12-20 01:41:59 +01002659 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002660 }
2661
Victor Stinnerc4bca952017-12-19 23:48:17 +01002662 /* For Py_GetArgcArgv(). Cleared by pymain_free(). */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002663 orig_argv = copy_wstrlist(pymain->argc, cmdline->argv);
2664 if (orig_argv == NULL) {
2665 pymain->err = _Py_INIT_NO_MEMORY();
2666 return -1;
2667 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01002668 orig_argc = pymain->argc;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002669
Victor Stinnerddc163d2018-09-24 05:03:01 -07002670 _PyInitError err = config_init_warnoptions(config, cmdline);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002671 if (_Py_INIT_FAILED(err)) {
2672 pymain->err = err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002673 return -1;
2674 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002675 return 0;
2676}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00002677
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002678
Victor Stinnerca719ac2017-12-20 18:00:19 +01002679/* Read the configuration into _PyCoreConfig and _PyMain, initialize the
2680 LC_CTYPE locale and Py_DecodeLocale().
2681
2682 Configuration:
2683
2684 * Command line arguments
2685 * Environment variables
2686 * Py_xxx global configuration variables
2687
Victor Stinnerddc163d2018-09-24 05:03:01 -07002688 _PyCmdline is a temporary structure used to prioritize these
Victor Stinnerca719ac2017-12-20 18:00:19 +01002689 variables. */
2690static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002691pymain_cmdline(_PyMain *pymain, _PyCoreConfig *config)
Victor Stinnerca719ac2017-12-20 18:00:19 +01002692{
Victor Stinner31e99082017-12-20 23:41:38 +01002693 /* Force default allocator, since pymain_free() and pymain_clear_config()
2694 must use the same allocator than this function. */
2695 PyMemAllocatorEx old_alloc;
2696 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2697#ifdef Py_DEBUG
2698 PyMemAllocatorEx default_alloc;
2699 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &default_alloc);
2700#endif
2701
Victor Stinnerddc163d2018-09-24 05:03:01 -07002702 _PyCmdline cmdline;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002703 memset(&cmdline, 0, sizeof(cmdline));
2704
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002705 cmdline_get_global_config(&cmdline);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002706
Victor Stinnerddc163d2018-09-24 05:03:01 -07002707 int res = pymain_cmdline_impl(pymain, config, &cmdline);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002708
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002709 cmdline_set_global_config(&cmdline);
Victor Stinnerddc163d2018-09-24 05:03:01 -07002710 _PyCoreConfig_SetGlobalConfig(config);
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002711 if (Py_IsolatedFlag) {
2712 Py_IgnoreEnvironmentFlag = 1;
2713 Py_NoUserSiteDirectory = 1;
2714 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002715
2716 pymain_clear_cmdline(pymain, &cmdline);
Victor Stinner31e99082017-12-20 23:41:38 +01002717
2718#ifdef Py_DEBUG
2719 /* Make sure that PYMEM_DOMAIN_RAW has not been modified */
2720 PyMemAllocatorEx cur_alloc;
2721 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &cur_alloc);
2722 assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0);
2723#endif
2724 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002725 return res;
2726}
2727
2728
Victor Stinner94540602017-12-16 04:54:22 +01002729static int
Victor Stinnerddc163d2018-09-24 05:03:01 -07002730pymain_init(_PyMain *pymain)
Victor Stinner94540602017-12-16 04:54:22 +01002731{
Victor Stinnerddc163d2018-09-24 05:03:01 -07002732 _PyCoreConfig local_config = _PyCoreConfig_INIT;
2733 _PyCoreConfig *config = &local_config;
Victor Stinner94540602017-12-16 04:54:22 +01002734
Victor Stinnerddc163d2018-09-24 05:03:01 -07002735 /* 754 requires that FP exceptions run in "no stop" mode by default,
2736 * and until C vendors implement C99's ways to control FP exceptions,
2737 * Python requires non-stop mode. Alas, some platforms enable FP
2738 * exceptions by default. Here we disable them.
2739 */
2740#ifdef __FreeBSD__
2741 fedisableexcept(FE_OVERFLOW);
2742#endif
2743
2744 config->_disable_importlib = 0;
2745 config->install_signal_handlers = 1;
2746 _PyCoreConfig_GetGlobalConfig(config);
2747
2748 int res = pymain_cmdline(pymain, config);
Victor Stinner19760862017-12-20 01:41:59 +01002749 if (res < 0) {
Victor Stinner94540602017-12-16 04:54:22 +01002750 _Py_FatalInitError(pymain->err);
2751 }
Victor Stinner19760862017-12-20 01:41:59 +01002752 if (res == 1) {
Victor Stinnerddc163d2018-09-24 05:03:01 -07002753 pymain_clear_config(&local_config);
2754 return res;
Victor Stinner19760862017-12-20 01:41:59 +01002755 }
2756
Victor Stinner9cfc0022017-12-20 19:36:46 +01002757 pymain_init_stdio(pymain);
2758
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002759 PyInterpreterState *interp;
Victor Stinnerddc163d2018-09-24 05:03:01 -07002760 pymain->err = _Py_InitializeCore(&interp, config);
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002761 if (_Py_INIT_FAILED(pymain->err)) {
2762 _Py_FatalInitError(pymain->err);
Victor Stinner19760862017-12-20 01:41:59 +01002763 }
2764
Victor Stinnerddc163d2018-09-24 05:03:01 -07002765 pymain_clear_config(&local_config);
2766 config = &interp->core_config;
2767
Victor Stinner0c90d6f2018-08-05 12:31:59 +02002768 if (pymain_init_python_main(pymain, interp) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01002769 _Py_FatalInitError(pymain->err);
2770 }
2771
Victor Stinnerddc163d2018-09-24 05:03:01 -07002772 if (pymain_init_sys_path(pymain, config) < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002773 _Py_FatalInitError(pymain->err);
2774 }
Victor Stinnerddc163d2018-09-24 05:03:01 -07002775 return 0;
2776}
2777
2778
2779static int
2780pymain_main(_PyMain *pymain)
2781{
2782 int res = pymain_init(pymain);
2783 if (res == 1) {
2784 goto done;
2785 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002786
Victor Stinner19760862017-12-20 01:41:59 +01002787 pymain_run_python(pymain);
2788
2789 if (Py_FinalizeEx() < 0) {
2790 /* Value unlikely to be confused with a non-error exit status or
2791 other special meaning */
2792 pymain->status = 120;
2793 }
2794
2795done:
Victor Stinner94540602017-12-16 04:54:22 +01002796 pymain_free(pymain);
2797
Victor Stinner94540602017-12-16 04:54:22 +01002798 return pymain->status;
2799}
2800
2801
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002802int
2803Py_Main(int argc, wchar_t **argv)
2804{
2805 _PyMain pymain = _PyMain_INIT;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002806 pymain.use_bytes_argv = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002807 pymain.argc = argc;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002808 pymain.wchar_argv = argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002809
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002810 return pymain_main(&pymain);
Guido van Rossum667d7041995-08-04 04:20:48 +00002811}
2812
Victor Stinner94540602017-12-16 04:54:22 +01002813
2814int
2815_Py_UnixMain(int argc, char **argv)
2816{
2817 _PyMain pymain = _PyMain_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01002818 pymain.use_bytes_argv = 1;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002819 pymain.argc = argc;
Victor Stinner94540602017-12-16 04:54:22 +01002820 pymain.bytes_argv = argv;
2821
Victor Stinner95cc3ee2018-09-19 12:01:52 -07002822 return pymain_main(&pymain);
Victor Stinner94540602017-12-16 04:54:22 +01002823}
2824
2825
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002826/* this is gonna seem *real weird*, but if you put some other code between
2827 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
2828 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00002829
Guido van Rossum667d7041995-08-04 04:20:48 +00002830/* Make the *original* argc/argv available to other modules.
2831 This is rare, but it is needed by the secureware extension. */
2832
2833void
Martin v. Löwis790465f2008-04-05 20:41:37 +00002834Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00002835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 *argc = orig_argc;
2837 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00002838}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002839
2840#ifdef __cplusplus
2841}
2842#endif