blob: 1f1bf53ed48596ed6ecb9b490bedb4e2b745e5ea [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001/* Python interpreter main program */
2
3#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +00004#include "osdefs.h"
Benjamin Peterson42aa93b2017-12-09 10:26:52 -08005#include "internal/import.h"
Benjamin Petersone425bd72017-12-14 23:48:12 -08006#include "internal/pygetopt.h"
Victor Stinnerf7e5b562017-11-15 15:48:08 -08007#include "internal/pystate.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00008
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00009#include <locale.h>
10
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +000011#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner6efcb6d2017-12-18 23:42:55 +010012# include <windows.h>
13# ifdef HAVE_IO_H
14# include <io.h>
15# endif
16# ifdef HAVE_FCNTL_H
17# include <fcntl.h>
18# endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000019#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000020
Martin v. Löwis945362c2007-08-30 14:57:25 +000021#ifdef _MSC_VER
Victor Stinner6efcb6d2017-12-18 23:42:55 +010022# include <crtdbg.h>
23#endif
24
25#ifdef __FreeBSD__
26# include <fenv.h>
Martin v. Löwis945362c2007-08-30 14:57:25 +000027#endif
28
Jesus Ceaab70e2a2012-10-05 01:48:08 +020029#if defined(MS_WINDOWS)
Victor Stinner6efcb6d2017-12-18 23:42:55 +010030# define PYTHONHOMEHELP "<prefix>\\python{major}{minor}"
Guido van Rossuma075ce11997-12-05 21:56:45 +000031#else
Victor Stinner6efcb6d2017-12-18 23:42:55 +010032# define PYTHONHOMEHELP "<prefix>/lib/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000033#endif
34
Guido van Rossuma22865e2000-09-05 04:41:18 +000035#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000036 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
37 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000038
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000039#ifdef __cplusplus
40extern "C" {
41#endif
42
Victor Stinner46972b72017-11-24 22:55:40 +010043#define DECODE_LOCALE_ERR(NAME, LEN) \
44 (((LEN) == -2) \
Victor Stinner94540602017-12-16 04:54:22 +010045 ? _Py_INIT_USER_ERR("cannot decode " NAME) \
Victor Stinner46972b72017-11-24 22:55:40 +010046 : _Py_INIT_NO_MEMORY())
47
48
Victor Stinner0327bde2017-11-23 17:03:20 +010049#define SET_DECODE_ERROR(NAME, LEN) \
50 do { \
51 if ((LEN) == (size_t)-2) { \
Victor Stinner94540602017-12-16 04:54:22 +010052 pymain->err = _Py_INIT_USER_ERR("cannot decode " NAME); \
Victor Stinner0327bde2017-11-23 17:03:20 +010053 } \
54 else { \
55 pymain->err = _Py_INIT_NO_MEMORY(); \
56 } \
57 } while (0)
58
Victor Stinnerca719ac2017-12-20 18:00:19 +010059#ifdef MS_WINDOWS
60#define WCSTOK wcstok_s
61#else
62#define WCSTOK wcstok
63#endif
64
Guido van Rossumac56b031996-07-21 02:33:38 +000065/* For Py_GetArgcArgv(); set by main() */
Victor Stinner94540602017-12-16 04:54:22 +010066static wchar_t **orig_argv = NULL;
67static int orig_argc = 0;
Guido van Rossum667d7041995-08-04 04:20:48 +000068
Guido van Rossumbceccf52001-04-10 22:07:43 +000069/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020070#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000071
Guido van Rossumbceccf52001-04-10 22:07:43 +000072#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000073
Benjamin Peterson42aa93b2017-12-09 10:26:52 -080074static const _PyOS_LongOption longoptions[] = {
75 {L"check-hash-based-pycs", 1, 0},
76 {NULL, 0, 0},
77};
78
Guido van Rossum667d7041995-08-04 04:20:48 +000079/* Short usage message (with %s for argv0) */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020080static const char usage_line[] =
Martin v. Löwis790465f2008-04-05 20:41:37 +000081"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000082
83/* Long usage message, split into parts < 512 bytes */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020084static const char usage_1[] = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000085Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000086-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
87 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Xiang Zhang0710d752017-03-11 13:02:52 +080088-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000089-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000090-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000091-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000092-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000093";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020094static const char usage_2[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000095-i : inspect interactively after running script; forces a prompt even\n\
96 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020097-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000098-m mod : run library module as a script (terminates option list)\n\
Miss Islington (bot)b5655f32018-02-24 19:24:08 -080099-O : remove assert and __debug__-dependent statements; add .opt-1 before\n\
100 .pyc extension; also PYTHONOPTIMIZE=x\n\
101-OO : do -O changes and also discard docstrings; add .opt-2 before\n\
102 .pyc extension\n\
Georg Brandl9d871192010-12-04 10:47:18 +0000103-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +0000104-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +0000105-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +0000106";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200107static const char usage_3[] = "\
Berker Peksag7f580972017-10-13 15:16:31 +0300108-u : force the stdout and stderr streams to be unbuffered;\n\
109 this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000110-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
111 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000112-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +0900113 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +0000115 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +0000116-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000117-X opt : set implementation-specific option\n\
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800118--check-hash-based-pycs always|default|never:\n\
119 control how Python invalidates hash-based .pyc files\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +0000120";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200121static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +0000122file : program read from script file\n\
123- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000124arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000125Other environment variables:\n\
126PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200127PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +0000128 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +0000129";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200130static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200131"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +0000132" The default module search path uses %s.\n"
133"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
134"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be807c2016-03-14 12:04:26 +0100135"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
136static const char usage_6[] =
137"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
138" to seed the hashes of str, bytes and datetime objects. It can also be\n"
139" set to an integer in the range [0,4294967295] to get hash values with a\n"
140" predictable seed.\n"
141"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
142" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000143" hooks.\n"
Stéphane Wirtel7d1017d2017-06-12 13:30:33 +0200144"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000145" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
Victor Stinner5e3806f2017-11-30 11:40:24 +0100146" locale coercion and locale compatibility warnings on stderr.\n"
Steve Dower6332de12018-07-29 12:17:49 +0100147"PYTHONBREAKPOINT: if this variable is set to 0, it disables the default\n"
148" debugger. It can be set to the callable of your debugger of choice.\n"
Victor Stinner5e3806f2017-11-30 11:40:24 +0100149"PYTHONDEVMODE: enable the development mode.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000150
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800151static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800152pymain_usage(int error, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000153{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800154 FILE *f = error ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 fprintf(f, usage_line, program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800157 if (error)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 fprintf(f, "Try `python -h' for more information.\n");
159 else {
160 fputs(usage_1, f);
161 fputs(usage_2, f);
162 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200163 fprintf(f, usage_4, (wint_t)DELIM);
164 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100165 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000167}
168
Victor Stinnera7368ac2017-11-15 18:11:45 -0800169
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200170static const char*
Victor Stinner9cfc0022017-12-20 19:36:46 +0100171config_get_env_var(const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -0800172{
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200173 const char *var = Py_GETENV(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800174 if (var && var[0] != '\0') {
175 return var;
176 }
177 else {
178 return NULL;
179 }
180}
181
182
Victor Stinnerca719ac2017-12-20 18:00:19 +0100183static int
184config_get_env_var_dup(wchar_t **dest, wchar_t *wname, char *name)
185{
186 if (Py_IgnoreEnvironmentFlag) {
187 *dest = NULL;
188 return 0;
189 }
190
191#ifdef MS_WINDOWS
192 const wchar_t *var = _wgetenv(wname);
193 if (!var || var[0] == '\0') {
194 *dest = NULL;
195 return 0;
196 }
197
198 wchar_t *copy = _PyMem_RawWcsdup(var);
199 if (copy == NULL) {
200 return -1;
201 }
202
203 *dest = copy;
204#else
205 const char *var = getenv(name);
206 if (!var || var[0] == '\0') {
207 *dest = NULL;
208 return 0;
209 }
210
211 size_t len;
212 wchar_t *wvar = Py_DecodeLocale(var, &len);
213 if (!wvar) {
214 if (len == (size_t)-2) {
215 return -2;
216 }
217 else {
218 return -1;
219 }
220 }
221 *dest = wvar;
222#endif
223 return 0;
224}
225
226
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800227static void
Victor Stinner33c377e2017-12-05 15:12:41 +0100228pymain_run_startup(PyCompilerFlags *cf)
Martin v. Löwis6caea372003-11-18 19:46:25 +0000229{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100230 const char *startup = config_get_env_var("PYTHONSTARTUP");
Victor Stinner6bf992a2017-12-06 17:26:10 +0100231 if (startup == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800232 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800234
235 FILE *fp = _Py_fopen(startup, "r");
236 if (fp == NULL) {
237 int save_errno = errno;
238 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
239 errno = save_errno;
240
241 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
242 startup);
243 PyErr_Print();
244 PyErr_Clear();
245 return;
246 }
247
248 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
249 PyErr_Clear();
250 fclose(fp);
Martin v. Löwis6caea372003-11-18 19:46:25 +0000251}
252
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800253static void
254pymain_run_interactive_hook(void)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200255{
256 PyObject *sys, *hook, *result;
257 sys = PyImport_ImportModule("sys");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800258 if (sys == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200259 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800260 }
261
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200262 hook = PyObject_GetAttrString(sys, "__interactivehook__");
263 Py_DECREF(sys);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800264 if (hook == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200265 PyErr_Clear();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800266 return;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200267 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800268
269 result = _PyObject_CallNoArg(hook);
270 Py_DECREF(hook);
271 if (result == NULL) {
272 goto error;
273 }
274 Py_DECREF(result);
275
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200276 return;
277
278error:
279 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
280 PyErr_Print();
281 PyErr_Clear();
282}
283
Thomas Woutersa9773292006-04-21 09:43:23 +0000284
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800285static int
Victor Stinnerc4bca952017-12-19 23:48:17 +0100286pymain_run_module(const wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 PyObject *module, *runpy, *runmodule, *runargs, *result;
289 runpy = PyImport_ImportModule("runpy");
290 if (runpy == NULL) {
291 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200292 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 return -1;
294 }
295 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
296 if (runmodule == NULL) {
297 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200298 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 Py_DECREF(runpy);
300 return -1;
301 }
302 module = PyUnicode_FromWideChar(modname, wcslen(modname));
303 if (module == NULL) {
304 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200305 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 Py_DECREF(runpy);
307 Py_DECREF(runmodule);
308 return -1;
309 }
310 runargs = Py_BuildValue("(Oi)", module, set_argv0);
311 if (runargs == NULL) {
312 fprintf(stderr,
313 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200314 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 Py_DECREF(runpy);
316 Py_DECREF(runmodule);
317 Py_DECREF(module);
318 return -1;
319 }
320 result = PyObject_Call(runmodule, runargs, NULL);
321 if (result == NULL) {
322 PyErr_Print();
323 }
324 Py_DECREF(runpy);
325 Py_DECREF(runmodule);
326 Py_DECREF(module);
327 Py_DECREF(runargs);
328 if (result == NULL) {
329 return -1;
330 }
331 Py_DECREF(result);
332 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000333}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000334
Nick Coghland2977a32017-03-12 20:38:32 +1000335static PyObject *
Victor Stinnerc4bca952017-12-19 23:48:17 +0100336pymain_get_importer(const wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000337{
Nick Coghland2977a32017-03-12 20:38:32 +1000338 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000339
Nick Coghland2977a32017-03-12 20:38:32 +1000340 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800341 if (sys_path0 == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000342 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800343 }
Victor Stinner4726e402010-10-06 23:24:57 +0000344
Nick Coghland2977a32017-03-12 20:38:32 +1000345 importer = PyImport_GetImporter(sys_path0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800346 if (importer == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000347 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800348 }
Victor Stinner4726e402010-10-06 23:24:57 +0000349
Brett Cannonaa936422012-04-27 15:30:58 -0400350 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000351 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000352 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000353 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800355
Victor Stinner4726e402010-10-06 23:24:57 +0000356 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000357 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000358
Nick Coghland2977a32017-03-12 20:38:32 +1000359error:
360 Py_XDECREF(sys_path0);
361 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
362 PyErr_Print();
363 PyErr_Clear();
364 return NULL;
365}
366
367
368static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800369pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
Victor Stinnera62207c2010-08-07 10:57:17 +0000370{
371 PyObject *unicode, *bytes;
372 int ret;
373
374 unicode = PyUnicode_FromWideChar(command, -1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800375 if (unicode == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000376 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800377 }
378
Victor Stinnera62207c2010-08-07 10:57:17 +0000379 bytes = PyUnicode_AsUTF8String(unicode);
380 Py_DECREF(unicode);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800381 if (bytes == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000382 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800383 }
384
Victor Stinnera62207c2010-08-07 10:57:17 +0000385 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
386 Py_DECREF(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800387 return (ret != 0);
Victor Stinnera62207c2010-08-07 10:57:17 +0000388
389error:
Victor Stinner398356b2010-08-18 22:23:22 +0000390 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000391 PyErr_Print();
392 return 1;
393}
394
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800395
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000396static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800397pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000398{
399 PyObject *unicode, *bytes = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +0200400 const char *filename_str;
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000401 int run;
402
403 /* call pending calls like signal handlers (SIGINT) */
404 if (Py_MakePendingCalls() == -1) {
405 PyErr_Print();
406 return 1;
407 }
408
409 if (filename) {
410 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
411 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000412 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000413 Py_DECREF(unicode);
414 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800415 if (bytes != NULL) {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000416 filename_str = PyBytes_AsString(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800417 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000418 else {
419 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000420 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000421 }
422 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800423 else {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000424 filename_str = "<stdin>";
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800425 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000426
427 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
428 Py_XDECREF(bytes);
429 return run != 0;
430}
431
Christian Heimes9cd17752007-11-18 19:35:23 +0000432
Guido van Rossum667d7041995-08-04 04:20:48 +0000433/* Main program */
434
Eric Snow6b4be192017-05-22 21:36:03 -0700435typedef struct {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100436 wchar_t **argv;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100437 int nwarnoption; /* Number of -W options */
438 wchar_t **warnoptions; /* -W options */
439 int nenv_warnoption; /* Number of PYTHONWARNINGS options */
440 wchar_t **env_warnoptions; /* PYTHONWARNINGS options */
Eric Snow6b4be192017-05-22 21:36:03 -0700441 int print_help; /* -h, -? options */
442 int print_version; /* -V option */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100443 int bytes_warning; /* Py_BytesWarningFlag, -b */
444 int debug; /* Py_DebugFlag, -b, PYTHONDEBUG */
445 int inspect; /* Py_InspectFlag, -i, PYTHONINSPECT */
446 int interactive; /* Py_InteractiveFlag, -i */
447 int isolated; /* Py_IsolatedFlag, -I */
448 int optimization_level; /* Py_OptimizeFlag, -O, PYTHONOPTIMIZE */
449 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag, -B, PYTHONDONTWRITEBYTECODE */
450 int no_user_site_directory; /* Py_NoUserSiteDirectory, -I, -s, PYTHONNOUSERSITE */
451 int no_site_import; /* Py_NoSiteFlag, -S */
452 int use_unbuffered_io; /* Py_UnbufferedStdioFlag, -u, PYTHONUNBUFFERED */
453 int verbosity; /* Py_VerboseFlag, -v, PYTHONVERBOSE */
454 int quiet_flag; /* Py_QuietFlag, -q */
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800455 const char *check_hash_pycs_mode; /* --check-hash-based-pycs */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100456#ifdef MS_WINDOWS
457 int legacy_windows_fs_encoding; /* Py_LegacyWindowsFSEncodingFlag,
458 PYTHONLEGACYWINDOWSFSENCODING */
459 int legacy_windows_stdio; /* Py_LegacyWindowsStdioFlag,
460 PYTHONLEGACYWINDOWSSTDIO */
461#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700462} _Py_CommandLineDetails;
463
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800464/* Structure used by Py_Main() to pass data to subfunctions */
465typedef struct {
Victor Stinner19760862017-12-20 01:41:59 +0100466 /* Input arguments */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800467 int argc;
Victor Stinner94540602017-12-16 04:54:22 +0100468 int use_bytes_argv;
469 char **bytes_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100470 wchar_t **wchar_argv;
Victor Stinner19760862017-12-20 01:41:59 +0100471
472 /* Exit status or "exit code": result of pymain_main() */
473 int status;
474 /* Error message if a function failed */
475 _PyInitError err;
476
Victor Stinner19760862017-12-20 01:41:59 +0100477 /* non-zero is stdin is a TTY or if -i option is used */
478 int stdin_is_interactive;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100479 int skip_first_line; /* -x option */
480 wchar_t *filename; /* Trailing arg without -c or -m */
481 wchar_t *command; /* -c argument */
482 wchar_t *module; /* -m argument */
Victor Stinner19760862017-12-20 01:41:59 +0100483
Victor Stinner9cfc0022017-12-20 19:36:46 +0100484 _PyCoreConfig config;
Victor Stinner19760862017-12-20 01:41:59 +0100485
486 PyObject *main_importer_path;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800487} _PyMain;
488
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800489#define _PyMain_INIT \
Victor Stinner9cfc0022017-12-20 19:36:46 +0100490 {.config = _PyCoreConfig_INIT, \
Victor Stinnerd5dda982017-12-13 17:31:16 +0100491 .err = _Py_INIT_OK()}
492/* Note: _PyMain_INIT sets other fields to 0/NULL */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800493
494
Victor Stinner19760862017-12-20 01:41:59 +0100495/* Non-zero if filename, command (-c) or module (-m) is set
496 on the command line */
497#define RUN_CODE(pymain) \
Victor Stinnerca719ac2017-12-20 18:00:19 +0100498 (pymain->command != NULL || pymain->filename != NULL \
499 || pymain->module != NULL)
Victor Stinner19760862017-12-20 01:41:59 +0100500
501
Victor Stinnerca719ac2017-12-20 18:00:19 +0100502static wchar_t*
503pymain_wstrdup(_PyMain *pymain, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800504{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100505 wchar_t *str2 = _PyMem_RawWcsdup(str);
506 if (str2 == NULL) {
507 pymain->err = _Py_INIT_NO_MEMORY();
508 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800509 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100510 return str2;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800511}
512
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100513
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800514static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100515clear_wstrlist(int len, wchar_t **list)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800516{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100517 for (int i=0; i < len; i++) {
518 PyMem_RawFree(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100519 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100520 PyMem_RawFree(list);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100521}
522
523
524static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100525pymain_init_cmdline_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100526{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100527 assert(cmdline->argv == NULL);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100528
Victor Stinnerca719ac2017-12-20 18:00:19 +0100529 if (pymain->use_bytes_argv) {
530 /* +1 for a the NULL terminator */
531 size_t size = sizeof(wchar_t*) * (pymain->argc + 1);
532 wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size);
533 if (argv == NULL) {
534 pymain->err = _Py_INIT_NO_MEMORY();
535 return -1;
536 }
537
538 for (int i = 0; i < pymain->argc; i++) {
539 size_t len;
540 wchar_t *arg = Py_DecodeLocale(pymain->bytes_argv[i], &len);
541 if (arg == NULL) {
542 clear_wstrlist(i, argv);
543 pymain->err = DECODE_LOCALE_ERR("command line arguments",
544 (Py_ssize_t)len);
545 return -1;
546 }
547 argv[i] = arg;
548 }
549 argv[pymain->argc] = NULL;
550
551 cmdline->argv = argv;
552 }
553 else {
554 cmdline->argv = pymain->wchar_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100555 }
556
Victor Stinnerca719ac2017-12-20 18:00:19 +0100557 wchar_t *program;
558 if (pymain->argc >= 1 && cmdline->argv != NULL) {
559 program = cmdline->argv[0];
560 }
561 else {
562 program = L"";
563 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100564 pymain->config.program = pymain_wstrdup(pymain, program);
565 if (pymain->config.program == NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100566 return -1;
567 }
568
Victor Stinnerc4bca952017-12-19 23:48:17 +0100569 return 0;
570}
571
572
573static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100574pymain_clear_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100575{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100576 PyMemAllocatorEx old_alloc;
577 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100578
Victor Stinnerca719ac2017-12-20 18:00:19 +0100579 clear_wstrlist(cmdline->nwarnoption, cmdline->warnoptions);
580 cmdline->nwarnoption = 0;
581 cmdline->warnoptions = NULL;
582
583 clear_wstrlist(cmdline->nenv_warnoption, cmdline->env_warnoptions);
584 cmdline->nenv_warnoption = 0;
585 cmdline->env_warnoptions = NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100586
587 if (pymain->use_bytes_argv && cmdline->argv != NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100588 clear_wstrlist(pymain->argc, cmdline->argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100589 }
590 cmdline->argv = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100591
592 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
593}
594
595
596static void
597pymain_clear_pymain(_PyMain *pymain)
598{
599#define CLEAR(ATTR) \
600 do { \
601 PyMem_RawFree(ATTR); \
602 ATTR = NULL; \
603 } while (0)
604
605 CLEAR(pymain->filename);
606 CLEAR(pymain->command);
607 CLEAR(pymain->module);
608#undef CLEAR
Victor Stinnerc4bca952017-12-19 23:48:17 +0100609}
610
Victor Stinnerc4bca952017-12-19 23:48:17 +0100611static void
Victor Stinner9cfc0022017-12-20 19:36:46 +0100612pymain_clear_config(_PyMain *pymain)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100613{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100614 /* Clear core config with the memory allocator
615 used by pymain_read_conf() */
616 PyMemAllocatorEx old_alloc;
617 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
618
Victor Stinner9cfc0022017-12-20 19:36:46 +0100619 _PyCoreConfig_Clear(&pymain->config);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100620
621 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
622}
623
624
625static void
626pymain_free_python(_PyMain *pymain)
627{
628 Py_CLEAR(pymain->main_importer_path);
Victor Stinnerd4341102017-11-23 00:12:09 +0100629
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800630#ifdef __INSURE__
631 /* Insure++ is a memory analysis tool that aids in discovering
632 * memory leaks and other memory problems. On Python exit, the
633 * interned string dictionaries are flagged as being in use at exit
634 * (which it is). Under normal circumstances, this is fine because
635 * the memory will be automatically reclaimed by the system. Under
636 * memory debugging, it's a huge source of useless noise, so we
637 * trade off slower shutdown for less distraction in the memory
638 * reports. -baw
639 */
640 _Py_ReleaseInternedUnicodeStrings();
641#endif /* __INSURE__ */
642}
643
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100644
645static void
Victor Stinnerc4bca952017-12-19 23:48:17 +0100646pymain_free_raw(_PyMain *pymain)
Victor Stinner94540602017-12-16 04:54:22 +0100647{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100648 _PyImport_Fini2();
Victor Stinner94540602017-12-16 04:54:22 +0100649
Victor Stinnerc4bca952017-12-19 23:48:17 +0100650 /* Free global variables which cannot be freed in Py_Finalize():
651 configuration options set before Py_Initialize() which should
652 remain valid after Py_Finalize(), since
653 Py_Initialize()-Py_Finalize() can be called multiple times. */
654 _PyPathConfig_Clear(&_Py_path_config);
Victor Stinner94540602017-12-16 04:54:22 +0100655
Victor Stinner31e99082017-12-20 23:41:38 +0100656 pymain_clear_config(pymain);
657
Victor Stinnerc4bca952017-12-19 23:48:17 +0100658 /* Force the allocator used by pymain_read_conf() */
659 PyMemAllocatorEx old_alloc;
660 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner94540602017-12-16 04:54:22 +0100661
Victor Stinnerca719ac2017-12-20 18:00:19 +0100662 pymain_clear_pymain(pymain);
663
664 clear_wstrlist(orig_argc, orig_argv);
665 orig_argc = 0;
666 orig_argv = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100667
Victor Stinnerc4bca952017-12-19 23:48:17 +0100668 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100669}
670
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100671
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800672static void
673pymain_free(_PyMain *pymain)
674{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100675 pymain_free_python(pymain);
676 pymain_free_raw(pymain);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800677}
678
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100679
Eric Snow6b4be192017-05-22 21:36:03 -0700680static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800681pymain_run_main_from_importer(_PyMain *pymain)
Guido van Rossum667d7041995-08-04 04:20:48 +0000682{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800683 /* Assume sys_path0 has already been checked by pymain_get_importer(),
684 * so put it in sys.path[0] and import __main__ */
Victor Stinner11a247d2017-12-13 21:05:57 +0100685 PyObject *sys_path = PySys_GetObject("path");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800686 if (sys_path == NULL) {
687 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
688 goto error;
689 }
690
Victor Stinner11a247d2017-12-13 21:05:57 +0100691 if (PyList_Insert(sys_path, 0, pymain->main_importer_path)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800692 goto error;
693 }
694
Victor Stinner11a247d2017-12-13 21:05:57 +0100695 int sts = pymain_run_module(L"__main__", 0);
696 return (sts != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800697
698error:
699 Py_CLEAR(pymain->main_importer_path);
700 PyErr_Print();
701 return 1;
702}
703
704
Victor Stinner9cfc0022017-12-20 19:36:46 +0100705static _PyInitError
706wstrlist_append(int *len, wchar_t ***list, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800707{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100708 wchar_t *str2 = _PyMem_RawWcsdup(str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800709 if (str2 == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100710 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800711 }
712
Victor Stinnerca719ac2017-12-20 18:00:19 +0100713 size_t size = (*len + 1) * sizeof(list[0]);
714 wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size);
715 if (list2 == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800716 PyMem_RawFree(str2);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100717 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800718 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100719 list2[*len] = str2;
720 *list = list2;
721 (*len)++;
Victor Stinner9cfc0022017-12-20 19:36:46 +0100722 return _Py_INIT_OK();
723}
724
725
726static int
727pymain_wstrlist_append(_PyMain *pymain, int *len, wchar_t ***list, const wchar_t *str)
728{
729 _PyInitError err = wstrlist_append(len, list, str);
730 if (_Py_INIT_FAILED(err)) {
731 pymain->err = err;
732 return -1;
733 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800734 return 0;
735}
736
737
738/* Parse the command line arguments
739 Return 0 on success.
740 Return 1 if parsing failed.
741 Set pymain->err and return -1 on other errors. */
742static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100743pymain_parse_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800744{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100745 _PyCoreConfig *config = &pymain->config;
746
Antoine Pitrou86838b02012-02-21 19:03:47 +0100747 _PyOS_ResetGetOpt();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800748 do {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800749 int longindex = -1;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100750 int c = _PyOS_GetOpt(pymain->argc, cmdline->argv, PROGRAM_OPTS,
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800751 longoptions, &longindex);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800752 if (c == EOF) {
753 break;
754 }
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 if (c == 'c') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 /* -c is the last option; following arguments
758 that look like options are left for the
759 command to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800760 size_t len = wcslen(_PyOS_optarg) + 1 + 1;
761 wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
762 if (command == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100763 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800764 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800765 }
Miss Islington (bot)c6de46e2018-05-31 06:43:21 -0700766 memcpy(command, _PyOS_optarg, (len - 2) * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 command[len - 2] = '\n';
768 command[len - 1] = 0;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100769 pymain->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 break;
771 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 if (c == 'm') {
774 /* -m is the last option; following arguments
775 that look like options are left for the
776 module to interpret. */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100777 pymain->module = pymain_wstrdup(pymain, _PyOS_optarg);
778 if (pymain->module == NULL) {
779 return -1;
780 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 break;
782 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 switch (c) {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800785 case 0:
786 // Handle long option.
787 assert(longindex == 0); // Only one long option now.
788 if (!wcscmp(_PyOS_optarg, L"always")) {
789 cmdline->check_hash_pycs_mode = "always";
790 } else if (!wcscmp(_PyOS_optarg, L"never")) {
791 cmdline->check_hash_pycs_mode = "never";
792 } else if (!wcscmp(_PyOS_optarg, L"default")) {
793 cmdline->check_hash_pycs_mode = "default";
794 } else {
795 fprintf(stderr, "--check-hash-based-pycs must be one of "
796 "'default', 'always', or 'never'\n");
797 return 1;
798 }
799 break;
800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700802 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700806 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700810 cmdline->inspect++;
811 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000813
Christian Heimesad73a9c2013-08-10 16:36:18 +0200814 case 'I':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100815 config->ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700816 cmdline->isolated++;
817 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200818 break;
819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700823 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700827 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700831 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700835 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 case 'E':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100839 config->ignore_environment++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 case 't':
843 /* ignored for backwards compatibility */
844 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700847 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700851 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 case 'x':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100855 pymain->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 case 'h':
859 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700860 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700864 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 case 'W':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100868 if (pymain_wstrlist_append(pymain,
869 &cmdline->nwarnoption,
870 &cmdline->warnoptions,
871 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800872 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800873 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000875
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000876 case 'X':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100877 if (pymain_wstrlist_append(pymain,
Victor Stinner9cfc0022017-12-20 19:36:46 +0100878 &config->nxoption,
879 &config->xoptions,
Victor Stinnerca719ac2017-12-20 18:00:19 +0100880 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800881 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800882 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000883 break;
884
Georg Brandl9d871192010-12-04 10:47:18 +0000885 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700886 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000887 break;
888
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100889 case 'R':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100890 config->use_hash_seed = 0;
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100891 break;
892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 default:
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800896 /* unknown argument: parsing failed */
897 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800899 } while (1);
900
Victor Stinnerca719ac2017-12-20 18:00:19 +0100901 if (pymain->command == NULL && pymain->module == NULL
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800902 && _PyOS_optind < pymain->argc
Victor Stinnerc4bca952017-12-19 23:48:17 +0100903 && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800904 {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100905 pymain->filename = pymain_wstrdup(pymain, cmdline->argv[_PyOS_optind]);
906 if (pymain->filename == NULL) {
907 return -1;
908 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000910
Victor Stinnerd5dda982017-12-13 17:31:16 +0100911 /* -c and -m options are exclusive */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100912 assert(!(pymain->command != NULL && pymain->module != NULL));
Victor Stinnerd5dda982017-12-13 17:31:16 +0100913
Eric Snow6b4be192017-05-22 21:36:03 -0700914 return 0;
915}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000916
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800917
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800918static int
Victor Stinner9cfc0022017-12-20 19:36:46 +0100919add_xoption(PyObject *opts, const wchar_t *s)
Victor Stinner374c6e12017-12-14 12:05:26 +0100920{
921 PyObject *name, *value;
922
923 const wchar_t *name_end = wcschr(s, L'=');
924 if (!name_end) {
925 name = PyUnicode_FromWideChar(s, -1);
926 value = Py_True;
927 Py_INCREF(value);
928 }
929 else {
930 name = PyUnicode_FromWideChar(s, name_end - s);
931 value = PyUnicode_FromWideChar(name_end + 1, -1);
932 }
933 if (name == NULL || value == NULL) {
934 goto error;
935 }
936 if (PyDict_SetItem(opts, name, value) < 0) {
937 goto error;
938 }
939 Py_DECREF(name);
940 Py_DECREF(value);
941 return 0;
942
943error:
944 Py_XDECREF(name);
945 Py_XDECREF(value);
946 return -1;
947}
948
Victor Stinner9cfc0022017-12-20 19:36:46 +0100949
950static PyObject*
951config_create_xoptions_dict(const _PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800952{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100953 int nxoption = config->nxoption;
954 wchar_t **xoptions = config->xoptions;
Victor Stinner374c6e12017-12-14 12:05:26 +0100955 PyObject *dict = PyDict_New();
956 if (dict == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100957 return NULL;
Victor Stinner374c6e12017-12-14 12:05:26 +0100958 }
959
Victor Stinnerca719ac2017-12-20 18:00:19 +0100960 for (int i=0; i < nxoption; i++) {
961 wchar_t *option = xoptions[i];
Victor Stinner9cfc0022017-12-20 19:36:46 +0100962 if (add_xoption(dict, option) < 0) {
Victor Stinner374c6e12017-12-14 12:05:26 +0100963 Py_DECREF(dict);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100964 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800965 }
966 }
Victor Stinner374c6e12017-12-14 12:05:26 +0100967
Victor Stinner9cfc0022017-12-20 19:36:46 +0100968 return dict;
Eric Snow6b4be192017-05-22 21:36:03 -0700969}
970
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800971
Victor Stinner9cfc0022017-12-20 19:36:46 +0100972static _PyInitError
973config_add_warnings_optlist(_PyCoreConfig *config, int len, wchar_t **options)
Eric Snow6b4be192017-05-22 21:36:03 -0700974{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100975 for (int i = 0; i < len; i++) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100976 _PyInitError err = wstrlist_append(&config->nwarnoption,
977 &config->warnoptions,
978 options[i]);
979 if (_Py_INIT_FAILED(err)) {
980 return err;
Eric Snow6b4be192017-05-22 21:36:03 -0700981 }
Eric Snow6b4be192017-05-22 21:36:03 -0700982 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100983 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800984}
Eric Snow6b4be192017-05-22 21:36:03 -0700985
Victor Stinner747f48e2017-12-12 22:59:48 +0100986
Victor Stinner9cfc0022017-12-20 19:36:46 +0100987static _PyInitError
988config_init_warnoptions(_PyCoreConfig *config, _Py_CommandLineDetails *cmdline)
Victor Stinner747f48e2017-12-12 22:59:48 +0100989{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100990 _PyInitError err;
991
992 assert(config->nwarnoption == 0);
993
Victor Stinner747f48e2017-12-12 22:59:48 +0100994 /* The priority order for warnings configuration is (highest precedence
995 * first):
996 *
997 * - the BytesWarning filter, if needed ('-b', '-bb')
998 * - any '-W' command line options; then
999 * - the 'PYTHONWARNINGS' environment variable; then
1000 * - the dev mode filter ('-X dev', 'PYTHONDEVMODE'); then
1001 * - any implicit filters added by _warnings.c/warnings.py
1002 *
1003 * All settings except the last are passed to the warnings module via
1004 * the `sys.warnoptions` list. Since the warnings module works on the basis
1005 * of "the most recently added filter will be checked first", we add
1006 * the lowest precedence entries first so that later entries override them.
1007 */
1008
Victor Stinner9cfc0022017-12-20 19:36:46 +01001009 if (config->dev_mode) {
1010 err = wstrlist_append(&config->nwarnoption,
1011 &config->warnoptions,
1012 L"default");
1013 if (_Py_INIT_FAILED(err)) {
1014 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001015 }
Victor Stinner747f48e2017-12-12 22:59:48 +01001016 }
Victor Stinner374c6e12017-12-14 12:05:26 +01001017
Victor Stinner9cfc0022017-12-20 19:36:46 +01001018 err = config_add_warnings_optlist(config,
1019 cmdline->nenv_warnoption,
1020 cmdline->env_warnoptions);
1021 if (_Py_INIT_FAILED(err)) {
1022 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001023 }
1024
Victor Stinner9cfc0022017-12-20 19:36:46 +01001025 err = config_add_warnings_optlist(config,
1026 cmdline->nwarnoption,
1027 cmdline->warnoptions);
1028 if (_Py_INIT_FAILED(err)) {
1029 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001030 }
1031
1032 /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c
1033 * don't even try to emit a warning, so we skip setting the filter in that
1034 * case.
1035 */
1036 if (cmdline->bytes_warning) {
1037 wchar_t *filter;
1038 if (cmdline->bytes_warning> 1) {
1039 filter = L"error::BytesWarning";
1040 }
1041 else {
1042 filter = L"default::BytesWarning";
1043 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001044 err = wstrlist_append(&config->nwarnoption,
1045 &config->warnoptions,
1046 filter);
1047 if (_Py_INIT_FAILED(err)) {
1048 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001049 }
1050 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001051 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001052}
1053
1054
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001055/* Get warning options from PYTHONWARNINGS environment variable.
1056 Return 0 on success.
1057 Set pymain->err and return -1 on error. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001058static _PyInitError
1059cmdline_init_env_warnoptions(_Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001060{
1061 if (Py_IgnoreEnvironmentFlag) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001062 return _Py_INIT_OK();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +00001064
Victor Stinnerca719ac2017-12-20 18:00:19 +01001065 wchar_t *env;
1066 int res = config_get_env_var_dup(&env, L"PYTHONWARNINGS", "PYTHONWARNINGS");
1067 if (res < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001068 return DECODE_LOCALE_ERR("PYTHONWARNINGS", res);
Victor Stinnerca719ac2017-12-20 18:00:19 +01001069 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001070
Victor Stinnerca719ac2017-12-20 18:00:19 +01001071 if (env == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001072 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001073 }
Philip Jenvey0805ca32010-04-07 04:04:10 +00001074
Victor Stinnerca719ac2017-12-20 18:00:19 +01001075
1076 wchar_t *warning, *context = NULL;
1077 for (warning = WCSTOK(env, L",", &context);
1078 warning != NULL;
1079 warning = WCSTOK(NULL, L",", &context))
1080 {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001081 _PyInitError err = wstrlist_append(&cmdline->nenv_warnoption,
1082 &cmdline->env_warnoptions,
1083 warning);
1084 if (_Py_INIT_FAILED(err)) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001085 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001086 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001087 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001089 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001090 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001091}
1092
1093
1094static void
1095pymain_init_stdio(_PyMain *pymain)
1096{
1097 pymain->stdin_is_interactive = (isatty(fileno(stdin))
1098 || Py_InteractiveFlag);
Guido van Rossum775af911997-02-14 19:50:32 +00001099
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00001100#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +00001101 /* don't translate newlines (\r\n <=> \n) */
1102 _setmode(fileno(stdin), O_BINARY);
1103 _setmode(fileno(stdout), O_BINARY);
1104 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +00001105#endif
Victor Stinner89e34362011-01-07 18:47:22 +00001106
1107 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +00001108#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
1110 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
1111 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001112#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 setbuf(stdin, (char *)NULL);
1114 setbuf(stdout, (char *)NULL);
1115 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001116#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 }
1118 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +00001119#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 /* Doesn't have to have line-buffered -- use unbuffered */
1121 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
1122 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001123#else /* !MS_WINDOWS */
1124#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
1126 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001127#endif /* HAVE_SETVBUF */
1128#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 /* Leave stderr alone - it should be unbuffered anyway. */
1130 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001131}
Guido van Rossum667d7041995-08-04 04:20:48 +00001132
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001133
1134/* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__
Victor Stinner31a83932017-12-04 13:39:15 +01001135 environment variables on macOS if available. */
1136static _PyInitError
Victor Stinnerca719ac2017-12-20 18:00:19 +01001137config_init_program_name(_PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001138{
Victor Stinner31a83932017-12-04 13:39:15 +01001139 assert(config->program_name == NULL);
1140
1141 /* If Py_SetProgramName() was called, use its value */
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001142 const wchar_t *program_name = _Py_path_config.program_name;
Victor Stinner31a83932017-12-04 13:39:15 +01001143 if (program_name != NULL) {
1144 config->program_name = _PyMem_RawWcsdup(program_name);
1145 if (config->program_name == NULL) {
1146 return _Py_INIT_NO_MEMORY();
1147 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001148 return _Py_INIT_OK();
Victor Stinner31a83932017-12-04 13:39:15 +01001149 }
1150
Just van Rossum2ac79ef2003-03-05 15:46:54 +00001151#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 /* On MacOS X, when the Python interpreter is embedded in an
1153 application bundle, it gets executed by a bootstrapping script
1154 that does os.execve() with an argv[0] that's different from the
1155 actual Python executable. This is needed to keep the Finder happy,
1156 or rather, to work around Apple's overly strict requirements of
1157 the process name. However, we still need a usable sys.executable,
1158 so the actual executable path is passed in an environment variable.
1159 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
1160 script. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001161 const char *p = config_get_env_var("PYTHONEXECUTABLE");
Victor Stinner6bf992a2017-12-06 17:26:10 +01001162 if (p != NULL) {
Victor Stinner31a83932017-12-04 13:39:15 +01001163 size_t len;
1164 wchar_t* program_name = Py_DecodeLocale(p, &len);
1165 if (program_name == NULL) {
1166 return DECODE_LOCALE_ERR("PYTHONEXECUTABLE environment "
1167 "variable", (Py_ssize_t)len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 }
Victor Stinner31a83932017-12-04 13:39:15 +01001169 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001170 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001171 }
Vinay Sajip90db6612012-07-17 17:33:46 +01001172#ifdef WITH_NEXT_FRAMEWORK
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001173 else {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001174 const char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
Vinay Sajip90db6612012-07-17 17:33:46 +01001175 if (pyvenv_launcher && *pyvenv_launcher) {
1176 /* Used by Mac/Tools/pythonw.c to forward
1177 * the argv0 of the stub executable
1178 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001179 size_t len;
Victor Stinner31a83932017-12-04 13:39:15 +01001180 wchar_t* program_name = Py_DecodeLocale(pyvenv_launcher, &len);
1181 if (program_name == NULL) {
1182 return DECODE_LOCALE_ERR("__PYVENV_LAUNCHER__ environment "
1183 "variable", (Py_ssize_t)len);
Vinay Sajip90db6612012-07-17 17:33:46 +01001184 }
Victor Stinner31a83932017-12-04 13:39:15 +01001185 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001186 return _Py_INIT_OK();
Vinay Sajip90db6612012-07-17 17:33:46 +01001187 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001189#endif /* WITH_NEXT_FRAMEWORK */
1190#endif /* __APPLE__ */
Victor Stinneraf5a8952017-12-02 10:11:32 +01001191
Victor Stinnerca719ac2017-12-20 18:00:19 +01001192 /* Use argv[0] by default, if available */
1193 if (config->program != NULL) {
1194 config->program_name = _PyMem_RawWcsdup(config->program);
1195 if (config->program_name == NULL) {
1196 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001197 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001198 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001199 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001200
1201 /* Last fall back: hardcoded string */
1202#ifdef MS_WINDOWS
1203 const wchar_t *default_program_name = L"python";
1204#else
1205 const wchar_t *default_program_name = L"python3";
1206#endif
1207 config->program_name = _PyMem_RawWcsdup(default_program_name);
1208 if (config->program_name == NULL) {
1209 return _Py_INIT_NO_MEMORY();
1210 }
1211 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001212}
1213
1214
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001215static void
1216pymain_header(_PyMain *pymain)
1217{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001218 if (Py_QuietFlag) {
1219 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 }
Guido van Rossum393661d2001-08-31 17:40:15 +00001221
Victor Stinner19760862017-12-20 01:41:59 +01001222 if (!Py_VerboseFlag && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001223 return;
1224 }
1225
1226 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
1227 if (!Py_NoSiteFlag) {
1228 fprintf(stderr, "%s\n", COPYRIGHT);
1229 }
1230}
1231
1232
Victor Stinnerc4bca952017-12-19 23:48:17 +01001233static wchar_t**
Victor Stinnerca719ac2017-12-20 18:00:19 +01001234copy_wstrlist(int len, wchar_t **list)
Victor Stinner11a247d2017-12-13 21:05:57 +01001235{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001236 assert((len > 0 && list != NULL) || len == 0);
1237 size_t size = len * sizeof(list[0]);
1238 wchar_t **list_copy = PyMem_RawMalloc(size);
1239 for (int i=0; i < len; i++) {
1240 wchar_t* arg = _PyMem_RawWcsdup(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001241 if (arg == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001242 clear_wstrlist(i, list);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001243 return NULL;
1244 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001245 list_copy[i] = arg;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001246 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001247 return list_copy;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001248}
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001249
Victor Stinnerc4bca952017-12-19 23:48:17 +01001250
1251static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001252pymain_init_core_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001253{
Victor Stinnerc4bca952017-12-19 23:48:17 +01001254 /* Copy argv to be able to modify it (to force -c/-m) */
1255 int argc = pymain->argc - _PyOS_optind;
1256 wchar_t **argv;
1257
1258 if (argc <= 0 || cmdline->argv == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01001259 /* Ensure at least one (empty) argument is seen */
1260 static wchar_t *empty_argv[1] = {L""};
Victor Stinner11a247d2017-12-13 21:05:57 +01001261 argc = 1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001262 argv = copy_wstrlist(1, empty_argv);
Victor Stinner11a247d2017-12-13 21:05:57 +01001263 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01001264 else {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001265 argv = copy_wstrlist(argc, &cmdline->argv[_PyOS_optind]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001266 }
1267
1268 if (argv == NULL) {
1269 pymain->err = _Py_INIT_NO_MEMORY();
1270 return -1;
1271 }
1272
1273 wchar_t *arg0 = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001274 if (pymain->command != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001275 /* Force sys.argv[0] = '-c' */
1276 arg0 = L"-c";
1277 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001278 else if (pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001279 /* Force sys.argv[0] = '-m'*/
1280 arg0 = L"-m";
1281 }
1282 if (arg0 != NULL) {
1283 arg0 = _PyMem_RawWcsdup(arg0);
1284 if (arg0 == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001285 clear_wstrlist(argc, argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001286 pymain->err = _Py_INIT_NO_MEMORY();
1287 return -1;
1288 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001289
1290 assert(argc >= 1);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001291 PyMem_RawFree(argv[0]);
1292 argv[0] = arg0;
1293 }
1294
Victor Stinner9cfc0022017-12-20 19:36:46 +01001295 pymain->config.argc = argc;
1296 pymain->config.argv = argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001297 return 0;
1298}
1299
1300
Victor Stinner8ded5b82018-01-24 17:03:28 +01001301static PyObject*
1302wstrlist_as_pylist(int len, wchar_t **list)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001303{
Victor Stinner8ded5b82018-01-24 17:03:28 +01001304 assert(list != NULL || len < 1);
1305
1306 PyObject *pylist = PyList_New(len);
1307 if (pylist == NULL) {
1308 return NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001309 }
1310
Victor Stinner8ded5b82018-01-24 17:03:28 +01001311 for (int i = 0; i < len; i++) {
1312 PyObject *v = PyUnicode_FromWideChar(list[i], -1);
Victor Stinner11a247d2017-12-13 21:05:57 +01001313 if (v == NULL) {
Victor Stinner8ded5b82018-01-24 17:03:28 +01001314 Py_DECREF(pylist);
1315 return NULL;
Victor Stinner11a247d2017-12-13 21:05:57 +01001316 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001317 PyList_SET_ITEM(pylist, i, v);
Victor Stinner11a247d2017-12-13 21:05:57 +01001318 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001319 return pylist;
Victor Stinner11a247d2017-12-13 21:05:57 +01001320}
1321
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001322
Victor Stinner11a247d2017-12-13 21:05:57 +01001323static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01001324pymain_compute_path0(_PyMain *pymain, PyObject **path0)
Victor Stinner11a247d2017-12-13 21:05:57 +01001325{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001326 if (pymain->main_importer_path != NULL) {
1327 /* Let pymain_run_main_from_importer() adjust sys.path[0] later */
Victor Stinner19760862017-12-20 01:41:59 +01001328 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001329 return 0;
1330 }
1331
1332 if (Py_IsolatedFlag) {
Victor Stinner19760862017-12-20 01:41:59 +01001333 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001334 return 0;
1335 }
1336
Victor Stinner9cfc0022017-12-20 19:36:46 +01001337 *path0 = _PyPathConfig_ComputeArgv0(pymain->config.argc,
1338 pymain->config.argv);
Victor Stinner19760862017-12-20 01:41:59 +01001339 if (*path0 == NULL) {
1340 pymain->err = _Py_INIT_NO_MEMORY();
1341 return -1;
1342 }
1343 return 0;
1344}
1345
1346
1347static int
1348pymain_update_sys_path(_PyMain *pymain, PyObject *path0)
1349{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001350 /* Prepend argv[0] to sys.path.
1351 If argv[0] is a symlink, use the real path. */
1352 PyObject *sys_path = PySys_GetObject("path");
1353 if (sys_path == NULL) {
1354 pymain->err = _Py_INIT_ERR("can't get sys.path");
Victor Stinnerd5dda982017-12-13 17:31:16 +01001355 return -1;
1356 }
1357
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001358 /* Prepend path0 to sys.path */
1359 if (PyList_Insert(sys_path, 0, path0) < 0) {
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001360 pymain->err = _Py_INIT_ERR("sys.path.insert(0, path0) failed");
1361 return -1;
1362 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01001363 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001364}
1365
1366
Victor Stinner6bf992a2017-12-06 17:26:10 +01001367/* Get Py_xxx global configuration variables */
1368static void
Victor Stinnerca719ac2017-12-20 18:00:19 +01001369pymain_get_global_config(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinner6bf992a2017-12-06 17:26:10 +01001370{
Victor Stinner91106cd2017-12-13 12:29:09 +01001371 cmdline->bytes_warning = Py_BytesWarningFlag;
1372 cmdline->debug = Py_DebugFlag;
1373 cmdline->inspect = Py_InspectFlag;
1374 cmdline->interactive = Py_InteractiveFlag;
1375 cmdline->isolated = Py_IsolatedFlag;
1376 cmdline->optimization_level = Py_OptimizeFlag;
1377 cmdline->dont_write_bytecode = Py_DontWriteBytecodeFlag;
1378 cmdline->no_user_site_directory = Py_NoUserSiteDirectory;
1379 cmdline->no_site_import = Py_NoSiteFlag;
1380 cmdline->use_unbuffered_io = Py_UnbufferedStdioFlag;
1381 cmdline->verbosity = Py_VerboseFlag;
1382 cmdline->quiet_flag = Py_QuietFlag;
1383#ifdef MS_WINDOWS
1384 cmdline->legacy_windows_fs_encoding = Py_LegacyWindowsFSEncodingFlag;
1385 cmdline->legacy_windows_stdio = Py_LegacyWindowsStdioFlag;
1386#endif
1387 cmdline->check_hash_pycs_mode = _Py_CheckHashBasedPycsMode ;
1388
Victor Stinner9cfc0022017-12-20 19:36:46 +01001389 pymain->config.ignore_environment = Py_IgnoreEnvironmentFlag;
1390 pymain->config.utf8_mode = Py_UTF8Mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001391}
1392
1393
Victor Stinner19760862017-12-20 01:41:59 +01001394/* Set Py_xxx global configuration variables */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001395static void
Victor Stinnerca719ac2017-12-20 18:00:19 +01001396pymain_set_global_config(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001397{
Victor Stinner91106cd2017-12-13 12:29:09 +01001398 Py_BytesWarningFlag = cmdline->bytes_warning;
1399 Py_DebugFlag = cmdline->debug;
1400 Py_InspectFlag = cmdline->inspect;
1401 Py_InteractiveFlag = cmdline->interactive;
1402 Py_IsolatedFlag = cmdline->isolated;
1403 Py_OptimizeFlag = cmdline->optimization_level;
1404 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
1405 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
1406 Py_NoSiteFlag = cmdline->no_site_import;
1407 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
1408 Py_VerboseFlag = cmdline->verbosity;
1409 Py_QuietFlag = cmdline->quiet_flag;
1410 _Py_CheckHashBasedPycsMode = cmdline->check_hash_pycs_mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001411#ifdef MS_WINDOWS
Victor Stinner91106cd2017-12-13 12:29:09 +01001412 Py_LegacyWindowsFSEncodingFlag = cmdline->legacy_windows_fs_encoding;
1413 Py_LegacyWindowsStdioFlag = cmdline->legacy_windows_stdio;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001414#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001415
Victor Stinner9cfc0022017-12-20 19:36:46 +01001416 Py_IgnoreEnvironmentFlag = pymain->config.ignore_environment;
1417 Py_UTF8Mode = pymain->config.utf8_mode;
Victor Stinner358e5e12017-12-15 00:51:22 +01001418
1419 /* Random or non-zero hash seed */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001420 Py_HashRandomizationFlag = (pymain->config.use_hash_seed == 0 ||
1421 pymain->config.hash_seed != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001422}
1423
1424
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001425static void
1426pymain_import_readline(_PyMain *pymain)
1427{
1428 if (Py_IsolatedFlag) {
1429 return;
1430 }
Victor Stinner19760862017-12-20 01:41:59 +01001431 if (!Py_InspectFlag && RUN_CODE(pymain)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001432 return;
1433 }
1434 if (!isatty(fileno(stdin))) {
1435 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001436 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001437
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001438 PyObject *mod = PyImport_ImportModule("readline");
1439 if (mod == NULL) {
1440 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 }
1442 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001443 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001445}
1446
1447
1448static FILE*
1449pymain_open_filename(_PyMain *pymain)
1450{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001451 FILE* fp;
1452
Victor Stinnerca719ac2017-12-20 18:00:19 +01001453 fp = _Py_wfopen(pymain->filename, L"r");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001454 if (fp == NULL) {
1455 char *cfilename_buffer;
1456 const char *cfilename;
1457 int err = errno;
Victor Stinner9dd76202017-12-21 16:20:32 +01001458 cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001459 if (cfilename_buffer != NULL)
1460 cfilename = cfilename_buffer;
1461 else
1462 cfilename = "<unprintable file name>";
1463 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001464 pymain->config.program, cfilename, err, strerror(err));
Victor Stinner9dd76202017-12-21 16:20:32 +01001465 PyMem_RawFree(cfilename_buffer);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001466 pymain->status = 2;
1467 return NULL;
1468 }
1469
Victor Stinnerca719ac2017-12-20 18:00:19 +01001470 if (pymain->skip_first_line) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001471 int ch;
1472 /* Push back first newline so line numbers
1473 remain the same */
1474 while ((ch = getc(fp)) != EOF) {
1475 if (ch == '\n') {
1476 (void)ungetc(ch, fp);
1477 break;
1478 }
1479 }
1480 }
1481
1482 struct _Py_stat_struct sb;
1483 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1484 S_ISDIR(sb.st_mode)) {
1485 fprintf(stderr,
1486 "%ls: '%ls' is a directory, cannot continue\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001487 pymain->config.program, pymain->filename);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001488 fclose(fp);
1489 pymain->status = 1;
1490 return NULL;
1491 }
1492
1493 return fp;
1494}
1495
1496
1497static void
Victor Stinner19760862017-12-20 01:41:59 +01001498pymain_run_filename(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001499{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001500 if (pymain->filename == NULL && pymain->stdin_is_interactive) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001501 Py_InspectFlag = 0; /* do exit on SystemExit */
Victor Stinner19760862017-12-20 01:41:59 +01001502 pymain_run_startup(cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001503 pymain_run_interactive_hook();
1504 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001505
1506 if (pymain->main_importer_path != NULL) {
1507 pymain->status = pymain_run_main_from_importer(pymain);
1508 return;
1509 }
1510
1511 FILE *fp;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001512 if (pymain->filename != NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001513 fp = pymain_open_filename(pymain);
1514 if (fp == NULL) {
1515 return;
1516 }
1517 }
1518 else {
1519 fp = stdin;
1520 }
1521
Victor Stinnerca719ac2017-12-20 18:00:19 +01001522 pymain->status = pymain_run_file(fp, pymain->filename, cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001523}
1524
1525
1526static void
Victor Stinner19760862017-12-20 01:41:59 +01001527pymain_repl(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001530 opportunity to set it from Python. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001531 if (!Py_InspectFlag && config_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 Py_InspectFlag = 1;
1533 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001534
Victor Stinner19760862017-12-20 01:41:59 +01001535 if (!(Py_InspectFlag && pymain->stdin_is_interactive && RUN_CODE(pymain))) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001536 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001538
1539 Py_InspectFlag = 0;
1540 pymain_run_interactive_hook();
Victor Stinner33c377e2017-12-05 15:12:41 +01001541
Victor Stinner19760862017-12-20 01:41:59 +01001542 int res = PyRun_AnyFileFlags(stdin, "<stdin>", cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001543 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001544}
1545
1546
1547/* Parse the command line.
1548 Handle --version and --help options directly.
1549
1550 Return 1 if Python must exit.
1551 Return 0 on success.
1552 Set pymain->err and return -1 on failure. */
1553static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001554pymain_parse_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001555{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001556 int res = pymain_parse_cmdline_impl(pymain, cmdline);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001557 if (res < 0) {
1558 return -1;
1559 }
1560 if (res) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001561 pymain_usage(1, pymain->config.program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001562 pymain->status = 2;
1563 return 1;
1564 }
1565
Victor Stinnerca719ac2017-12-20 18:00:19 +01001566 if (pymain->command != NULL || pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001567 /* Backup _PyOS_optind */
1568 _PyOS_optind--;
1569 }
1570
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001571 return 0;
1572}
1573
1574
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001575static const wchar_t*
Victor Stinner9cfc0022017-12-20 19:36:46 +01001576config_get_xoption(_PyCoreConfig *config, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001577{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001578 int nxoption = config->nxoption;
1579 wchar_t **xoptions = config->xoptions;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001580 for (int i=0; i < nxoption; i++) {
1581 wchar_t *option = xoptions[i];
Victor Stinnera7368ac2017-11-15 18:11:45 -08001582 size_t len;
1583 wchar_t *sep = wcschr(option, L'=');
1584 if (sep != NULL) {
1585 len = (sep - option);
1586 }
1587 else {
1588 len = wcslen(option);
1589 }
1590 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1591 return option;
1592 }
1593 }
1594 return NULL;
1595}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001596
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001597
Victor Stinnera7368ac2017-11-15 18:11:45 -08001598static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001599pymain_str_to_int(const char *str, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001600{
1601 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001602 const char *endptr = str;
1603 long value = strtol(str, (char **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001604 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001605 return -1;
1606 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001607 if (value < INT_MIN || value > INT_MAX) {
1608 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001609 }
1610
Victor Stinnera7368ac2017-11-15 18:11:45 -08001611 *result = (int)value;
1612 return 0;
1613}
1614
1615
1616static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001617pymain_wstr_to_int(const wchar_t *wstr, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001618{
1619 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001620 const wchar_t *endptr = wstr;
1621 long value = wcstol(wstr, (wchar_t **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001622 if (*endptr != '\0' || errno == ERANGE) {
1623 return -1;
1624 }
1625 if (value < INT_MIN || value > INT_MAX) {
1626 return -1;
1627 }
1628
1629 *result = (int)value;
1630 return 0;
1631}
1632
1633
Victor Stinner9cfc0022017-12-20 19:36:46 +01001634static _PyInitError
1635pymain_init_tracemalloc(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001636{
1637 int nframe;
1638 int valid;
1639
Victor Stinner9cfc0022017-12-20 19:36:46 +01001640 const char *env = config_get_env_var("PYTHONTRACEMALLOC");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001641 if (env) {
1642 if (!pymain_str_to_int(env, &nframe)) {
1643 valid = (nframe >= 1);
1644 }
1645 else {
1646 valid = 0;
1647 }
1648 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001649 return _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid number "
1650 "of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001651 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001652 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001653 }
1654
Victor Stinner9cfc0022017-12-20 19:36:46 +01001655 const wchar_t *xoption = config_get_xoption(config, L"tracemalloc");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001656 if (xoption) {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001657 const wchar_t *sep = wcschr(xoption, L'=');
Victor Stinnera7368ac2017-11-15 18:11:45 -08001658 if (sep) {
1659 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1660 valid = (nframe >= 1);
1661 }
1662 else {
1663 valid = 0;
1664 }
1665 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001666 return _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1667 "invalid number of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001668 }
1669 }
1670 else {
1671 /* -X tracemalloc behaves as -X tracemalloc=1 */
1672 nframe = 1;
1673 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001674 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001675 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001676 return _Py_INIT_OK();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001677}
1678
1679
1680static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001681get_env_flag(int *flag, const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001682{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001683 const char *var = config_get_env_var(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001684 if (!var) {
1685 return;
1686 }
1687 int value;
1688 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1689 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1690 value = 1;
1691 }
1692 if (*flag < value) {
1693 *flag = value;
1694 }
1695}
1696
1697
1698static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001699cmdline_get_env_flags(_Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001700{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001701 get_env_flag(&cmdline->debug, "PYTHONDEBUG");
1702 get_env_flag(&cmdline->verbosity, "PYTHONVERBOSE");
1703 get_env_flag(&cmdline->optimization_level, "PYTHONOPTIMIZE");
1704 get_env_flag(&cmdline->inspect, "PYTHONINSPECT");
1705 get_env_flag(&cmdline->dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
1706 get_env_flag(&cmdline->no_user_site_directory, "PYTHONNOUSERSITE");
1707 get_env_flag(&cmdline->use_unbuffered_io, "PYTHONUNBUFFERED");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001708#ifdef MS_WINDOWS
Victor Stinner9cfc0022017-12-20 19:36:46 +01001709 get_env_flag(&cmdline->legacy_windows_fs_encoding,
1710 "PYTHONLEGACYWINDOWSFSENCODING");
1711 get_env_flag(&cmdline->legacy_windows_stdio,
1712 "PYTHONLEGACYWINDOWSSTDIO");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001713#endif
1714}
1715
1716
Victor Stinner46972b72017-11-24 22:55:40 +01001717static _PyInitError
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001718config_init_home(_PyCoreConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001719{
1720 wchar_t *home;
1721
Victor Stinner31a83932017-12-04 13:39:15 +01001722 /* If Py_SetPythonHome() was called, use its value */
1723 home = _Py_path_config.home;
Victor Stinner1f151112017-11-23 10:43:14 +01001724 if (home) {
Victor Stinner46972b72017-11-24 22:55:40 +01001725 config->home = _PyMem_RawWcsdup(home);
1726 if (config->home == NULL) {
1727 return _Py_INIT_NO_MEMORY();
Victor Stinner1f151112017-11-23 10:43:14 +01001728 }
Victor Stinner46972b72017-11-24 22:55:40 +01001729 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001730 }
1731
Victor Stinner46972b72017-11-24 22:55:40 +01001732 int res = config_get_env_var_dup(&home, L"PYTHONHOME", "PYTHONHOME");
Victor Stinner1f151112017-11-23 10:43:14 +01001733 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001734 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinner1f151112017-11-23 10:43:14 +01001735 }
Victor Stinner46972b72017-11-24 22:55:40 +01001736 config->home = home;
1737 return _Py_INIT_OK();
Victor Stinnerd4341102017-11-23 00:12:09 +01001738}
1739
1740
Victor Stinner358e5e12017-12-15 00:51:22 +01001741static _PyInitError
1742config_init_hash_seed(_PyCoreConfig *config)
1743{
1744 if (config->use_hash_seed < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001745 const char *seed_text = config_get_env_var("PYTHONHASHSEED");
Victor Stinner358e5e12017-12-15 00:51:22 +01001746 int use_hash_seed;
1747 unsigned long hash_seed;
1748 if (_Py_ReadHashSeed(seed_text, &use_hash_seed, &hash_seed) < 0) {
1749 return _Py_INIT_USER_ERR("PYTHONHASHSEED must be \"random\" "
1750 "or an integer in range [0; 4294967295]");
1751 }
1752 config->use_hash_seed = use_hash_seed;
1753 config->hash_seed = hash_seed;
1754 }
1755 return _Py_INIT_OK();
1756}
1757
1758
Victor Stinner9cfc0022017-12-20 19:36:46 +01001759static _PyInitError
1760config_init_utf8_mode(_PyCoreConfig *config)
Victor Stinner91106cd2017-12-13 12:29:09 +01001761{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001762 /* The option was already set by Py_UTF8Mode,
1763 Py_LegacyWindowsFSEncodingFlag or PYTHONLEGACYWINDOWSFSENCODING. */
1764 if (config->utf8_mode >= 0) {
1765 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001766 }
Victor Stinner91106cd2017-12-13 12:29:09 +01001767
Victor Stinner9cfc0022017-12-20 19:36:46 +01001768 const wchar_t *xopt = config_get_xoption(config, L"utf8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001769 if (xopt) {
1770 wchar_t *sep = wcschr(xopt, L'=');
1771 if (sep) {
1772 xopt = sep + 1;
1773 if (wcscmp(xopt, L"1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001774 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001775 }
1776 else if (wcscmp(xopt, L"0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001777 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001778 }
1779 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001780 return _Py_INIT_USER_ERR("invalid -X utf8 option value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001781 }
1782 }
1783 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001784 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001785 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001786 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001787 }
1788
Victor Stinner9cfc0022017-12-20 19:36:46 +01001789 const char *opt = config_get_env_var("PYTHONUTF8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001790 if (opt) {
1791 if (strcmp(opt, "1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001792 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001793 }
1794 else if (strcmp(opt, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001795 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001796 }
1797 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001798 return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment "
1799 "variable value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001800 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001801 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001802 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001803
1804 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001805}
Victor Stinner46972b72017-11-24 22:55:40 +01001806
1807
Victor Stinner9cfc0022017-12-20 19:36:46 +01001808static _PyInitError
1809config_read_env_vars(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001810{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001811 config->allocator = config_get_env_var("PYTHONMALLOC");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001812
Victor Stinner9cfc0022017-12-20 19:36:46 +01001813 if (config_get_env_var("PYTHONDUMPREFS")) {
1814 config->dump_refs = 1;
1815 }
1816 if (config_get_env_var("PYTHONMALLOCSTATS")) {
1817 config->malloc_stats = 1;
Victor Stinner31a83932017-12-04 13:39:15 +01001818 }
1819
Victor Stinner9cfc0022017-12-20 19:36:46 +01001820 const char *env = config_get_env_var("PYTHONCOERCECLOCALE");
Victor Stinner94540602017-12-16 04:54:22 +01001821 if (env) {
1822 if (strcmp(env, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001823 config->coerce_c_locale = 0;
Victor Stinner94540602017-12-16 04:54:22 +01001824 }
1825 else if (strcmp(env, "warn") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001826 config->coerce_c_locale_warn = 1;
Victor Stinner94540602017-12-16 04:54:22 +01001827 }
1828 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001829 config->coerce_c_locale = 1;
Victor Stinner94540602017-12-16 04:54:22 +01001830 }
1831 }
1832
Victor Stinner9cfc0022017-12-20 19:36:46 +01001833 wchar_t *path;
1834 int res = config_get_env_var_dup(&path, L"PYTHONPATH", "PYTHONPATH");
1835 if (res < 0) {
Miss Islington (bot)6414da92018-05-19 16:14:42 -07001836 return DECODE_LOCALE_ERR("PYTHONPATH", res);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001837 }
1838 config->module_search_path_env = path;
1839
1840 _PyInitError err = config_init_hash_seed(config);
1841 if (_Py_INIT_FAILED(err)) {
1842 return err;
1843 }
1844
1845 return _Py_INIT_OK();
1846}
1847
1848
1849static _PyInitError
1850config_read_complex_options(_PyCoreConfig *config)
1851{
1852 /* More complex options configured by env var and -X option */
1853 if (config_get_env_var("PYTHONFAULTHANDLER")
1854 || config_get_xoption(config, L"faulthandler")) {
1855 config->faulthandler = 1;
1856 }
1857 if (config_get_env_var("PYTHONPROFILEIMPORTTIME")
1858 || config_get_xoption(config, L"importtime")) {
1859 config->import_time = 1;
1860 }
1861 if (config_get_xoption(config, L"dev" ) ||
1862 config_get_env_var("PYTHONDEVMODE"))
1863 {
1864 config->dev_mode = 1;
1865 config->faulthandler = 1;
1866 config->allocator = "debug";
1867 }
1868
1869 _PyInitError err = pymain_init_tracemalloc(config);
1870 if (_Py_INIT_FAILED(err)) {
1871 return err;
1872 }
1873 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001874}
1875
1876
Victor Stinnera7368ac2017-11-15 18:11:45 -08001877/* Parse command line options and environment variables.
1878 This code must not use Python runtime apart PyMem_Raw memory allocator.
1879
1880 Return 0 on success.
1881 Return 1 if Python is done and must exit.
1882 Set pymain->err and return -1 on error. */
1883static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001884pymain_read_conf_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001885{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001886 _PyInitError err;
1887
Victor Stinnerca719ac2017-12-20 18:00:19 +01001888 int res = pymain_parse_cmdline(pymain, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01001889 if (res != 0) {
1890 return res;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001891 }
1892
Victor Stinner9cfc0022017-12-20 19:36:46 +01001893 /* Set Py_IgnoreEnvironmentFlag for Py_GETENV() */
1894 _PyCoreConfig *config = &pymain->config;
1895 Py_IgnoreEnvironmentFlag = config->ignore_environment;
1896
1897 /* Get environment variables */
1898 cmdline_get_env_flags(cmdline);
1899
1900 err = cmdline_init_env_warnoptions(cmdline);
1901 if (_Py_INIT_FAILED(err)) {
1902 pymain->err = err;
1903 return -1;
1904 }
1905
1906#ifdef MS_WINDOWS
1907 if (cmdline->legacy_windows_fs_encoding) {
1908 config->utf8_mode = 0;
1909 }
1910#endif
1911
Victor Stinnerca719ac2017-12-20 18:00:19 +01001912 if (pymain_init_core_argv(pymain, cmdline) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01001913 return -1;
1914 }
1915
Victor Stinner2b822a02018-01-25 09:18:36 +01001916 /* On Windows, _PyPathConfig_Init() modifies Py_IsolatedFlag and
1917 Py_NoSiteFlag variables if a "._pth" file is found. */
1918 int init_isolated = Py_IsolatedFlag;
1919 int init_no_site = Py_NoSiteFlag;
1920 Py_IsolatedFlag = cmdline->isolated;
1921 Py_NoSiteFlag = cmdline->no_site_import;
Victor Stinner8ded5b82018-01-24 17:03:28 +01001922
Victor Stinner9cfc0022017-12-20 19:36:46 +01001923 err = _PyCoreConfig_Read(config);
Victor Stinner2b822a02018-01-25 09:18:36 +01001924
1925 cmdline->isolated = Py_IsolatedFlag;
1926 cmdline->no_site_import = Py_NoSiteFlag;
1927 Py_IsolatedFlag = init_isolated;
1928 Py_NoSiteFlag = init_no_site;
1929
Victor Stinner31a83932017-12-04 13:39:15 +01001930 if (_Py_INIT_FAILED(err)) {
1931 pymain->err = err;
1932 return -1;
1933 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001934 return 0;
1935}
1936
1937
Victor Stinner19760862017-12-20 01:41:59 +01001938/* Read the configuration, but initialize also the LC_CTYPE locale:
1939 enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538) */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001940static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001941pymain_read_conf(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001942{
Victor Stinner94540602017-12-16 04:54:22 +01001943 int res = -1;
1944
Victor Stinner94540602017-12-16 04:54:22 +01001945 char *oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
1946 if (oldloc == NULL) {
1947 pymain->err = _Py_INIT_NO_MEMORY();
1948 goto done;
1949 }
1950
1951 /* Reconfigure the locale to the default for this process */
1952 _Py_SetLocaleFromEnv(LC_ALL);
1953
1954 int locale_coerced = 0;
1955 int loops = 0;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001956 int init_ignore_env = pymain->config.ignore_environment;
Victor Stinner94540602017-12-16 04:54:22 +01001957
1958 while (1) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001959 int utf8_mode = pymain->config.utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01001960 int encoding_changed = 0;
1961
1962 /* Watchdog to prevent an infinite loop */
1963 loops++;
1964 if (loops == 3) {
1965 pymain->err = _Py_INIT_ERR("Encoding changed twice while "
1966 "reading the configuration");
1967 goto done;
1968 }
1969
Victor Stinnerca719ac2017-12-20 18:00:19 +01001970 if (pymain_init_cmdline_argv(pymain, cmdline) < 0) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001971 goto done;
Victor Stinner94540602017-12-16 04:54:22 +01001972 }
1973
Victor Stinner9cfc0022017-12-20 19:36:46 +01001974 int conf_res = pymain_read_conf_impl(pymain, cmdline);
1975 if (conf_res != 0) {
1976 res = conf_res;
Victor Stinner94540602017-12-16 04:54:22 +01001977 goto done;
1978 }
1979
1980 /* The legacy C locale assumes ASCII as the default text encoding, which
1981 * causes problems not only for the CPython runtime, but also other
1982 * components like GNU readline.
1983 *
1984 * Accordingly, when the CLI detects it, it attempts to coerce it to a
1985 * more capable UTF-8 based alternative.
1986 *
1987 * See the documentation of the PYTHONCOERCECLOCALE setting for more
1988 * details.
1989 */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001990 if (pymain->config.coerce_c_locale == 1 && !locale_coerced) {
Victor Stinner94540602017-12-16 04:54:22 +01001991 locale_coerced = 1;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001992 _Py_CoerceLegacyLocale(&pymain->config);
Victor Stinner94540602017-12-16 04:54:22 +01001993 encoding_changed = 1;
1994 }
1995
1996 if (utf8_mode == -1) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001997 if (pymain->config.utf8_mode == 1) {
Victor Stinner94540602017-12-16 04:54:22 +01001998 /* UTF-8 Mode enabled */
1999 encoding_changed = 1;
2000 }
2001 }
2002 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002003 if (pymain->config.utf8_mode != utf8_mode) {
Victor Stinner94540602017-12-16 04:54:22 +01002004 encoding_changed = 1;
2005 }
2006 }
2007
2008 if (!encoding_changed) {
2009 break;
2010 }
2011
2012 /* Reset the configuration, except UTF-8 Mode. Set Py_UTF8Mode for
2013 Py_DecodeLocale(). Reset Py_IgnoreEnvironmentFlag, modified by
Victor Stinner8ded5b82018-01-24 17:03:28 +01002014 pymain_read_conf_impl(). Reset Py_IsolatedFlag and Py_NoSiteFlag
2015 modified by _PyCoreConfig_Read(). */
Victor Stinner9cfc0022017-12-20 19:36:46 +01002016 Py_UTF8Mode = pymain->config.utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002017 Py_IgnoreEnvironmentFlag = init_ignore_env;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002018 _PyCoreConfig_Clear(&pymain->config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002019 pymain_clear_cmdline(pymain, cmdline);
Miss Islington (bot)046da162018-06-15 15:26:29 -07002020 memset(cmdline, 0, sizeof(*cmdline));
Victor Stinnerca719ac2017-12-20 18:00:19 +01002021 pymain_get_global_config(pymain, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01002022
2023 /* The encoding changed: read again the configuration
2024 with the new encoding */
2025 }
2026 res = 0;
2027
2028done:
2029 if (oldloc != NULL) {
2030 setlocale(LC_ALL, oldloc);
2031 PyMem_RawFree(oldloc);
2032 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002033
Victor Stinnera7368ac2017-11-15 18:11:45 -08002034 return res;
2035}
2036
Victor Stinner91106cd2017-12-13 12:29:09 +01002037
Victor Stinner9cfc0022017-12-20 19:36:46 +01002038static void
2039config_init_locale(_PyCoreConfig *config)
2040{
2041 if (config->utf8_mode >= 0 && config->coerce_c_locale >= 0) {
2042 return;
2043 }
2044
2045 if (_Py_LegacyLocaleDetected()) {
2046 /* POSIX locale: enable C locale coercion and UTF-8 Mode */
2047 if (config->utf8_mode < 0) {
2048 config->utf8_mode = 1;
2049 }
2050 if (config->coerce_c_locale < 0) {
2051 config->coerce_c_locale = 1;
2052 }
2053 return;
2054 }
2055
2056 /* By default, C locale coercion and UTF-8 Mode are disabled */
2057 if (config->coerce_c_locale < 0) {
2058 config->coerce_c_locale = 0;
2059 }
2060 if (config->utf8_mode < 0) {
2061 config->utf8_mode = 0;
2062 }
2063}
2064
2065
Victor Stinner8ded5b82018-01-24 17:03:28 +01002066static _PyInitError
2067config_init_module_search_paths(_PyCoreConfig *config)
2068{
2069 assert(config->module_search_paths == NULL);
2070 assert(config->nmodule_search_path < 0);
2071
2072 config->nmodule_search_path = 0;
2073
2074 const wchar_t *sys_path = Py_GetPath();
2075 const wchar_t delim = DELIM;
2076 const wchar_t *p = sys_path;
2077 while (1) {
2078 p = wcschr(sys_path, delim);
2079 if (p == NULL) {
2080 p = sys_path + wcslen(sys_path); /* End of string */
2081 }
2082
2083 size_t path_len = (p - sys_path);
2084 wchar_t *path = PyMem_RawMalloc((path_len + 1) * sizeof(wchar_t));
2085 if (path == NULL) {
2086 return _Py_INIT_NO_MEMORY();
2087 }
2088 memcpy(path, sys_path, path_len * sizeof(wchar_t));
2089 path[path_len] = L'\0';
2090
2091 _PyInitError err = wstrlist_append(&config->nmodule_search_path,
2092 &config->module_search_paths,
2093 path);
2094 PyMem_RawFree(path);
2095 if (_Py_INIT_FAILED(err)) {
2096 return err;
2097 }
2098
2099 if (*p == '\0') {
2100 break;
2101 }
2102 sys_path = p + 1;
2103 }
2104 return _Py_INIT_OK();
2105}
2106
2107
2108static _PyInitError
2109config_init_path_config(_PyCoreConfig *config)
2110{
2111 _PyInitError err = _PyPathConfig_Init(config);
2112 if (_Py_INIT_FAILED(err)) {
2113 return err;
2114 }
2115
2116 if (config->nmodule_search_path < 0) {
2117 err = config_init_module_search_paths(config);
2118 if (_Py_INIT_FAILED(err)) {
2119 return err;
2120 }
2121 }
2122
2123 if (config->executable == NULL) {
2124 config->executable = _PyMem_RawWcsdup(Py_GetProgramFullPath());
2125 if (config->executable == NULL) {
2126 return _Py_INIT_NO_MEMORY();
2127 }
2128 }
2129
2130 if (config->prefix == NULL) {
2131 config->prefix = _PyMem_RawWcsdup(Py_GetPrefix());
2132 if (config->prefix == NULL) {
2133 return _Py_INIT_NO_MEMORY();
2134 }
2135 }
2136
2137 if (config->exec_prefix == NULL) {
2138 config->exec_prefix = _PyMem_RawWcsdup(Py_GetExecPrefix());
2139 if (config->exec_prefix == NULL) {
2140 return _Py_INIT_NO_MEMORY();
2141 }
2142 }
2143
2144 if (config->base_prefix == NULL) {
2145 config->base_prefix = _PyMem_RawWcsdup(config->prefix);
2146 if (config->base_prefix == NULL) {
2147 return _Py_INIT_NO_MEMORY();
2148 }
2149 }
2150
2151 if (config->base_exec_prefix == NULL) {
2152 config->base_exec_prefix = _PyMem_RawWcsdup(config->exec_prefix);
2153 if (config->base_exec_prefix == NULL) {
2154 return _Py_INIT_NO_MEMORY();
2155 }
2156 }
2157
2158 return _Py_INIT_OK();
2159}
2160
Victor Stinnerda273412017-12-15 01:46:02 +01002161/* Read configuration settings from standard locations
2162 *
2163 * This function doesn't make any changes to the interpreter state - it
2164 * merely populates any missing configuration settings. This allows an
2165 * embedding application to completely override a config option by
2166 * setting it before calling this function, or else modify the default
2167 * setting before passing the fully populated config to Py_EndInitialization.
2168 *
2169 * More advanced selective initialization tricks are possible by calling
2170 * this function multiple times with various preconfigured settings.
2171 */
2172
2173_PyInitError
2174_PyCoreConfig_Read(_PyCoreConfig *config)
2175{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002176 _PyInitError err;
2177
2178 err = config_read_env_vars(config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002179 if (_Py_INIT_FAILED(err)) {
2180 return err;
2181 }
2182
Victor Stinner9cfc0022017-12-20 19:36:46 +01002183 /* -X options */
2184 if (config_get_xoption(config, L"showrefcount")) {
2185 config->show_ref_count = 1;
2186 }
2187 if (config_get_xoption(config, L"showalloccount")) {
2188 config->show_alloc_count = 1;
2189 }
2190
2191 err = config_read_complex_options(config);
2192 if (_Py_INIT_FAILED(err)) {
2193 return err;
2194 }
2195
2196 err = config_init_utf8_mode(config);
2197 if (_Py_INIT_FAILED(err)) {
2198 return err;
2199 }
2200
2201 err = config_init_home(config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002202 if (_Py_INIT_FAILED(err)) {
2203 return err;
2204 }
2205
2206 err = config_init_program_name(config);
2207 if (_Py_INIT_FAILED(err)) {
2208 return err;
2209 }
2210
Victor Stinner9cfc0022017-12-20 19:36:46 +01002211 config_init_locale(config);
Victor Stinnerda273412017-12-15 01:46:02 +01002212
Victor Stinner9cfc0022017-12-20 19:36:46 +01002213 /* Signal handlers are installed by default */
2214 if (config->install_signal_handlers < 0) {
2215 config->install_signal_handlers = 1;
Victor Stinner94540602017-12-16 04:54:22 +01002216 }
2217
Victor Stinner8ded5b82018-01-24 17:03:28 +01002218 if (!config->_disable_importlib) {
2219 err = config_init_path_config(config);
2220 if (_Py_INIT_FAILED(err)) {
2221 return err;
2222 }
2223 }
Victor Stinnerda273412017-12-15 01:46:02 +01002224 return _Py_INIT_OK();
2225}
2226
2227
2228void
2229_PyCoreConfig_Clear(_PyCoreConfig *config)
2230{
2231#define CLEAR(ATTR) \
2232 do { \
2233 PyMem_RawFree(ATTR); \
2234 ATTR = NULL; \
2235 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002236#define CLEAR_WSTRLIST(LEN, LIST) \
2237 do { \
2238 clear_wstrlist(LEN, LIST); \
2239 LEN = 0; \
2240 LIST = NULL; \
2241 } while (0)
Victor Stinnerda273412017-12-15 01:46:02 +01002242
2243 CLEAR(config->module_search_path_env);
2244 CLEAR(config->home);
2245 CLEAR(config->program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002246 CLEAR(config->program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002247
Victor Stinner8ded5b82018-01-24 17:03:28 +01002248 CLEAR_WSTRLIST(config->argc, config->argv);
2249 config->argc = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002250
Victor Stinner8ded5b82018-01-24 17:03:28 +01002251 CLEAR_WSTRLIST(config->nwarnoption, config->warnoptions);
2252 CLEAR_WSTRLIST(config->nxoption, config->xoptions);
2253 CLEAR_WSTRLIST(config->nmodule_search_path, config->module_search_paths);
2254 config->nmodule_search_path = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002255
Victor Stinner8ded5b82018-01-24 17:03:28 +01002256 CLEAR(config->executable);
2257 CLEAR(config->prefix);
2258 CLEAR(config->base_prefix);
2259 CLEAR(config->exec_prefix);
2260 CLEAR(config->base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002261#undef CLEAR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002262#undef CLEAR_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002263}
2264
2265
2266int
2267_PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
2268{
2269 _PyCoreConfig_Clear(config);
2270
2271#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
Victor Stinnerc4bca952017-12-19 23:48:17 +01002272#define COPY_STR_ATTR(ATTR) \
2273 do { \
2274 if (config2->ATTR != NULL) { \
2275 config->ATTR = _PyMem_RawWcsdup(config2->ATTR); \
2276 if (config->ATTR == NULL) { \
2277 return -1; \
2278 } \
2279 } \
2280 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002281#define COPY_WSTRLIST(LEN, LIST) \
2282 do { \
2283 if (config2->LIST != NULL) { \
2284 config->LIST = copy_wstrlist(config2->LEN, config2->LIST); \
2285 if (config->LIST == NULL) { \
2286 return -1; \
2287 } \
2288 } \
2289 config->LEN = config2->LEN; \
2290 } while (0)
Victor Stinnerc4bca952017-12-19 23:48:17 +01002291
Victor Stinnerda273412017-12-15 01:46:02 +01002292 COPY_ATTR(ignore_environment);
2293 COPY_ATTR(use_hash_seed);
2294 COPY_ATTR(hash_seed);
2295 COPY_ATTR(_disable_importlib);
2296 COPY_ATTR(allocator);
2297 COPY_ATTR(dev_mode);
2298 COPY_ATTR(faulthandler);
2299 COPY_ATTR(tracemalloc);
2300 COPY_ATTR(import_time);
2301 COPY_ATTR(show_ref_count);
2302 COPY_ATTR(show_alloc_count);
2303 COPY_ATTR(dump_refs);
2304 COPY_ATTR(malloc_stats);
2305 COPY_ATTR(utf8_mode);
Victor Stinnerda273412017-12-15 01:46:02 +01002306
2307 COPY_STR_ATTR(module_search_path_env);
2308 COPY_STR_ATTR(home);
2309 COPY_STR_ATTR(program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002310 COPY_STR_ATTR(program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002311
Victor Stinner8ded5b82018-01-24 17:03:28 +01002312 COPY_WSTRLIST(argc, argv);
2313 COPY_WSTRLIST(nwarnoption, warnoptions);
2314 COPY_WSTRLIST(nxoption, xoptions);
2315 COPY_WSTRLIST(nmodule_search_path, module_search_paths);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002316
Victor Stinner8ded5b82018-01-24 17:03:28 +01002317 COPY_STR_ATTR(executable);
2318 COPY_STR_ATTR(prefix);
2319 COPY_STR_ATTR(base_prefix);
2320 COPY_STR_ATTR(exec_prefix);
2321 COPY_STR_ATTR(base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002322
Victor Stinnerc4bca952017-12-19 23:48:17 +01002323#undef COPY_ATTR
Victor Stinnerda273412017-12-15 01:46:02 +01002324#undef COPY_STR_ATTR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002325#undef COPY_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002326 return 0;
2327}
2328
2329
2330void
2331_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config)
2332{
2333 Py_CLEAR(config->argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002334 Py_CLEAR(config->executable);
2335 Py_CLEAR(config->prefix);
2336 Py_CLEAR(config->base_prefix);
2337 Py_CLEAR(config->exec_prefix);
2338 Py_CLEAR(config->base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002339 Py_CLEAR(config->warnoptions);
2340 Py_CLEAR(config->xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002341 Py_CLEAR(config->module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002342}
2343
2344
2345static PyObject*
2346config_copy_attr(PyObject *obj)
2347{
2348 if (PyUnicode_Check(obj)) {
2349 Py_INCREF(obj);
2350 return obj;
2351 }
2352 else if (PyList_Check(obj)) {
2353 return PyList_GetSlice(obj, 0, Py_SIZE(obj));
2354 }
2355 else if (PyDict_Check(obj)) {
2356 /* The dict type is used for xoptions. Make the assumption that keys
2357 and values are immutables */
2358 return PyDict_Copy(obj);
2359 }
2360 else {
2361 PyErr_Format(PyExc_TypeError,
2362 "cannot copy config attribute of type %.200s",
2363 Py_TYPE(obj)->tp_name);
2364 return NULL;
2365 }
2366}
2367
2368
2369int
2370_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config,
2371 const _PyMainInterpreterConfig *config2)
2372{
2373 _PyMainInterpreterConfig_Clear(config);
2374
2375#define COPY_ATTR(ATTR) \
2376 do { \
2377 if (config2->ATTR != NULL) { \
2378 config->ATTR = config_copy_attr(config2->ATTR); \
2379 if (config->ATTR == NULL) { \
2380 return -1; \
2381 } \
2382 } \
2383 } while (0)
2384
2385 COPY_ATTR(argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002386 COPY_ATTR(executable);
2387 COPY_ATTR(prefix);
2388 COPY_ATTR(base_prefix);
2389 COPY_ATTR(exec_prefix);
2390 COPY_ATTR(base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002391 COPY_ATTR(warnoptions);
2392 COPY_ATTR(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002393 COPY_ATTR(module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002394#undef COPY_ATTR
2395 return 0;
2396}
2397
2398
2399
2400
Victor Stinner41264f12017-12-15 02:05:29 +01002401_PyInitError
Victor Stinner9cfc0022017-12-20 19:36:46 +01002402_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config,
2403 const _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002404{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002405 if (main_config->install_signal_handlers < 0) {
2406 main_config->install_signal_handlers = config->install_signal_handlers;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002407 }
2408
Victor Stinner9cfc0022017-12-20 19:36:46 +01002409 if (main_config->xoptions == NULL) {
2410 main_config->xoptions = config_create_xoptions_dict(config);
2411 if (main_config->xoptions == NULL) {
2412 return _Py_INIT_NO_MEMORY();
2413 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002414 }
2415
Victor Stinner8ded5b82018-01-24 17:03:28 +01002416#define COPY_WSTR(ATTR) \
2417 do { \
2418 if (main_config->ATTR == NULL) { \
2419 main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \
2420 if (main_config->ATTR == NULL) { \
2421 return _Py_INIT_NO_MEMORY(); \
2422 } \
2423 } \
2424 } while (0)
2425#define COPY_WSTRLIST(ATTR, LEN, LIST) \
2426 do { \
2427 if (ATTR == NULL) { \
2428 ATTR = wstrlist_as_pylist(LEN, LIST); \
2429 if (ATTR == NULL) { \
2430 return _Py_INIT_NO_MEMORY(); \
2431 } \
2432 } \
2433 } while (0)
2434
2435 COPY_WSTRLIST(main_config->warnoptions,
2436 config->nwarnoption, config->warnoptions);
2437 if (config->argc >= 0) {
2438 COPY_WSTRLIST(main_config->argv,
2439 config->argc, config->argv);
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002440 }
2441
Victor Stinner8ded5b82018-01-24 17:03:28 +01002442 if (!config->_disable_importlib) {
2443 COPY_WSTR(executable);
2444 COPY_WSTR(prefix);
2445 COPY_WSTR(base_prefix);
2446 COPY_WSTR(exec_prefix);
2447 COPY_WSTR(base_exec_prefix);
2448
2449 COPY_WSTRLIST(main_config->module_search_path,
2450 config->nmodule_search_path, config->module_search_paths);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002451 }
Victor Stinner41264f12017-12-15 02:05:29 +01002452
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002453 return _Py_INIT_OK();
Victor Stinner8ded5b82018-01-24 17:03:28 +01002454#undef COPY_WSTR
2455#undef COPY_WSTRLIST
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002456}
2457
2458
2459static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01002460pymain_init_python_main(_PyMain *pymain)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002461{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002462 _PyInitError err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002463
Victor Stinner9cfc0022017-12-20 19:36:46 +01002464 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
2465 err = _PyMainInterpreterConfig_Read(&main_config, &pymain->config);
2466 if (!_Py_INIT_FAILED(err)) {
2467 err = _Py_InitializeMainInterpreter(&main_config);
2468 }
2469 _PyMainInterpreterConfig_Clear(&main_config);
2470
2471 if (_Py_INIT_FAILED(err)) {
2472 pymain->err = err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002473 return -1;
2474 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002475 return 0;
2476}
Victor Stinnera7368ac2017-11-15 18:11:45 -08002477
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002478
2479static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01002480pymain_init_sys_path(_PyMain *pymain)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002481{
Victor Stinnerca719ac2017-12-20 18:00:19 +01002482 if (pymain->filename != NULL) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002483 /* If filename is a package (ex: directory or ZIP file) which contains
2484 __main__.py, main_importer_path is set to filename and will be
2485 prepended to sys.path by pymain_run_main_from_importer(). Otherwise,
2486 main_importer_path is set to NULL. */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002487 pymain->main_importer_path = pymain_get_importer(pymain->filename);
Victor Stinnerd5dda982017-12-13 17:31:16 +01002488 }
2489
Victor Stinner19760862017-12-20 01:41:59 +01002490 PyObject *path0;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002491 if (pymain_compute_path0(pymain, &path0) < 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002492 return -1;
2493 }
Victor Stinner19760862017-12-20 01:41:59 +01002494
Victor Stinner9cfc0022017-12-20 19:36:46 +01002495 pymain_clear_config(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002496
2497 if (path0 != NULL) {
2498 if (pymain_update_sys_path(pymain, path0) < 0) {
2499 Py_DECREF(path0);
2500 return -1;
2501 }
2502 Py_DECREF(path0);
2503 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002504 return 0;
2505}
2506
2507
2508static void
2509pymain_run_python(_PyMain *pymain)
2510{
Victor Stinner19760862017-12-20 01:41:59 +01002511 PyCompilerFlags cf = {.cf_flags = 0};
Victor Stinnera7368ac2017-11-15 18:11:45 -08002512
2513 pymain_header(pymain);
2514 pymain_import_readline(pymain);
2515
Victor Stinnerca719ac2017-12-20 18:00:19 +01002516 if (pymain->command) {
2517 pymain->status = pymain_run_command(pymain->command, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002518 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002519 else if (pymain->module) {
2520 pymain->status = (pymain_run_module(pymain->module, 1) != 0);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002521 }
2522 else {
Victor Stinner19760862017-12-20 01:41:59 +01002523 pymain_run_filename(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002524 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002525
Victor Stinner19760862017-12-20 01:41:59 +01002526 pymain_repl(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002527}
2528
2529
Victor Stinnerc4bca952017-12-19 23:48:17 +01002530static void
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002531pymain_init(_PyMain *pymain)
2532{
Victor Stinner94540602017-12-16 04:54:22 +01002533 /* 754 requires that FP exceptions run in "no stop" mode by default,
2534 * and until C vendors implement C99's ways to control FP exceptions,
2535 * Python requires non-stop mode. Alas, some platforms enable FP
2536 * exceptions by default. Here we disable them.
2537 */
2538#ifdef __FreeBSD__
2539 fedisableexcept(FE_OVERFLOW);
2540#endif
2541
Victor Stinner9cfc0022017-12-20 19:36:46 +01002542 pymain->config._disable_importlib = 0;
Victor Stinnere32e79f2017-11-23 01:49:45 +01002543 pymain->config.install_signal_handlers = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002544}
2545
Victor Stinnera7368ac2017-11-15 18:11:45 -08002546
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002547static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01002548pymain_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002549{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002550 pymain->err = _PyRuntime_Initialize();
2551 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002552 return -1;
2553 }
2554
Victor Stinnerca719ac2017-12-20 18:00:19 +01002555 int res = pymain_read_conf(pymain, cmdline);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002556 if (res < 0) {
2557 return -1;
2558 }
2559 if (res > 0) {
2560 /* --help or --version command: we are done */
Victor Stinner19760862017-12-20 01:41:59 +01002561 return 1;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002562 }
2563
Victor Stinner94540602017-12-16 04:54:22 +01002564 if (cmdline->print_help) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002565 pymain_usage(0, pymain->config.program);
Victor Stinner19760862017-12-20 01:41:59 +01002566 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002567 }
2568
2569 if (cmdline->print_version) {
2570 printf("Python %s\n",
2571 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
Victor Stinner19760862017-12-20 01:41:59 +01002572 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002573 }
2574
Victor Stinnerc4bca952017-12-19 23:48:17 +01002575 /* For Py_GetArgcArgv(). Cleared by pymain_free(). */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002576 orig_argv = copy_wstrlist(pymain->argc, cmdline->argv);
2577 if (orig_argv == NULL) {
2578 pymain->err = _Py_INIT_NO_MEMORY();
2579 return -1;
2580 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01002581 orig_argc = pymain->argc;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002582
Victor Stinner9cfc0022017-12-20 19:36:46 +01002583 _PyInitError err = config_init_warnoptions(&pymain->config, cmdline);
2584 if (_Py_INIT_FAILED(err)) {
2585 pymain->err = err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002586 return -1;
2587 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002588 return 0;
2589}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00002590
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002591
Victor Stinnerca719ac2017-12-20 18:00:19 +01002592/* Read the configuration into _PyCoreConfig and _PyMain, initialize the
2593 LC_CTYPE locale and Py_DecodeLocale().
2594
2595 Configuration:
2596
2597 * Command line arguments
2598 * Environment variables
2599 * Py_xxx global configuration variables
2600
2601 _Py_CommandLineDetails is a temporary structure used to prioritize these
2602 variables. */
2603static int
2604pymain_cmdline(_PyMain *pymain)
2605{
Victor Stinner31e99082017-12-20 23:41:38 +01002606 /* Force default allocator, since pymain_free() and pymain_clear_config()
2607 must use the same allocator than this function. */
2608 PyMemAllocatorEx old_alloc;
2609 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2610#ifdef Py_DEBUG
2611 PyMemAllocatorEx default_alloc;
2612 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &default_alloc);
2613#endif
2614
Victor Stinnerca719ac2017-12-20 18:00:19 +01002615 _Py_CommandLineDetails cmdline;
2616 memset(&cmdline, 0, sizeof(cmdline));
2617
2618 pymain_get_global_config(pymain, &cmdline);
2619
2620 int res = pymain_cmdline_impl(pymain, &cmdline);
2621
2622 pymain_set_global_config(pymain, &cmdline);
2623
2624 pymain_clear_cmdline(pymain, &cmdline);
Victor Stinner31e99082017-12-20 23:41:38 +01002625
2626#ifdef Py_DEBUG
2627 /* Make sure that PYMEM_DOMAIN_RAW has not been modified */
2628 PyMemAllocatorEx cur_alloc;
2629 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &cur_alloc);
2630 assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0);
2631#endif
2632 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002633 return res;
2634}
2635
2636
Victor Stinner94540602017-12-16 04:54:22 +01002637static int
2638pymain_main(_PyMain *pymain)
2639{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002640 pymain_init(pymain);
Victor Stinner94540602017-12-16 04:54:22 +01002641
Victor Stinnerca719ac2017-12-20 18:00:19 +01002642 int res = pymain_cmdline(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002643 if (res < 0) {
Victor Stinner94540602017-12-16 04:54:22 +01002644 _Py_FatalInitError(pymain->err);
2645 }
Victor Stinner19760862017-12-20 01:41:59 +01002646 if (res == 1) {
2647 goto done;
2648 }
2649
Victor Stinner9cfc0022017-12-20 19:36:46 +01002650 pymain_init_stdio(pymain);
2651
Miss Islington (bot)03ec4df2018-07-20 17:16:22 -07002652 /* bpo-34008: For backward compatibility reasons, calling Py_Main() after
2653 Py_Initialize() ignores the new configuration. */
2654 if (!_PyRuntime.initialized) {
2655 pymain->err = _Py_InitializeCore(&pymain->config);
2656 if (_Py_INIT_FAILED(pymain->err)) {
2657 _Py_FatalInitError(pymain->err);
2658 }
Victor Stinner19760862017-12-20 01:41:59 +01002659 }
2660
2661 if (pymain_init_python_main(pymain) < 0) {
2662 _Py_FatalInitError(pymain->err);
2663 }
2664
Victor Stinner9cfc0022017-12-20 19:36:46 +01002665 if (pymain_init_sys_path(pymain) < 0) {
2666 _Py_FatalInitError(pymain->err);
2667 }
2668
Victor Stinner19760862017-12-20 01:41:59 +01002669 pymain_run_python(pymain);
2670
2671 if (Py_FinalizeEx() < 0) {
2672 /* Value unlikely to be confused with a non-error exit status or
2673 other special meaning */
2674 pymain->status = 120;
2675 }
2676
2677done:
Victor Stinner94540602017-12-16 04:54:22 +01002678 pymain_free(pymain);
2679
Victor Stinner94540602017-12-16 04:54:22 +01002680 return pymain->status;
2681}
2682
2683
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002684int
2685Py_Main(int argc, wchar_t **argv)
2686{
2687 _PyMain pymain = _PyMain_INIT;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002688 pymain.use_bytes_argv = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002689 pymain.argc = argc;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002690 pymain.wchar_argv = argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002691
Victor Stinner94540602017-12-16 04:54:22 +01002692 return pymain_main(&pymain);
Guido van Rossum667d7041995-08-04 04:20:48 +00002693}
2694
Victor Stinner94540602017-12-16 04:54:22 +01002695
2696int
2697_Py_UnixMain(int argc, char **argv)
2698{
2699 _PyMain pymain = _PyMain_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01002700 pymain.use_bytes_argv = 1;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002701 pymain.argc = argc;
Victor Stinner94540602017-12-16 04:54:22 +01002702 pymain.bytes_argv = argv;
2703
2704 return pymain_main(&pymain);
2705}
2706
2707
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002708/* this is gonna seem *real weird*, but if you put some other code between
2709 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
2710 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00002711
Guido van Rossum667d7041995-08-04 04:20:48 +00002712/* Make the *original* argc/argv available to other modules.
2713 This is rare, but it is needed by the secureware extension. */
2714
2715void
Martin v. Löwis790465f2008-04-05 20:41:37 +00002716Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00002717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 *argc = orig_argc;
2719 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00002720}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002721
2722#ifdef __cplusplus
2723}
2724#endif