blob: 9cbb3f1ce003948358b5cb6a08ce71760baddecf [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\
Cheryl Sabella186b6062018-02-24 22:04:40 -050099-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"
147"PYTHONDEVMODE: enable the development mode.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000148
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800149static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800150pymain_usage(int error, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000151{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800152 FILE *f = error ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 fprintf(f, usage_line, program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800155 if (error)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 fprintf(f, "Try `python -h' for more information.\n");
157 else {
158 fputs(usage_1, f);
159 fputs(usage_2, f);
160 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200161 fprintf(f, usage_4, (wint_t)DELIM);
162 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100163 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000165}
166
Victor Stinnera7368ac2017-11-15 18:11:45 -0800167
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200168static const char*
Victor Stinner9cfc0022017-12-20 19:36:46 +0100169config_get_env_var(const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -0800170{
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200171 const char *var = Py_GETENV(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800172 if (var && var[0] != '\0') {
173 return var;
174 }
175 else {
176 return NULL;
177 }
178}
179
180
Victor Stinnerca719ac2017-12-20 18:00:19 +0100181static int
182config_get_env_var_dup(wchar_t **dest, wchar_t *wname, char *name)
183{
184 if (Py_IgnoreEnvironmentFlag) {
185 *dest = NULL;
186 return 0;
187 }
188
189#ifdef MS_WINDOWS
190 const wchar_t *var = _wgetenv(wname);
191 if (!var || var[0] == '\0') {
192 *dest = NULL;
193 return 0;
194 }
195
196 wchar_t *copy = _PyMem_RawWcsdup(var);
197 if (copy == NULL) {
198 return -1;
199 }
200
201 *dest = copy;
202#else
203 const char *var = getenv(name);
204 if (!var || var[0] == '\0') {
205 *dest = NULL;
206 return 0;
207 }
208
209 size_t len;
210 wchar_t *wvar = Py_DecodeLocale(var, &len);
211 if (!wvar) {
212 if (len == (size_t)-2) {
213 return -2;
214 }
215 else {
216 return -1;
217 }
218 }
219 *dest = wvar;
220#endif
221 return 0;
222}
223
224
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800225static void
Victor Stinner33c377e2017-12-05 15:12:41 +0100226pymain_run_startup(PyCompilerFlags *cf)
Martin v. Löwis6caea372003-11-18 19:46:25 +0000227{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100228 const char *startup = config_get_env_var("PYTHONSTARTUP");
Victor Stinner6bf992a2017-12-06 17:26:10 +0100229 if (startup == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800230 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800232
233 FILE *fp = _Py_fopen(startup, "r");
234 if (fp == NULL) {
235 int save_errno = errno;
236 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
237 errno = save_errno;
238
239 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
240 startup);
241 PyErr_Print();
242 PyErr_Clear();
243 return;
244 }
245
246 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
247 PyErr_Clear();
248 fclose(fp);
Martin v. Löwis6caea372003-11-18 19:46:25 +0000249}
250
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800251static void
252pymain_run_interactive_hook(void)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200253{
254 PyObject *sys, *hook, *result;
255 sys = PyImport_ImportModule("sys");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800256 if (sys == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200257 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800258 }
259
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200260 hook = PyObject_GetAttrString(sys, "__interactivehook__");
261 Py_DECREF(sys);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800262 if (hook == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200263 PyErr_Clear();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800264 return;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200265 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800266
267 result = _PyObject_CallNoArg(hook);
268 Py_DECREF(hook);
269 if (result == NULL) {
270 goto error;
271 }
272 Py_DECREF(result);
273
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200274 return;
275
276error:
277 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
278 PyErr_Print();
279 PyErr_Clear();
280}
281
Thomas Woutersa9773292006-04-21 09:43:23 +0000282
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800283static int
Victor Stinnerc4bca952017-12-19 23:48:17 +0100284pymain_run_module(const wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 PyObject *module, *runpy, *runmodule, *runargs, *result;
287 runpy = PyImport_ImportModule("runpy");
288 if (runpy == NULL) {
289 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200290 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 return -1;
292 }
293 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
294 if (runmodule == NULL) {
295 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200296 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 Py_DECREF(runpy);
298 return -1;
299 }
300 module = PyUnicode_FromWideChar(modname, wcslen(modname));
301 if (module == NULL) {
302 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200303 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 Py_DECREF(runpy);
305 Py_DECREF(runmodule);
306 return -1;
307 }
308 runargs = Py_BuildValue("(Oi)", module, set_argv0);
309 if (runargs == NULL) {
310 fprintf(stderr,
311 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200312 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 Py_DECREF(runpy);
314 Py_DECREF(runmodule);
315 Py_DECREF(module);
316 return -1;
317 }
318 result = PyObject_Call(runmodule, runargs, NULL);
319 if (result == NULL) {
320 PyErr_Print();
321 }
322 Py_DECREF(runpy);
323 Py_DECREF(runmodule);
324 Py_DECREF(module);
325 Py_DECREF(runargs);
326 if (result == NULL) {
327 return -1;
328 }
329 Py_DECREF(result);
330 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000331}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000332
Nick Coghland2977a32017-03-12 20:38:32 +1000333static PyObject *
Victor Stinnerc4bca952017-12-19 23:48:17 +0100334pymain_get_importer(const wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000335{
Nick Coghland2977a32017-03-12 20:38:32 +1000336 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000337
Nick Coghland2977a32017-03-12 20:38:32 +1000338 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800339 if (sys_path0 == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000340 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800341 }
Victor Stinner4726e402010-10-06 23:24:57 +0000342
Nick Coghland2977a32017-03-12 20:38:32 +1000343 importer = PyImport_GetImporter(sys_path0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800344 if (importer == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000345 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800346 }
Victor Stinner4726e402010-10-06 23:24:57 +0000347
Brett Cannonaa936422012-04-27 15:30:58 -0400348 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000349 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000350 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000351 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800353
Victor Stinner4726e402010-10-06 23:24:57 +0000354 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000355 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000356
Nick Coghland2977a32017-03-12 20:38:32 +1000357error:
358 Py_XDECREF(sys_path0);
359 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
360 PyErr_Print();
361 PyErr_Clear();
362 return NULL;
363}
364
365
366static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800367pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
Victor Stinnera62207c2010-08-07 10:57:17 +0000368{
369 PyObject *unicode, *bytes;
370 int ret;
371
372 unicode = PyUnicode_FromWideChar(command, -1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800373 if (unicode == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000374 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800375 }
376
Victor Stinnera62207c2010-08-07 10:57:17 +0000377 bytes = PyUnicode_AsUTF8String(unicode);
378 Py_DECREF(unicode);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800379 if (bytes == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000380 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800381 }
382
Victor Stinnera62207c2010-08-07 10:57:17 +0000383 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
384 Py_DECREF(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800385 return (ret != 0);
Victor Stinnera62207c2010-08-07 10:57:17 +0000386
387error:
Victor Stinner398356b2010-08-18 22:23:22 +0000388 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000389 PyErr_Print();
390 return 1;
391}
392
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800393
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000394static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800395pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000396{
397 PyObject *unicode, *bytes = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +0200398 const char *filename_str;
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000399 int run;
400
401 /* call pending calls like signal handlers (SIGINT) */
402 if (Py_MakePendingCalls() == -1) {
403 PyErr_Print();
404 return 1;
405 }
406
407 if (filename) {
408 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
409 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000410 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000411 Py_DECREF(unicode);
412 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800413 if (bytes != NULL) {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000414 filename_str = PyBytes_AsString(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800415 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000416 else {
417 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000418 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000419 }
420 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800421 else {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000422 filename_str = "<stdin>";
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800423 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000424
425 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
426 Py_XDECREF(bytes);
427 return run != 0;
428}
429
Christian Heimes9cd17752007-11-18 19:35:23 +0000430
Guido van Rossum667d7041995-08-04 04:20:48 +0000431/* Main program */
432
Eric Snow6b4be192017-05-22 21:36:03 -0700433typedef struct {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100434 wchar_t **argv;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100435 int nwarnoption; /* Number of -W options */
436 wchar_t **warnoptions; /* -W options */
437 int nenv_warnoption; /* Number of PYTHONWARNINGS options */
438 wchar_t **env_warnoptions; /* PYTHONWARNINGS options */
Eric Snow6b4be192017-05-22 21:36:03 -0700439 int print_help; /* -h, -? options */
440 int print_version; /* -V option */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100441 int bytes_warning; /* Py_BytesWarningFlag, -b */
442 int debug; /* Py_DebugFlag, -b, PYTHONDEBUG */
443 int inspect; /* Py_InspectFlag, -i, PYTHONINSPECT */
444 int interactive; /* Py_InteractiveFlag, -i */
445 int isolated; /* Py_IsolatedFlag, -I */
446 int optimization_level; /* Py_OptimizeFlag, -O, PYTHONOPTIMIZE */
447 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag, -B, PYTHONDONTWRITEBYTECODE */
448 int no_user_site_directory; /* Py_NoUserSiteDirectory, -I, -s, PYTHONNOUSERSITE */
449 int no_site_import; /* Py_NoSiteFlag, -S */
450 int use_unbuffered_io; /* Py_UnbufferedStdioFlag, -u, PYTHONUNBUFFERED */
451 int verbosity; /* Py_VerboseFlag, -v, PYTHONVERBOSE */
452 int quiet_flag; /* Py_QuietFlag, -q */
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800453 const char *check_hash_pycs_mode; /* --check-hash-based-pycs */
Victor Stinner6bf992a2017-12-06 17:26:10 +0100454#ifdef MS_WINDOWS
455 int legacy_windows_fs_encoding; /* Py_LegacyWindowsFSEncodingFlag,
456 PYTHONLEGACYWINDOWSFSENCODING */
457 int legacy_windows_stdio; /* Py_LegacyWindowsStdioFlag,
458 PYTHONLEGACYWINDOWSSTDIO */
459#endif
Eric Snow6b4be192017-05-22 21:36:03 -0700460} _Py_CommandLineDetails;
461
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800462/* Structure used by Py_Main() to pass data to subfunctions */
463typedef struct {
Victor Stinner19760862017-12-20 01:41:59 +0100464 /* Input arguments */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800465 int argc;
Victor Stinner94540602017-12-16 04:54:22 +0100466 int use_bytes_argv;
467 char **bytes_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100468 wchar_t **wchar_argv;
Victor Stinner19760862017-12-20 01:41:59 +0100469
470 /* Exit status or "exit code": result of pymain_main() */
471 int status;
472 /* Error message if a function failed */
473 _PyInitError err;
474
Victor Stinner19760862017-12-20 01:41:59 +0100475 /* non-zero is stdin is a TTY or if -i option is used */
476 int stdin_is_interactive;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100477 int skip_first_line; /* -x option */
478 wchar_t *filename; /* Trailing arg without -c or -m */
479 wchar_t *command; /* -c argument */
480 wchar_t *module; /* -m argument */
Victor Stinner19760862017-12-20 01:41:59 +0100481
Victor Stinner9cfc0022017-12-20 19:36:46 +0100482 _PyCoreConfig config;
Victor Stinner19760862017-12-20 01:41:59 +0100483
484 PyObject *main_importer_path;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800485} _PyMain;
486
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800487#define _PyMain_INIT \
Victor Stinner9cfc0022017-12-20 19:36:46 +0100488 {.config = _PyCoreConfig_INIT, \
Victor Stinnerd5dda982017-12-13 17:31:16 +0100489 .err = _Py_INIT_OK()}
490/* Note: _PyMain_INIT sets other fields to 0/NULL */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800491
492
Victor Stinner19760862017-12-20 01:41:59 +0100493/* Non-zero if filename, command (-c) or module (-m) is set
494 on the command line */
495#define RUN_CODE(pymain) \
Victor Stinnerca719ac2017-12-20 18:00:19 +0100496 (pymain->command != NULL || pymain->filename != NULL \
497 || pymain->module != NULL)
Victor Stinner19760862017-12-20 01:41:59 +0100498
499
Victor Stinnerca719ac2017-12-20 18:00:19 +0100500static wchar_t*
501pymain_wstrdup(_PyMain *pymain, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800502{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100503 wchar_t *str2 = _PyMem_RawWcsdup(str);
504 if (str2 == NULL) {
505 pymain->err = _Py_INIT_NO_MEMORY();
506 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800507 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100508 return str2;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800509}
510
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100511
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800512static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100513clear_wstrlist(int len, wchar_t **list)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800514{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100515 for (int i=0; i < len; i++) {
516 PyMem_RawFree(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100517 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100518 PyMem_RawFree(list);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100519}
520
521
522static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100523pymain_init_cmdline_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100524{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100525 assert(cmdline->argv == NULL);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100526
Victor Stinnerca719ac2017-12-20 18:00:19 +0100527 if (pymain->use_bytes_argv) {
528 /* +1 for a the NULL terminator */
529 size_t size = sizeof(wchar_t*) * (pymain->argc + 1);
530 wchar_t** argv = (wchar_t **)PyMem_RawMalloc(size);
531 if (argv == NULL) {
532 pymain->err = _Py_INIT_NO_MEMORY();
533 return -1;
534 }
535
536 for (int i = 0; i < pymain->argc; i++) {
537 size_t len;
538 wchar_t *arg = Py_DecodeLocale(pymain->bytes_argv[i], &len);
539 if (arg == NULL) {
540 clear_wstrlist(i, argv);
541 pymain->err = DECODE_LOCALE_ERR("command line arguments",
542 (Py_ssize_t)len);
543 return -1;
544 }
545 argv[i] = arg;
546 }
547 argv[pymain->argc] = NULL;
548
549 cmdline->argv = argv;
550 }
551 else {
552 cmdline->argv = pymain->wchar_argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100553 }
554
Victor Stinnerca719ac2017-12-20 18:00:19 +0100555 wchar_t *program;
556 if (pymain->argc >= 1 && cmdline->argv != NULL) {
557 program = cmdline->argv[0];
558 }
559 else {
560 program = L"";
561 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100562 pymain->config.program = pymain_wstrdup(pymain, program);
563 if (pymain->config.program == NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +0100564 return -1;
565 }
566
Victor Stinnerc4bca952017-12-19 23:48:17 +0100567 return 0;
568}
569
570
571static void
Victor Stinnerca719ac2017-12-20 18:00:19 +0100572pymain_clear_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100573{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100574 PyMemAllocatorEx old_alloc;
575 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100576
Victor Stinnerca719ac2017-12-20 18:00:19 +0100577 clear_wstrlist(cmdline->nwarnoption, cmdline->warnoptions);
578 cmdline->nwarnoption = 0;
579 cmdline->warnoptions = NULL;
580
581 clear_wstrlist(cmdline->nenv_warnoption, cmdline->env_warnoptions);
582 cmdline->nenv_warnoption = 0;
583 cmdline->env_warnoptions = NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100584
585 if (pymain->use_bytes_argv && cmdline->argv != NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100586 clear_wstrlist(pymain->argc, cmdline->argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100587 }
588 cmdline->argv = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100589
590 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
591}
592
593
594static void
595pymain_clear_pymain(_PyMain *pymain)
596{
597#define CLEAR(ATTR) \
598 do { \
599 PyMem_RawFree(ATTR); \
600 ATTR = NULL; \
601 } while (0)
602
603 CLEAR(pymain->filename);
604 CLEAR(pymain->command);
605 CLEAR(pymain->module);
606#undef CLEAR
Victor Stinnerc4bca952017-12-19 23:48:17 +0100607}
608
Victor Stinnerc4bca952017-12-19 23:48:17 +0100609static void
Victor Stinner9cfc0022017-12-20 19:36:46 +0100610pymain_clear_config(_PyMain *pymain)
Victor Stinnerc4bca952017-12-19 23:48:17 +0100611{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100612 /* Clear core config with the memory allocator
613 used by pymain_read_conf() */
614 PyMemAllocatorEx old_alloc;
615 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
616
Victor Stinner9cfc0022017-12-20 19:36:46 +0100617 _PyCoreConfig_Clear(&pymain->config);
Victor Stinnerc4bca952017-12-19 23:48:17 +0100618
619 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
620}
621
622
623static void
624pymain_free_python(_PyMain *pymain)
625{
626 Py_CLEAR(pymain->main_importer_path);
Victor Stinnerd4341102017-11-23 00:12:09 +0100627
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800628#ifdef __INSURE__
629 /* Insure++ is a memory analysis tool that aids in discovering
630 * memory leaks and other memory problems. On Python exit, the
631 * interned string dictionaries are flagged as being in use at exit
632 * (which it is). Under normal circumstances, this is fine because
633 * the memory will be automatically reclaimed by the system. Under
634 * memory debugging, it's a huge source of useless noise, so we
635 * trade off slower shutdown for less distraction in the memory
636 * reports. -baw
637 */
638 _Py_ReleaseInternedUnicodeStrings();
639#endif /* __INSURE__ */
640}
641
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100642
643static void
Victor Stinnerc4bca952017-12-19 23:48:17 +0100644pymain_free_raw(_PyMain *pymain)
Victor Stinner94540602017-12-16 04:54:22 +0100645{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100646 _PyImport_Fini2();
Victor Stinner94540602017-12-16 04:54:22 +0100647
Victor Stinnerc4bca952017-12-19 23:48:17 +0100648 /* Free global variables which cannot be freed in Py_Finalize():
649 configuration options set before Py_Initialize() which should
650 remain valid after Py_Finalize(), since
651 Py_Initialize()-Py_Finalize() can be called multiple times. */
652 _PyPathConfig_Clear(&_Py_path_config);
Victor Stinner94540602017-12-16 04:54:22 +0100653
Victor Stinner31e99082017-12-20 23:41:38 +0100654 pymain_clear_config(pymain);
655
Victor Stinnerc4bca952017-12-19 23:48:17 +0100656 /* Force the allocator used by pymain_read_conf() */
657 PyMemAllocatorEx old_alloc;
658 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner94540602017-12-16 04:54:22 +0100659
Victor Stinnerca719ac2017-12-20 18:00:19 +0100660 pymain_clear_pymain(pymain);
661
662 clear_wstrlist(orig_argc, orig_argv);
663 orig_argc = 0;
664 orig_argv = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100665
Victor Stinnerc4bca952017-12-19 23:48:17 +0100666 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner92a3c6f2017-12-06 18:12:59 +0100667}
668
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100669
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800670static void
671pymain_free(_PyMain *pymain)
672{
Victor Stinnerc4bca952017-12-19 23:48:17 +0100673 pymain_free_python(pymain);
674 pymain_free_raw(pymain);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800675}
676
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100677
Eric Snow6b4be192017-05-22 21:36:03 -0700678static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800679pymain_run_main_from_importer(_PyMain *pymain)
Guido van Rossum667d7041995-08-04 04:20:48 +0000680{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800681 /* Assume sys_path0 has already been checked by pymain_get_importer(),
682 * so put it in sys.path[0] and import __main__ */
Victor Stinner11a247d2017-12-13 21:05:57 +0100683 PyObject *sys_path = PySys_GetObject("path");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800684 if (sys_path == NULL) {
685 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
686 goto error;
687 }
688
Victor Stinner11a247d2017-12-13 21:05:57 +0100689 if (PyList_Insert(sys_path, 0, pymain->main_importer_path)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800690 goto error;
691 }
692
Victor Stinner11a247d2017-12-13 21:05:57 +0100693 int sts = pymain_run_module(L"__main__", 0);
694 return (sts != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800695
696error:
697 Py_CLEAR(pymain->main_importer_path);
698 PyErr_Print();
699 return 1;
700}
701
702
Victor Stinner9cfc0022017-12-20 19:36:46 +0100703static _PyInitError
704wstrlist_append(int *len, wchar_t ***list, const wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800705{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100706 wchar_t *str2 = _PyMem_RawWcsdup(str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800707 if (str2 == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100708 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800709 }
710
Victor Stinnerca719ac2017-12-20 18:00:19 +0100711 size_t size = (*len + 1) * sizeof(list[0]);
712 wchar_t **list2 = (wchar_t **)PyMem_RawRealloc(*list, size);
713 if (list2 == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800714 PyMem_RawFree(str2);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100715 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800716 }
Victor Stinnerca719ac2017-12-20 18:00:19 +0100717 list2[*len] = str2;
718 *list = list2;
719 (*len)++;
Victor Stinner9cfc0022017-12-20 19:36:46 +0100720 return _Py_INIT_OK();
721}
722
723
724static int
725pymain_wstrlist_append(_PyMain *pymain, int *len, wchar_t ***list, const wchar_t *str)
726{
727 _PyInitError err = wstrlist_append(len, list, str);
728 if (_Py_INIT_FAILED(err)) {
729 pymain->err = err;
730 return -1;
731 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800732 return 0;
733}
734
735
736/* Parse the command line arguments
737 Return 0 on success.
738 Return 1 if parsing failed.
739 Set pymain->err and return -1 on other errors. */
740static int
Victor Stinnerca719ac2017-12-20 18:00:19 +0100741pymain_parse_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800742{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100743 _PyCoreConfig *config = &pymain->config;
744
Antoine Pitrou86838b02012-02-21 19:03:47 +0100745 _PyOS_ResetGetOpt();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800746 do {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800747 int longindex = -1;
Victor Stinnerc4bca952017-12-19 23:48:17 +0100748 int c = _PyOS_GetOpt(pymain->argc, cmdline->argv, PROGRAM_OPTS,
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800749 longoptions, &longindex);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800750 if (c == EOF) {
751 break;
752 }
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 if (c == 'c') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 /* -c is the last option; following arguments
756 that look like options are left for the
757 command to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800758 size_t len = wcslen(_PyOS_optarg) + 1 + 1;
759 wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
760 if (command == NULL) {
Victor Stinner0327bde2017-11-23 17:03:20 +0100761 pymain->err = _Py_INIT_NO_MEMORY();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800762 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800763 }
764 memcpy(command, _PyOS_optarg, len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 command[len - 2] = '\n';
766 command[len - 1] = 0;
Victor Stinnerca719ac2017-12-20 18:00:19 +0100767 pymain->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 break;
769 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 if (c == 'm') {
772 /* -m is the last option; following arguments
773 that look like options are left for the
774 module to interpret. */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100775 pymain->module = pymain_wstrdup(pymain, _PyOS_optarg);
776 if (pymain->module == NULL) {
777 return -1;
778 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 break;
780 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 switch (c) {
Benjamin Peterson42aa93b2017-12-09 10:26:52 -0800783 case 0:
784 // Handle long option.
785 assert(longindex == 0); // Only one long option now.
786 if (!wcscmp(_PyOS_optarg, L"always")) {
787 cmdline->check_hash_pycs_mode = "always";
788 } else if (!wcscmp(_PyOS_optarg, L"never")) {
789 cmdline->check_hash_pycs_mode = "never";
790 } else if (!wcscmp(_PyOS_optarg, L"default")) {
791 cmdline->check_hash_pycs_mode = "default";
792 } else {
793 fprintf(stderr, "--check-hash-based-pycs must be one of "
794 "'default', 'always', or 'never'\n");
795 return 1;
796 }
797 break;
798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700800 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700804 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700808 cmdline->inspect++;
809 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000811
Christian Heimesad73a9c2013-08-10 16:36:18 +0200812 case 'I':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100813 config->ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700814 cmdline->isolated++;
815 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200816 break;
817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700821 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700825 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700829 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700833 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 case 'E':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100837 config->ignore_environment++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000839
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 case 't':
841 /* ignored for backwards compatibility */
842 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700845 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700849 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 case 'x':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100853 pymain->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 case 'h':
857 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700858 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700862 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 case 'W':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100866 if (pymain_wstrlist_append(pymain,
867 &cmdline->nwarnoption,
868 &cmdline->warnoptions,
869 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800870 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800871 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000873
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000874 case 'X':
Victor Stinnerca719ac2017-12-20 18:00:19 +0100875 if (pymain_wstrlist_append(pymain,
Victor Stinner9cfc0022017-12-20 19:36:46 +0100876 &config->nxoption,
877 &config->xoptions,
Victor Stinnerca719ac2017-12-20 18:00:19 +0100878 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800879 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800880 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000881 break;
882
Georg Brandl9d871192010-12-04 10:47:18 +0000883 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700884 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000885 break;
886
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100887 case 'R':
Victor Stinner9cfc0022017-12-20 19:36:46 +0100888 config->use_hash_seed = 0;
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100889 break;
890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 default:
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800894 /* unknown argument: parsing failed */
895 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800897 } while (1);
898
Victor Stinnerca719ac2017-12-20 18:00:19 +0100899 if (pymain->command == NULL && pymain->module == NULL
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800900 && _PyOS_optind < pymain->argc
Victor Stinnerc4bca952017-12-19 23:48:17 +0100901 && wcscmp(cmdline->argv[_PyOS_optind], L"-") != 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800902 {
Victor Stinnerca719ac2017-12-20 18:00:19 +0100903 pymain->filename = pymain_wstrdup(pymain, cmdline->argv[_PyOS_optind]);
904 if (pymain->filename == NULL) {
905 return -1;
906 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000908
Victor Stinnerd5dda982017-12-13 17:31:16 +0100909 /* -c and -m options are exclusive */
Victor Stinnerca719ac2017-12-20 18:00:19 +0100910 assert(!(pymain->command != NULL && pymain->module != NULL));
Victor Stinnerd5dda982017-12-13 17:31:16 +0100911
Eric Snow6b4be192017-05-22 21:36:03 -0700912 return 0;
913}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000914
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800915
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800916static int
Victor Stinner9cfc0022017-12-20 19:36:46 +0100917add_xoption(PyObject *opts, const wchar_t *s)
Victor Stinner374c6e12017-12-14 12:05:26 +0100918{
919 PyObject *name, *value;
920
921 const wchar_t *name_end = wcschr(s, L'=');
922 if (!name_end) {
923 name = PyUnicode_FromWideChar(s, -1);
924 value = Py_True;
925 Py_INCREF(value);
926 }
927 else {
928 name = PyUnicode_FromWideChar(s, name_end - s);
929 value = PyUnicode_FromWideChar(name_end + 1, -1);
930 }
931 if (name == NULL || value == NULL) {
932 goto error;
933 }
934 if (PyDict_SetItem(opts, name, value) < 0) {
935 goto error;
936 }
937 Py_DECREF(name);
938 Py_DECREF(value);
939 return 0;
940
941error:
942 Py_XDECREF(name);
943 Py_XDECREF(value);
944 return -1;
945}
946
Victor Stinner9cfc0022017-12-20 19:36:46 +0100947
948static PyObject*
949config_create_xoptions_dict(const _PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800950{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100951 int nxoption = config->nxoption;
952 wchar_t **xoptions = config->xoptions;
Victor Stinner374c6e12017-12-14 12:05:26 +0100953 PyObject *dict = PyDict_New();
954 if (dict == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100955 return NULL;
Victor Stinner374c6e12017-12-14 12:05:26 +0100956 }
957
Victor Stinnerca719ac2017-12-20 18:00:19 +0100958 for (int i=0; i < nxoption; i++) {
959 wchar_t *option = xoptions[i];
Victor Stinner9cfc0022017-12-20 19:36:46 +0100960 if (add_xoption(dict, option) < 0) {
Victor Stinner374c6e12017-12-14 12:05:26 +0100961 Py_DECREF(dict);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100962 return NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800963 }
964 }
Victor Stinner374c6e12017-12-14 12:05:26 +0100965
Victor Stinner9cfc0022017-12-20 19:36:46 +0100966 return dict;
Eric Snow6b4be192017-05-22 21:36:03 -0700967}
968
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800969
Victor Stinner9cfc0022017-12-20 19:36:46 +0100970static _PyInitError
971config_add_warnings_optlist(_PyCoreConfig *config, int len, wchar_t **options)
Eric Snow6b4be192017-05-22 21:36:03 -0700972{
Victor Stinnerca719ac2017-12-20 18:00:19 +0100973 for (int i = 0; i < len; i++) {
Victor Stinner9cfc0022017-12-20 19:36:46 +0100974 _PyInitError err = wstrlist_append(&config->nwarnoption,
975 &config->warnoptions,
976 options[i]);
977 if (_Py_INIT_FAILED(err)) {
978 return err;
Eric Snow6b4be192017-05-22 21:36:03 -0700979 }
Eric Snow6b4be192017-05-22 21:36:03 -0700980 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100981 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800982}
Eric Snow6b4be192017-05-22 21:36:03 -0700983
Victor Stinner747f48e2017-12-12 22:59:48 +0100984
Victor Stinner9cfc0022017-12-20 19:36:46 +0100985static _PyInitError
986config_init_warnoptions(_PyCoreConfig *config, _Py_CommandLineDetails *cmdline)
Victor Stinner747f48e2017-12-12 22:59:48 +0100987{
Victor Stinner9cfc0022017-12-20 19:36:46 +0100988 _PyInitError err;
989
990 assert(config->nwarnoption == 0);
991
Victor Stinner747f48e2017-12-12 22:59:48 +0100992 /* The priority order for warnings configuration is (highest precedence
993 * first):
994 *
995 * - the BytesWarning filter, if needed ('-b', '-bb')
996 * - any '-W' command line options; then
997 * - the 'PYTHONWARNINGS' environment variable; then
998 * - the dev mode filter ('-X dev', 'PYTHONDEVMODE'); then
999 * - any implicit filters added by _warnings.c/warnings.py
1000 *
1001 * All settings except the last are passed to the warnings module via
1002 * the `sys.warnoptions` list. Since the warnings module works on the basis
1003 * of "the most recently added filter will be checked first", we add
1004 * the lowest precedence entries first so that later entries override them.
1005 */
1006
Victor Stinner9cfc0022017-12-20 19:36:46 +01001007 if (config->dev_mode) {
1008 err = wstrlist_append(&config->nwarnoption,
1009 &config->warnoptions,
1010 L"default");
1011 if (_Py_INIT_FAILED(err)) {
1012 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001013 }
Victor Stinner747f48e2017-12-12 22:59:48 +01001014 }
Victor Stinner374c6e12017-12-14 12:05:26 +01001015
Victor Stinner9cfc0022017-12-20 19:36:46 +01001016 err = config_add_warnings_optlist(config,
1017 cmdline->nenv_warnoption,
1018 cmdline->env_warnoptions);
1019 if (_Py_INIT_FAILED(err)) {
1020 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001021 }
1022
Victor Stinner9cfc0022017-12-20 19:36:46 +01001023 err = config_add_warnings_optlist(config,
1024 cmdline->nwarnoption,
1025 cmdline->warnoptions);
1026 if (_Py_INIT_FAILED(err)) {
1027 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001028 }
1029
1030 /* If the bytes_warning_flag isn't set, bytesobject.c and bytearrayobject.c
1031 * don't even try to emit a warning, so we skip setting the filter in that
1032 * case.
1033 */
1034 if (cmdline->bytes_warning) {
1035 wchar_t *filter;
1036 if (cmdline->bytes_warning> 1) {
1037 filter = L"error::BytesWarning";
1038 }
1039 else {
1040 filter = L"default::BytesWarning";
1041 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001042 err = wstrlist_append(&config->nwarnoption,
1043 &config->warnoptions,
1044 filter);
1045 if (_Py_INIT_FAILED(err)) {
1046 return err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001047 }
1048 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001049 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001050}
1051
1052
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001053/* Get warning options from PYTHONWARNINGS environment variable.
1054 Return 0 on success.
1055 Set pymain->err and return -1 on error. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001056static _PyInitError
1057cmdline_init_env_warnoptions(_Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001058{
1059 if (Py_IgnoreEnvironmentFlag) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001060 return _Py_INIT_OK();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +00001062
Victor Stinnerca719ac2017-12-20 18:00:19 +01001063 wchar_t *env;
1064 int res = config_get_env_var_dup(&env, L"PYTHONWARNINGS", "PYTHONWARNINGS");
1065 if (res < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001066 return DECODE_LOCALE_ERR("PYTHONWARNINGS", res);
Victor Stinnerca719ac2017-12-20 18:00:19 +01001067 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001068
Victor Stinnerca719ac2017-12-20 18:00:19 +01001069 if (env == NULL) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001070 return _Py_INIT_OK();
Victor Stinnerca719ac2017-12-20 18:00:19 +01001071 }
Philip Jenvey0805ca32010-04-07 04:04:10 +00001072
Victor Stinnerca719ac2017-12-20 18:00:19 +01001073
1074 wchar_t *warning, *context = NULL;
1075 for (warning = WCSTOK(env, L",", &context);
1076 warning != NULL;
1077 warning = WCSTOK(NULL, L",", &context))
1078 {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001079 _PyInitError err = wstrlist_append(&cmdline->nenv_warnoption,
1080 &cmdline->env_warnoptions,
1081 warning);
1082 if (_Py_INIT_FAILED(err)) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001083 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001084 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001085 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001087 PyMem_RawFree(env);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001088 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001089}
1090
1091
1092static void
1093pymain_init_stdio(_PyMain *pymain)
1094{
1095 pymain->stdin_is_interactive = (isatty(fileno(stdin))
1096 || Py_InteractiveFlag);
Guido van Rossum775af911997-02-14 19:50:32 +00001097
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00001098#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +00001099 /* don't translate newlines (\r\n <=> \n) */
1100 _setmode(fileno(stdin), O_BINARY);
1101 _setmode(fileno(stdout), O_BINARY);
1102 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +00001103#endif
Victor Stinner89e34362011-01-07 18:47:22 +00001104
1105 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +00001106#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
1108 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
1109 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001110#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 setbuf(stdin, (char *)NULL);
1112 setbuf(stdout, (char *)NULL);
1113 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001114#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 }
1116 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +00001117#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 /* Doesn't have to have line-buffered -- use unbuffered */
1119 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
1120 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001121#else /* !MS_WINDOWS */
1122#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
1124 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +00001125#endif /* HAVE_SETVBUF */
1126#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 /* Leave stderr alone - it should be unbuffered anyway. */
1128 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001129}
Guido van Rossum667d7041995-08-04 04:20:48 +00001130
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001131
1132/* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__
Victor Stinner31a83932017-12-04 13:39:15 +01001133 environment variables on macOS if available. */
1134static _PyInitError
Victor Stinnerca719ac2017-12-20 18:00:19 +01001135config_init_program_name(_PyCoreConfig *config)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001136{
Victor Stinner31a83932017-12-04 13:39:15 +01001137 assert(config->program_name == NULL);
1138
1139 /* If Py_SetProgramName() was called, use its value */
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001140 const wchar_t *program_name = _Py_path_config.program_name;
Victor Stinner31a83932017-12-04 13:39:15 +01001141 if (program_name != NULL) {
1142 config->program_name = _PyMem_RawWcsdup(program_name);
1143 if (config->program_name == NULL) {
1144 return _Py_INIT_NO_MEMORY();
1145 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001146 return _Py_INIT_OK();
Victor Stinner31a83932017-12-04 13:39:15 +01001147 }
1148
Just van Rossum2ac79ef2003-03-05 15:46:54 +00001149#ifdef __APPLE__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 /* On MacOS X, when the Python interpreter is embedded in an
1151 application bundle, it gets executed by a bootstrapping script
1152 that does os.execve() with an argv[0] that's different from the
1153 actual Python executable. This is needed to keep the Finder happy,
1154 or rather, to work around Apple's overly strict requirements of
1155 the process name. However, we still need a usable sys.executable,
1156 so the actual executable path is passed in an environment variable.
1157 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
1158 script. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001159 const char *p = config_get_env_var("PYTHONEXECUTABLE");
Victor Stinner6bf992a2017-12-06 17:26:10 +01001160 if (p != NULL) {
Victor Stinner31a83932017-12-04 13:39:15 +01001161 size_t len;
1162 wchar_t* program_name = Py_DecodeLocale(p, &len);
1163 if (program_name == NULL) {
1164 return DECODE_LOCALE_ERR("PYTHONEXECUTABLE environment "
1165 "variable", (Py_ssize_t)len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 }
Victor Stinner31a83932017-12-04 13:39:15 +01001167 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001168 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001169 }
Vinay Sajip90db6612012-07-17 17:33:46 +01001170#ifdef WITH_NEXT_FRAMEWORK
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001171 else {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001172 const char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
Vinay Sajip90db6612012-07-17 17:33:46 +01001173 if (pyvenv_launcher && *pyvenv_launcher) {
1174 /* Used by Mac/Tools/pythonw.c to forward
1175 * the argv0 of the stub executable
1176 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001177 size_t len;
Victor Stinner31a83932017-12-04 13:39:15 +01001178 wchar_t* program_name = Py_DecodeLocale(pyvenv_launcher, &len);
1179 if (program_name == NULL) {
1180 return DECODE_LOCALE_ERR("__PYVENV_LAUNCHER__ environment "
1181 "variable", (Py_ssize_t)len);
Vinay Sajip90db6612012-07-17 17:33:46 +01001182 }
Victor Stinner31a83932017-12-04 13:39:15 +01001183 config->program_name = program_name;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001184 return _Py_INIT_OK();
Vinay Sajip90db6612012-07-17 17:33:46 +01001185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001187#endif /* WITH_NEXT_FRAMEWORK */
1188#endif /* __APPLE__ */
Victor Stinneraf5a8952017-12-02 10:11:32 +01001189
Victor Stinnerca719ac2017-12-20 18:00:19 +01001190 /* Use argv[0] by default, if available */
1191 if (config->program != NULL) {
1192 config->program_name = _PyMem_RawWcsdup(config->program);
1193 if (config->program_name == NULL) {
1194 return _Py_INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001195 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001196 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001197 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001198
1199 /* Last fall back: hardcoded string */
1200#ifdef MS_WINDOWS
1201 const wchar_t *default_program_name = L"python";
1202#else
1203 const wchar_t *default_program_name = L"python3";
1204#endif
1205 config->program_name = _PyMem_RawWcsdup(default_program_name);
1206 if (config->program_name == NULL) {
1207 return _Py_INIT_NO_MEMORY();
1208 }
1209 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001210}
1211
1212
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001213static void
1214pymain_header(_PyMain *pymain)
1215{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001216 if (Py_QuietFlag) {
1217 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 }
Guido van Rossum393661d2001-08-31 17:40:15 +00001219
Victor Stinner19760862017-12-20 01:41:59 +01001220 if (!Py_VerboseFlag && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001221 return;
1222 }
1223
1224 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
1225 if (!Py_NoSiteFlag) {
1226 fprintf(stderr, "%s\n", COPYRIGHT);
1227 }
1228}
1229
1230
Victor Stinnerc4bca952017-12-19 23:48:17 +01001231static wchar_t**
Victor Stinnerca719ac2017-12-20 18:00:19 +01001232copy_wstrlist(int len, wchar_t **list)
Victor Stinner11a247d2017-12-13 21:05:57 +01001233{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001234 assert((len > 0 && list != NULL) || len == 0);
1235 size_t size = len * sizeof(list[0]);
1236 wchar_t **list_copy = PyMem_RawMalloc(size);
1237 for (int i=0; i < len; i++) {
1238 wchar_t* arg = _PyMem_RawWcsdup(list[i]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001239 if (arg == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001240 clear_wstrlist(i, list);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001241 return NULL;
1242 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001243 list_copy[i] = arg;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001244 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001245 return list_copy;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001246}
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001247
Victor Stinnerc4bca952017-12-19 23:48:17 +01001248
1249static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001250pymain_init_core_argv(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001251{
Victor Stinnerc4bca952017-12-19 23:48:17 +01001252 /* Copy argv to be able to modify it (to force -c/-m) */
1253 int argc = pymain->argc - _PyOS_optind;
1254 wchar_t **argv;
1255
1256 if (argc <= 0 || cmdline->argv == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01001257 /* Ensure at least one (empty) argument is seen */
1258 static wchar_t *empty_argv[1] = {L""};
Victor Stinner11a247d2017-12-13 21:05:57 +01001259 argc = 1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001260 argv = copy_wstrlist(1, empty_argv);
Victor Stinner11a247d2017-12-13 21:05:57 +01001261 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01001262 else {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001263 argv = copy_wstrlist(argc, &cmdline->argv[_PyOS_optind]);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001264 }
1265
1266 if (argv == NULL) {
1267 pymain->err = _Py_INIT_NO_MEMORY();
1268 return -1;
1269 }
1270
1271 wchar_t *arg0 = NULL;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001272 if (pymain->command != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001273 /* Force sys.argv[0] = '-c' */
1274 arg0 = L"-c";
1275 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001276 else if (pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001277 /* Force sys.argv[0] = '-m'*/
1278 arg0 = L"-m";
1279 }
1280 if (arg0 != NULL) {
1281 arg0 = _PyMem_RawWcsdup(arg0);
1282 if (arg0 == NULL) {
Victor Stinnerca719ac2017-12-20 18:00:19 +01001283 clear_wstrlist(argc, argv);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001284 pymain->err = _Py_INIT_NO_MEMORY();
1285 return -1;
1286 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01001287
1288 assert(argc >= 1);
Victor Stinnerc4bca952017-12-19 23:48:17 +01001289 PyMem_RawFree(argv[0]);
1290 argv[0] = arg0;
1291 }
1292
Victor Stinner9cfc0022017-12-20 19:36:46 +01001293 pymain->config.argc = argc;
1294 pymain->config.argv = argv;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001295 return 0;
1296}
1297
1298
Victor Stinner8ded5b82018-01-24 17:03:28 +01001299static PyObject*
1300wstrlist_as_pylist(int len, wchar_t **list)
Victor Stinnerc4bca952017-12-19 23:48:17 +01001301{
Victor Stinner8ded5b82018-01-24 17:03:28 +01001302 assert(list != NULL || len < 1);
1303
1304 PyObject *pylist = PyList_New(len);
1305 if (pylist == NULL) {
1306 return NULL;
Victor Stinnerc4bca952017-12-19 23:48:17 +01001307 }
1308
Victor Stinner8ded5b82018-01-24 17:03:28 +01001309 for (int i = 0; i < len; i++) {
1310 PyObject *v = PyUnicode_FromWideChar(list[i], -1);
Victor Stinner11a247d2017-12-13 21:05:57 +01001311 if (v == NULL) {
Victor Stinner8ded5b82018-01-24 17:03:28 +01001312 Py_DECREF(pylist);
1313 return NULL;
Victor Stinner11a247d2017-12-13 21:05:57 +01001314 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001315 PyList_SET_ITEM(pylist, i, v);
Victor Stinner11a247d2017-12-13 21:05:57 +01001316 }
Victor Stinner8ded5b82018-01-24 17:03:28 +01001317 return pylist;
Victor Stinner11a247d2017-12-13 21:05:57 +01001318}
1319
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001320
Victor Stinner11a247d2017-12-13 21:05:57 +01001321static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01001322pymain_compute_path0(_PyMain *pymain, PyObject **path0)
Victor Stinner11a247d2017-12-13 21:05:57 +01001323{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001324 if (pymain->main_importer_path != NULL) {
1325 /* Let pymain_run_main_from_importer() adjust sys.path[0] later */
Victor Stinner19760862017-12-20 01:41:59 +01001326 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001327 return 0;
1328 }
1329
1330 if (Py_IsolatedFlag) {
Victor Stinner19760862017-12-20 01:41:59 +01001331 *path0 = NULL;
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001332 return 0;
1333 }
1334
Victor Stinner9cfc0022017-12-20 19:36:46 +01001335 *path0 = _PyPathConfig_ComputeArgv0(pymain->config.argc,
1336 pymain->config.argv);
Victor Stinner19760862017-12-20 01:41:59 +01001337 if (*path0 == NULL) {
1338 pymain->err = _Py_INIT_NO_MEMORY();
1339 return -1;
1340 }
1341 return 0;
1342}
1343
1344
1345static int
1346pymain_update_sys_path(_PyMain *pymain, PyObject *path0)
1347{
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001348 /* Prepend argv[0] to sys.path.
1349 If argv[0] is a symlink, use the real path. */
1350 PyObject *sys_path = PySys_GetObject("path");
1351 if (sys_path == NULL) {
1352 pymain->err = _Py_INIT_ERR("can't get sys.path");
Victor Stinnerd5dda982017-12-13 17:31:16 +01001353 return -1;
1354 }
1355
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001356 /* Prepend path0 to sys.path */
1357 if (PyList_Insert(sys_path, 0, path0) < 0) {
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001358 pymain->err = _Py_INIT_ERR("sys.path.insert(0, path0) failed");
1359 return -1;
1360 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01001361 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001362}
1363
1364
Victor Stinner6bf992a2017-12-06 17:26:10 +01001365/* Get Py_xxx global configuration variables */
1366static void
Victor Stinnerca719ac2017-12-20 18:00:19 +01001367pymain_get_global_config(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinner6bf992a2017-12-06 17:26:10 +01001368{
Victor Stinner91106cd2017-12-13 12:29:09 +01001369 cmdline->bytes_warning = Py_BytesWarningFlag;
1370 cmdline->debug = Py_DebugFlag;
1371 cmdline->inspect = Py_InspectFlag;
1372 cmdline->interactive = Py_InteractiveFlag;
1373 cmdline->isolated = Py_IsolatedFlag;
1374 cmdline->optimization_level = Py_OptimizeFlag;
1375 cmdline->dont_write_bytecode = Py_DontWriteBytecodeFlag;
1376 cmdline->no_user_site_directory = Py_NoUserSiteDirectory;
1377 cmdline->no_site_import = Py_NoSiteFlag;
1378 cmdline->use_unbuffered_io = Py_UnbufferedStdioFlag;
1379 cmdline->verbosity = Py_VerboseFlag;
1380 cmdline->quiet_flag = Py_QuietFlag;
1381#ifdef MS_WINDOWS
1382 cmdline->legacy_windows_fs_encoding = Py_LegacyWindowsFSEncodingFlag;
1383 cmdline->legacy_windows_stdio = Py_LegacyWindowsStdioFlag;
1384#endif
1385 cmdline->check_hash_pycs_mode = _Py_CheckHashBasedPycsMode ;
1386
Victor Stinner9cfc0022017-12-20 19:36:46 +01001387 pymain->config.ignore_environment = Py_IgnoreEnvironmentFlag;
1388 pymain->config.utf8_mode = Py_UTF8Mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001389}
1390
1391
Victor Stinner19760862017-12-20 01:41:59 +01001392/* Set Py_xxx global configuration variables */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001393static void
Victor Stinnerca719ac2017-12-20 18:00:19 +01001394pymain_set_global_config(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001395{
Victor Stinner91106cd2017-12-13 12:29:09 +01001396 Py_BytesWarningFlag = cmdline->bytes_warning;
1397 Py_DebugFlag = cmdline->debug;
1398 Py_InspectFlag = cmdline->inspect;
1399 Py_InteractiveFlag = cmdline->interactive;
1400 Py_IsolatedFlag = cmdline->isolated;
1401 Py_OptimizeFlag = cmdline->optimization_level;
1402 Py_DontWriteBytecodeFlag = cmdline->dont_write_bytecode;
1403 Py_NoUserSiteDirectory = cmdline->no_user_site_directory;
1404 Py_NoSiteFlag = cmdline->no_site_import;
1405 Py_UnbufferedStdioFlag = cmdline->use_unbuffered_io;
1406 Py_VerboseFlag = cmdline->verbosity;
1407 Py_QuietFlag = cmdline->quiet_flag;
1408 _Py_CheckHashBasedPycsMode = cmdline->check_hash_pycs_mode;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001409#ifdef MS_WINDOWS
Victor Stinner91106cd2017-12-13 12:29:09 +01001410 Py_LegacyWindowsFSEncodingFlag = cmdline->legacy_windows_fs_encoding;
1411 Py_LegacyWindowsStdioFlag = cmdline->legacy_windows_stdio;
Victor Stinner6bf992a2017-12-06 17:26:10 +01001412#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001413
Victor Stinner9cfc0022017-12-20 19:36:46 +01001414 Py_IgnoreEnvironmentFlag = pymain->config.ignore_environment;
1415 Py_UTF8Mode = pymain->config.utf8_mode;
Victor Stinner358e5e12017-12-15 00:51:22 +01001416
1417 /* Random or non-zero hash seed */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001418 Py_HashRandomizationFlag = (pymain->config.use_hash_seed == 0 ||
1419 pymain->config.hash_seed != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001420}
1421
1422
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001423static void
1424pymain_import_readline(_PyMain *pymain)
1425{
1426 if (Py_IsolatedFlag) {
1427 return;
1428 }
Victor Stinner19760862017-12-20 01:41:59 +01001429 if (!Py_InspectFlag && RUN_CODE(pymain)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001430 return;
1431 }
1432 if (!isatty(fileno(stdin))) {
1433 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001434 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001435
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001436 PyObject *mod = PyImport_ImportModule("readline");
1437 if (mod == NULL) {
1438 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 }
1440 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001441 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001443}
1444
1445
1446static FILE*
1447pymain_open_filename(_PyMain *pymain)
1448{
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001449 FILE* fp;
1450
Victor Stinnerca719ac2017-12-20 18:00:19 +01001451 fp = _Py_wfopen(pymain->filename, L"r");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001452 if (fp == NULL) {
1453 char *cfilename_buffer;
1454 const char *cfilename;
1455 int err = errno;
Victor Stinner9dd76202017-12-21 16:20:32 +01001456 cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001457 if (cfilename_buffer != NULL)
1458 cfilename = cfilename_buffer;
1459 else
1460 cfilename = "<unprintable file name>";
1461 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001462 pymain->config.program, cfilename, err, strerror(err));
Victor Stinner9dd76202017-12-21 16:20:32 +01001463 PyMem_RawFree(cfilename_buffer);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001464 pymain->status = 2;
1465 return NULL;
1466 }
1467
Victor Stinnerca719ac2017-12-20 18:00:19 +01001468 if (pymain->skip_first_line) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001469 int ch;
1470 /* Push back first newline so line numbers
1471 remain the same */
1472 while ((ch = getc(fp)) != EOF) {
1473 if (ch == '\n') {
1474 (void)ungetc(ch, fp);
1475 break;
1476 }
1477 }
1478 }
1479
1480 struct _Py_stat_struct sb;
1481 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1482 S_ISDIR(sb.st_mode)) {
1483 fprintf(stderr,
1484 "%ls: '%ls' is a directory, cannot continue\n",
Victor Stinner9cfc0022017-12-20 19:36:46 +01001485 pymain->config.program, pymain->filename);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001486 fclose(fp);
1487 pymain->status = 1;
1488 return NULL;
1489 }
1490
1491 return fp;
1492}
1493
1494
1495static void
Victor Stinner19760862017-12-20 01:41:59 +01001496pymain_run_filename(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001497{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001498 if (pymain->filename == NULL && pymain->stdin_is_interactive) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001499 Py_InspectFlag = 0; /* do exit on SystemExit */
Victor Stinner19760862017-12-20 01:41:59 +01001500 pymain_run_startup(cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001501 pymain_run_interactive_hook();
1502 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001503
1504 if (pymain->main_importer_path != NULL) {
1505 pymain->status = pymain_run_main_from_importer(pymain);
1506 return;
1507 }
1508
1509 FILE *fp;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001510 if (pymain->filename != NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001511 fp = pymain_open_filename(pymain);
1512 if (fp == NULL) {
1513 return;
1514 }
1515 }
1516 else {
1517 fp = stdin;
1518 }
1519
Victor Stinnerca719ac2017-12-20 18:00:19 +01001520 pymain->status = pymain_run_file(fp, pymain->filename, cf);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001521}
1522
1523
1524static void
Victor Stinner19760862017-12-20 01:41:59 +01001525pymain_repl(_PyMain *pymain, PyCompilerFlags *cf)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001528 opportunity to set it from Python. */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001529 if (!Py_InspectFlag && config_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 Py_InspectFlag = 1;
1531 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001532
Victor Stinner19760862017-12-20 01:41:59 +01001533 if (!(Py_InspectFlag && pymain->stdin_is_interactive && RUN_CODE(pymain))) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001534 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001536
1537 Py_InspectFlag = 0;
1538 pymain_run_interactive_hook();
Victor Stinner33c377e2017-12-05 15:12:41 +01001539
Victor Stinner19760862017-12-20 01:41:59 +01001540 int res = PyRun_AnyFileFlags(stdin, "<stdin>", cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001541 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001542}
1543
1544
1545/* Parse the command line.
1546 Handle --version and --help options directly.
1547
1548 Return 1 if Python must exit.
1549 Return 0 on success.
1550 Set pymain->err and return -1 on failure. */
1551static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001552pymain_parse_cmdline(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001553{
Victor Stinnerca719ac2017-12-20 18:00:19 +01001554 int res = pymain_parse_cmdline_impl(pymain, cmdline);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001555 if (res < 0) {
1556 return -1;
1557 }
1558 if (res) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001559 pymain_usage(1, pymain->config.program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001560 pymain->status = 2;
1561 return 1;
1562 }
1563
Victor Stinnerca719ac2017-12-20 18:00:19 +01001564 if (pymain->command != NULL || pymain->module != NULL) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001565 /* Backup _PyOS_optind */
1566 _PyOS_optind--;
1567 }
1568
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001569 return 0;
1570}
1571
1572
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001573static const wchar_t*
Victor Stinner9cfc0022017-12-20 19:36:46 +01001574config_get_xoption(_PyCoreConfig *config, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001575{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001576 int nxoption = config->nxoption;
1577 wchar_t **xoptions = config->xoptions;
Victor Stinnerca719ac2017-12-20 18:00:19 +01001578 for (int i=0; i < nxoption; i++) {
1579 wchar_t *option = xoptions[i];
Victor Stinnera7368ac2017-11-15 18:11:45 -08001580 size_t len;
1581 wchar_t *sep = wcschr(option, L'=');
1582 if (sep != NULL) {
1583 len = (sep - option);
1584 }
1585 else {
1586 len = wcslen(option);
1587 }
1588 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1589 return option;
1590 }
1591 }
1592 return NULL;
1593}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001594
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001595
Victor Stinnera7368ac2017-11-15 18:11:45 -08001596static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001597pymain_str_to_int(const char *str, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001598{
1599 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001600 const char *endptr = str;
1601 long value = strtol(str, (char **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001602 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001603 return -1;
1604 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001605 if (value < INT_MIN || value > INT_MAX) {
1606 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001607 }
1608
Victor Stinnera7368ac2017-11-15 18:11:45 -08001609 *result = (int)value;
1610 return 0;
1611}
1612
1613
1614static int
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001615pymain_wstr_to_int(const wchar_t *wstr, int *result)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001616{
1617 errno = 0;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001618 const wchar_t *endptr = wstr;
1619 long value = wcstol(wstr, (wchar_t **)&endptr, 10);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001620 if (*endptr != '\0' || errno == ERANGE) {
1621 return -1;
1622 }
1623 if (value < INT_MIN || value > INT_MAX) {
1624 return -1;
1625 }
1626
1627 *result = (int)value;
1628 return 0;
1629}
1630
1631
Victor Stinner9cfc0022017-12-20 19:36:46 +01001632static _PyInitError
1633pymain_init_tracemalloc(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001634{
1635 int nframe;
1636 int valid;
1637
Victor Stinner9cfc0022017-12-20 19:36:46 +01001638 const char *env = config_get_env_var("PYTHONTRACEMALLOC");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001639 if (env) {
1640 if (!pymain_str_to_int(env, &nframe)) {
1641 valid = (nframe >= 1);
1642 }
1643 else {
1644 valid = 0;
1645 }
1646 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001647 return _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid number "
1648 "of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001649 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001650 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001651 }
1652
Victor Stinner9cfc0022017-12-20 19:36:46 +01001653 const wchar_t *xoption = config_get_xoption(config, L"tracemalloc");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001654 if (xoption) {
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001655 const wchar_t *sep = wcschr(xoption, L'=');
Victor Stinnera7368ac2017-11-15 18:11:45 -08001656 if (sep) {
1657 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1658 valid = (nframe >= 1);
1659 }
1660 else {
1661 valid = 0;
1662 }
1663 if (!valid) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001664 return _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1665 "invalid number of frames");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001666 }
1667 }
1668 else {
1669 /* -X tracemalloc behaves as -X tracemalloc=1 */
1670 nframe = 1;
1671 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001672 config->tracemalloc = nframe;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001673 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001674 return _Py_INIT_OK();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001675}
1676
1677
1678static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001679get_env_flag(int *flag, const char *name)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001680{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001681 const char *var = config_get_env_var(name);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001682 if (!var) {
1683 return;
1684 }
1685 int value;
1686 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1687 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1688 value = 1;
1689 }
1690 if (*flag < value) {
1691 *flag = value;
1692 }
1693}
1694
1695
1696static void
Victor Stinner9cfc0022017-12-20 19:36:46 +01001697cmdline_get_env_flags(_Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001698{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001699 get_env_flag(&cmdline->debug, "PYTHONDEBUG");
1700 get_env_flag(&cmdline->verbosity, "PYTHONVERBOSE");
1701 get_env_flag(&cmdline->optimization_level, "PYTHONOPTIMIZE");
1702 get_env_flag(&cmdline->inspect, "PYTHONINSPECT");
1703 get_env_flag(&cmdline->dont_write_bytecode, "PYTHONDONTWRITEBYTECODE");
1704 get_env_flag(&cmdline->no_user_site_directory, "PYTHONNOUSERSITE");
1705 get_env_flag(&cmdline->use_unbuffered_io, "PYTHONUNBUFFERED");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001706#ifdef MS_WINDOWS
Victor Stinner9cfc0022017-12-20 19:36:46 +01001707 get_env_flag(&cmdline->legacy_windows_fs_encoding,
1708 "PYTHONLEGACYWINDOWSFSENCODING");
1709 get_env_flag(&cmdline->legacy_windows_stdio,
1710 "PYTHONLEGACYWINDOWSSTDIO");
Victor Stinnera7368ac2017-11-15 18:11:45 -08001711#endif
1712}
1713
1714
Victor Stinner46972b72017-11-24 22:55:40 +01001715static _PyInitError
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01001716config_init_home(_PyCoreConfig *config)
Victor Stinner1f151112017-11-23 10:43:14 +01001717{
1718 wchar_t *home;
1719
Victor Stinner31a83932017-12-04 13:39:15 +01001720 /* If Py_SetPythonHome() was called, use its value */
1721 home = _Py_path_config.home;
Victor Stinner1f151112017-11-23 10:43:14 +01001722 if (home) {
Victor Stinner46972b72017-11-24 22:55:40 +01001723 config->home = _PyMem_RawWcsdup(home);
1724 if (config->home == NULL) {
1725 return _Py_INIT_NO_MEMORY();
Victor Stinner1f151112017-11-23 10:43:14 +01001726 }
Victor Stinner46972b72017-11-24 22:55:40 +01001727 return _Py_INIT_OK();
Victor Stinner1f151112017-11-23 10:43:14 +01001728 }
1729
Victor Stinner46972b72017-11-24 22:55:40 +01001730 int res = config_get_env_var_dup(&home, L"PYTHONHOME", "PYTHONHOME");
Victor Stinner1f151112017-11-23 10:43:14 +01001731 if (res < 0) {
Victor Stinner46972b72017-11-24 22:55:40 +01001732 return DECODE_LOCALE_ERR("PYTHONHOME", res);
Victor Stinner1f151112017-11-23 10:43:14 +01001733 }
Victor Stinner46972b72017-11-24 22:55:40 +01001734 config->home = home;
1735 return _Py_INIT_OK();
Victor Stinnerd4341102017-11-23 00:12:09 +01001736}
1737
1738
Victor Stinner358e5e12017-12-15 00:51:22 +01001739static _PyInitError
1740config_init_hash_seed(_PyCoreConfig *config)
1741{
1742 if (config->use_hash_seed < 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001743 const char *seed_text = config_get_env_var("PYTHONHASHSEED");
Victor Stinner358e5e12017-12-15 00:51:22 +01001744 int use_hash_seed;
1745 unsigned long hash_seed;
1746 if (_Py_ReadHashSeed(seed_text, &use_hash_seed, &hash_seed) < 0) {
1747 return _Py_INIT_USER_ERR("PYTHONHASHSEED must be \"random\" "
1748 "or an integer in range [0; 4294967295]");
1749 }
1750 config->use_hash_seed = use_hash_seed;
1751 config->hash_seed = hash_seed;
1752 }
1753 return _Py_INIT_OK();
1754}
1755
1756
Victor Stinner9cfc0022017-12-20 19:36:46 +01001757static _PyInitError
1758config_init_utf8_mode(_PyCoreConfig *config)
Victor Stinner91106cd2017-12-13 12:29:09 +01001759{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001760 /* The option was already set by Py_UTF8Mode,
1761 Py_LegacyWindowsFSEncodingFlag or PYTHONLEGACYWINDOWSFSENCODING. */
1762 if (config->utf8_mode >= 0) {
1763 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001764 }
Victor Stinner91106cd2017-12-13 12:29:09 +01001765
Victor Stinner9cfc0022017-12-20 19:36:46 +01001766 const wchar_t *xopt = config_get_xoption(config, L"utf8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001767 if (xopt) {
1768 wchar_t *sep = wcschr(xopt, L'=');
1769 if (sep) {
1770 xopt = sep + 1;
1771 if (wcscmp(xopt, L"1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001772 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001773 }
1774 else if (wcscmp(xopt, L"0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001775 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001776 }
1777 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001778 return _Py_INIT_USER_ERR("invalid -X utf8 option value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001779 }
1780 }
1781 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001782 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001783 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001784 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001785 }
1786
Victor Stinner9cfc0022017-12-20 19:36:46 +01001787 const char *opt = config_get_env_var("PYTHONUTF8");
Victor Stinner91106cd2017-12-13 12:29:09 +01001788 if (opt) {
1789 if (strcmp(opt, "1") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001790 config->utf8_mode = 1;
Victor Stinner91106cd2017-12-13 12:29:09 +01001791 }
1792 else if (strcmp(opt, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001793 config->utf8_mode = 0;
Victor Stinner91106cd2017-12-13 12:29:09 +01001794 }
1795 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001796 return _Py_INIT_USER_ERR("invalid PYTHONUTF8 environment "
1797 "variable value");
Victor Stinner91106cd2017-12-13 12:29:09 +01001798 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001799 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001800 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001801
1802 return _Py_INIT_OK();
Victor Stinner91106cd2017-12-13 12:29:09 +01001803}
Victor Stinner46972b72017-11-24 22:55:40 +01001804
1805
Victor Stinner9cfc0022017-12-20 19:36:46 +01001806static _PyInitError
1807config_read_env_vars(_PyCoreConfig *config)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001808{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001809 config->allocator = config_get_env_var("PYTHONMALLOC");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001810
Victor Stinner9cfc0022017-12-20 19:36:46 +01001811 if (config_get_env_var("PYTHONDUMPREFS")) {
1812 config->dump_refs = 1;
1813 }
1814 if (config_get_env_var("PYTHONMALLOCSTATS")) {
1815 config->malloc_stats = 1;
Victor Stinner31a83932017-12-04 13:39:15 +01001816 }
1817
Victor Stinner9cfc0022017-12-20 19:36:46 +01001818 const char *env = config_get_env_var("PYTHONCOERCECLOCALE");
Victor Stinner94540602017-12-16 04:54:22 +01001819 if (env) {
1820 if (strcmp(env, "0") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001821 config->coerce_c_locale = 0;
Victor Stinner94540602017-12-16 04:54:22 +01001822 }
1823 else if (strcmp(env, "warn") == 0) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001824 config->coerce_c_locale_warn = 1;
Victor Stinner94540602017-12-16 04:54:22 +01001825 }
1826 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001827 config->coerce_c_locale = 1;
Victor Stinner94540602017-12-16 04:54:22 +01001828 }
1829 }
1830
Victor Stinner9cfc0022017-12-20 19:36:46 +01001831 wchar_t *path;
1832 int res = config_get_env_var_dup(&path, L"PYTHONPATH", "PYTHONPATH");
1833 if (res < 0) {
Carl Meyer48575432018-05-19 16:48:22 -06001834 return DECODE_LOCALE_ERR("PYTHONPATH", res);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001835 }
1836 config->module_search_path_env = path;
1837
1838 _PyInitError err = config_init_hash_seed(config);
1839 if (_Py_INIT_FAILED(err)) {
1840 return err;
1841 }
1842
1843 return _Py_INIT_OK();
1844}
1845
1846
1847static _PyInitError
1848config_read_complex_options(_PyCoreConfig *config)
1849{
1850 /* More complex options configured by env var and -X option */
1851 if (config_get_env_var("PYTHONFAULTHANDLER")
1852 || config_get_xoption(config, L"faulthandler")) {
1853 config->faulthandler = 1;
1854 }
1855 if (config_get_env_var("PYTHONPROFILEIMPORTTIME")
1856 || config_get_xoption(config, L"importtime")) {
1857 config->import_time = 1;
1858 }
1859 if (config_get_xoption(config, L"dev" ) ||
1860 config_get_env_var("PYTHONDEVMODE"))
1861 {
1862 config->dev_mode = 1;
1863 config->faulthandler = 1;
1864 config->allocator = "debug";
1865 }
1866
1867 _PyInitError err = pymain_init_tracemalloc(config);
1868 if (_Py_INIT_FAILED(err)) {
1869 return err;
1870 }
1871 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001872}
1873
1874
Victor Stinnera7368ac2017-11-15 18:11:45 -08001875/* Parse command line options and environment variables.
1876 This code must not use Python runtime apart PyMem_Raw memory allocator.
1877
1878 Return 0 on success.
1879 Return 1 if Python is done and must exit.
1880 Set pymain->err and return -1 on error. */
1881static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001882pymain_read_conf_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001883{
Victor Stinner9cfc0022017-12-20 19:36:46 +01001884 _PyInitError err;
1885
Victor Stinnerca719ac2017-12-20 18:00:19 +01001886 int res = pymain_parse_cmdline(pymain, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01001887 if (res != 0) {
1888 return res;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001889 }
1890
Victor Stinner9cfc0022017-12-20 19:36:46 +01001891 /* Set Py_IgnoreEnvironmentFlag for Py_GETENV() */
1892 _PyCoreConfig *config = &pymain->config;
1893 Py_IgnoreEnvironmentFlag = config->ignore_environment;
1894
1895 /* Get environment variables */
1896 cmdline_get_env_flags(cmdline);
1897
1898 err = cmdline_init_env_warnoptions(cmdline);
1899 if (_Py_INIT_FAILED(err)) {
1900 pymain->err = err;
1901 return -1;
1902 }
1903
1904#ifdef MS_WINDOWS
1905 if (cmdline->legacy_windows_fs_encoding) {
1906 config->utf8_mode = 0;
1907 }
1908#endif
1909
Victor Stinnerca719ac2017-12-20 18:00:19 +01001910 if (pymain_init_core_argv(pymain, cmdline) < 0) {
Victor Stinner19760862017-12-20 01:41:59 +01001911 return -1;
1912 }
1913
Victor Stinner2b822a02018-01-25 09:18:36 +01001914 /* On Windows, _PyPathConfig_Init() modifies Py_IsolatedFlag and
1915 Py_NoSiteFlag variables if a "._pth" file is found. */
1916 int init_isolated = Py_IsolatedFlag;
1917 int init_no_site = Py_NoSiteFlag;
1918 Py_IsolatedFlag = cmdline->isolated;
1919 Py_NoSiteFlag = cmdline->no_site_import;
Victor Stinner8ded5b82018-01-24 17:03:28 +01001920
Victor Stinner9cfc0022017-12-20 19:36:46 +01001921 err = _PyCoreConfig_Read(config);
Victor Stinner2b822a02018-01-25 09:18:36 +01001922
1923 cmdline->isolated = Py_IsolatedFlag;
1924 cmdline->no_site_import = Py_NoSiteFlag;
1925 Py_IsolatedFlag = init_isolated;
1926 Py_NoSiteFlag = init_no_site;
1927
Victor Stinner31a83932017-12-04 13:39:15 +01001928 if (_Py_INIT_FAILED(err)) {
1929 pymain->err = err;
1930 return -1;
1931 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001932 return 0;
1933}
1934
1935
Victor Stinner19760862017-12-20 01:41:59 +01001936/* Read the configuration, but initialize also the LC_CTYPE locale:
1937 enable UTF-8 mode (PEP 540) and/or coerce the C locale (PEP 538) */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001938static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01001939pymain_read_conf(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnera7368ac2017-11-15 18:11:45 -08001940{
Victor Stinner94540602017-12-16 04:54:22 +01001941 int res = -1;
1942
Victor Stinner94540602017-12-16 04:54:22 +01001943 char *oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
1944 if (oldloc == NULL) {
1945 pymain->err = _Py_INIT_NO_MEMORY();
1946 goto done;
1947 }
1948
1949 /* Reconfigure the locale to the default for this process */
1950 _Py_SetLocaleFromEnv(LC_ALL);
1951
1952 int locale_coerced = 0;
1953 int loops = 0;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001954 int init_ignore_env = pymain->config.ignore_environment;
Victor Stinner94540602017-12-16 04:54:22 +01001955
1956 while (1) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001957 int utf8_mode = pymain->config.utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01001958 int encoding_changed = 0;
1959
1960 /* Watchdog to prevent an infinite loop */
1961 loops++;
1962 if (loops == 3) {
1963 pymain->err = _Py_INIT_ERR("Encoding changed twice while "
1964 "reading the configuration");
1965 goto done;
1966 }
1967
Victor Stinnerca719ac2017-12-20 18:00:19 +01001968 if (pymain_init_cmdline_argv(pymain, cmdline) < 0) {
Victor Stinnerc4bca952017-12-19 23:48:17 +01001969 goto done;
Victor Stinner94540602017-12-16 04:54:22 +01001970 }
1971
Victor Stinner9cfc0022017-12-20 19:36:46 +01001972 int conf_res = pymain_read_conf_impl(pymain, cmdline);
1973 if (conf_res != 0) {
1974 res = conf_res;
Victor Stinner94540602017-12-16 04:54:22 +01001975 goto done;
1976 }
1977
1978 /* The legacy C locale assumes ASCII as the default text encoding, which
1979 * causes problems not only for the CPython runtime, but also other
1980 * components like GNU readline.
1981 *
1982 * Accordingly, when the CLI detects it, it attempts to coerce it to a
1983 * more capable UTF-8 based alternative.
1984 *
1985 * See the documentation of the PYTHONCOERCECLOCALE setting for more
1986 * details.
1987 */
Victor Stinner9cfc0022017-12-20 19:36:46 +01001988 if (pymain->config.coerce_c_locale == 1 && !locale_coerced) {
Victor Stinner94540602017-12-16 04:54:22 +01001989 locale_coerced = 1;
Victor Stinner9cfc0022017-12-20 19:36:46 +01001990 _Py_CoerceLegacyLocale(&pymain->config);
Victor Stinner94540602017-12-16 04:54:22 +01001991 encoding_changed = 1;
1992 }
1993
1994 if (utf8_mode == -1) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01001995 if (pymain->config.utf8_mode == 1) {
Victor Stinner94540602017-12-16 04:54:22 +01001996 /* UTF-8 Mode enabled */
1997 encoding_changed = 1;
1998 }
1999 }
2000 else {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002001 if (pymain->config.utf8_mode != utf8_mode) {
Victor Stinner94540602017-12-16 04:54:22 +01002002 encoding_changed = 1;
2003 }
2004 }
2005
2006 if (!encoding_changed) {
2007 break;
2008 }
2009
2010 /* Reset the configuration, except UTF-8 Mode. Set Py_UTF8Mode for
2011 Py_DecodeLocale(). Reset Py_IgnoreEnvironmentFlag, modified by
Victor Stinner8ded5b82018-01-24 17:03:28 +01002012 pymain_read_conf_impl(). Reset Py_IsolatedFlag and Py_NoSiteFlag
2013 modified by _PyCoreConfig_Read(). */
Victor Stinner9cfc0022017-12-20 19:36:46 +01002014 Py_UTF8Mode = pymain->config.utf8_mode;
Victor Stinner94540602017-12-16 04:54:22 +01002015 Py_IgnoreEnvironmentFlag = init_ignore_env;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002016 _PyCoreConfig_Clear(&pymain->config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002017 pymain_clear_cmdline(pymain, cmdline);
2018 pymain_get_global_config(pymain, cmdline);
Victor Stinner94540602017-12-16 04:54:22 +01002019
2020 /* The encoding changed: read again the configuration
2021 with the new encoding */
2022 }
2023 res = 0;
2024
2025done:
2026 if (oldloc != NULL) {
2027 setlocale(LC_ALL, oldloc);
2028 PyMem_RawFree(oldloc);
2029 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002030
Victor Stinnera7368ac2017-11-15 18:11:45 -08002031 return res;
2032}
2033
Victor Stinner91106cd2017-12-13 12:29:09 +01002034
Victor Stinner9cfc0022017-12-20 19:36:46 +01002035static void
2036config_init_locale(_PyCoreConfig *config)
2037{
2038 if (config->utf8_mode >= 0 && config->coerce_c_locale >= 0) {
2039 return;
2040 }
2041
2042 if (_Py_LegacyLocaleDetected()) {
2043 /* POSIX locale: enable C locale coercion and UTF-8 Mode */
2044 if (config->utf8_mode < 0) {
2045 config->utf8_mode = 1;
2046 }
2047 if (config->coerce_c_locale < 0) {
2048 config->coerce_c_locale = 1;
2049 }
2050 return;
2051 }
2052
2053 /* By default, C locale coercion and UTF-8 Mode are disabled */
2054 if (config->coerce_c_locale < 0) {
2055 config->coerce_c_locale = 0;
2056 }
2057 if (config->utf8_mode < 0) {
2058 config->utf8_mode = 0;
2059 }
2060}
2061
2062
Victor Stinner8ded5b82018-01-24 17:03:28 +01002063static _PyInitError
2064config_init_module_search_paths(_PyCoreConfig *config)
2065{
2066 assert(config->module_search_paths == NULL);
2067 assert(config->nmodule_search_path < 0);
2068
2069 config->nmodule_search_path = 0;
2070
2071 const wchar_t *sys_path = Py_GetPath();
2072 const wchar_t delim = DELIM;
2073 const wchar_t *p = sys_path;
2074 while (1) {
2075 p = wcschr(sys_path, delim);
2076 if (p == NULL) {
2077 p = sys_path + wcslen(sys_path); /* End of string */
2078 }
2079
2080 size_t path_len = (p - sys_path);
2081 wchar_t *path = PyMem_RawMalloc((path_len + 1) * sizeof(wchar_t));
2082 if (path == NULL) {
2083 return _Py_INIT_NO_MEMORY();
2084 }
2085 memcpy(path, sys_path, path_len * sizeof(wchar_t));
2086 path[path_len] = L'\0';
2087
2088 _PyInitError err = wstrlist_append(&config->nmodule_search_path,
2089 &config->module_search_paths,
2090 path);
2091 PyMem_RawFree(path);
2092 if (_Py_INIT_FAILED(err)) {
2093 return err;
2094 }
2095
2096 if (*p == '\0') {
2097 break;
2098 }
2099 sys_path = p + 1;
2100 }
2101 return _Py_INIT_OK();
2102}
2103
2104
2105static _PyInitError
2106config_init_path_config(_PyCoreConfig *config)
2107{
2108 _PyInitError err = _PyPathConfig_Init(config);
2109 if (_Py_INIT_FAILED(err)) {
2110 return err;
2111 }
2112
2113 if (config->nmodule_search_path < 0) {
2114 err = config_init_module_search_paths(config);
2115 if (_Py_INIT_FAILED(err)) {
2116 return err;
2117 }
2118 }
2119
2120 if (config->executable == NULL) {
2121 config->executable = _PyMem_RawWcsdup(Py_GetProgramFullPath());
2122 if (config->executable == NULL) {
2123 return _Py_INIT_NO_MEMORY();
2124 }
2125 }
2126
2127 if (config->prefix == NULL) {
2128 config->prefix = _PyMem_RawWcsdup(Py_GetPrefix());
2129 if (config->prefix == NULL) {
2130 return _Py_INIT_NO_MEMORY();
2131 }
2132 }
2133
2134 if (config->exec_prefix == NULL) {
2135 config->exec_prefix = _PyMem_RawWcsdup(Py_GetExecPrefix());
2136 if (config->exec_prefix == NULL) {
2137 return _Py_INIT_NO_MEMORY();
2138 }
2139 }
2140
2141 if (config->base_prefix == NULL) {
2142 config->base_prefix = _PyMem_RawWcsdup(config->prefix);
2143 if (config->base_prefix == NULL) {
2144 return _Py_INIT_NO_MEMORY();
2145 }
2146 }
2147
2148 if (config->base_exec_prefix == NULL) {
2149 config->base_exec_prefix = _PyMem_RawWcsdup(config->exec_prefix);
2150 if (config->base_exec_prefix == NULL) {
2151 return _Py_INIT_NO_MEMORY();
2152 }
2153 }
2154
2155 return _Py_INIT_OK();
2156}
2157
Victor Stinnerda273412017-12-15 01:46:02 +01002158/* Read configuration settings from standard locations
2159 *
2160 * This function doesn't make any changes to the interpreter state - it
2161 * merely populates any missing configuration settings. This allows an
2162 * embedding application to completely override a config option by
2163 * setting it before calling this function, or else modify the default
2164 * setting before passing the fully populated config to Py_EndInitialization.
2165 *
2166 * More advanced selective initialization tricks are possible by calling
2167 * this function multiple times with various preconfigured settings.
2168 */
2169
2170_PyInitError
2171_PyCoreConfig_Read(_PyCoreConfig *config)
2172{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002173 _PyInitError err;
2174
2175 err = config_read_env_vars(config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002176 if (_Py_INIT_FAILED(err)) {
2177 return err;
2178 }
2179
Victor Stinner9cfc0022017-12-20 19:36:46 +01002180 /* -X options */
2181 if (config_get_xoption(config, L"showrefcount")) {
2182 config->show_ref_count = 1;
2183 }
2184 if (config_get_xoption(config, L"showalloccount")) {
2185 config->show_alloc_count = 1;
2186 }
2187
2188 err = config_read_complex_options(config);
2189 if (_Py_INIT_FAILED(err)) {
2190 return err;
2191 }
2192
2193 err = config_init_utf8_mode(config);
2194 if (_Py_INIT_FAILED(err)) {
2195 return err;
2196 }
2197
2198 err = config_init_home(config);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002199 if (_Py_INIT_FAILED(err)) {
2200 return err;
2201 }
2202
2203 err = config_init_program_name(config);
2204 if (_Py_INIT_FAILED(err)) {
2205 return err;
2206 }
2207
Victor Stinner9cfc0022017-12-20 19:36:46 +01002208 config_init_locale(config);
Victor Stinnerda273412017-12-15 01:46:02 +01002209
Victor Stinner9cfc0022017-12-20 19:36:46 +01002210 /* Signal handlers are installed by default */
2211 if (config->install_signal_handlers < 0) {
2212 config->install_signal_handlers = 1;
Victor Stinner94540602017-12-16 04:54:22 +01002213 }
2214
Victor Stinner8ded5b82018-01-24 17:03:28 +01002215 if (!config->_disable_importlib) {
2216 err = config_init_path_config(config);
2217 if (_Py_INIT_FAILED(err)) {
2218 return err;
2219 }
2220 }
Victor Stinnerda273412017-12-15 01:46:02 +01002221 return _Py_INIT_OK();
2222}
2223
2224
2225void
2226_PyCoreConfig_Clear(_PyCoreConfig *config)
2227{
2228#define CLEAR(ATTR) \
2229 do { \
2230 PyMem_RawFree(ATTR); \
2231 ATTR = NULL; \
2232 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002233#define CLEAR_WSTRLIST(LEN, LIST) \
2234 do { \
2235 clear_wstrlist(LEN, LIST); \
2236 LEN = 0; \
2237 LIST = NULL; \
2238 } while (0)
Victor Stinnerda273412017-12-15 01:46:02 +01002239
2240 CLEAR(config->module_search_path_env);
2241 CLEAR(config->home);
2242 CLEAR(config->program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002243 CLEAR(config->program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002244
Victor Stinner8ded5b82018-01-24 17:03:28 +01002245 CLEAR_WSTRLIST(config->argc, config->argv);
2246 config->argc = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002247
Victor Stinner8ded5b82018-01-24 17:03:28 +01002248 CLEAR_WSTRLIST(config->nwarnoption, config->warnoptions);
2249 CLEAR_WSTRLIST(config->nxoption, config->xoptions);
2250 CLEAR_WSTRLIST(config->nmodule_search_path, config->module_search_paths);
2251 config->nmodule_search_path = -1;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002252
Victor Stinner8ded5b82018-01-24 17:03:28 +01002253 CLEAR(config->executable);
2254 CLEAR(config->prefix);
2255 CLEAR(config->base_prefix);
2256 CLEAR(config->exec_prefix);
2257 CLEAR(config->base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002258#undef CLEAR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002259#undef CLEAR_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002260}
2261
2262
2263int
2264_PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
2265{
2266 _PyCoreConfig_Clear(config);
2267
2268#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
Victor Stinnerc4bca952017-12-19 23:48:17 +01002269#define COPY_STR_ATTR(ATTR) \
2270 do { \
2271 if (config2->ATTR != NULL) { \
2272 config->ATTR = _PyMem_RawWcsdup(config2->ATTR); \
2273 if (config->ATTR == NULL) { \
2274 return -1; \
2275 } \
2276 } \
2277 } while (0)
Victor Stinner8ded5b82018-01-24 17:03:28 +01002278#define COPY_WSTRLIST(LEN, LIST) \
2279 do { \
2280 if (config2->LIST != NULL) { \
2281 config->LIST = copy_wstrlist(config2->LEN, config2->LIST); \
2282 if (config->LIST == NULL) { \
2283 return -1; \
2284 } \
2285 } \
2286 config->LEN = config2->LEN; \
2287 } while (0)
Victor Stinnerc4bca952017-12-19 23:48:17 +01002288
Victor Stinnerda273412017-12-15 01:46:02 +01002289 COPY_ATTR(ignore_environment);
2290 COPY_ATTR(use_hash_seed);
2291 COPY_ATTR(hash_seed);
2292 COPY_ATTR(_disable_importlib);
2293 COPY_ATTR(allocator);
2294 COPY_ATTR(dev_mode);
2295 COPY_ATTR(faulthandler);
2296 COPY_ATTR(tracemalloc);
2297 COPY_ATTR(import_time);
2298 COPY_ATTR(show_ref_count);
2299 COPY_ATTR(show_alloc_count);
2300 COPY_ATTR(dump_refs);
2301 COPY_ATTR(malloc_stats);
2302 COPY_ATTR(utf8_mode);
Victor Stinnerda273412017-12-15 01:46:02 +01002303
2304 COPY_STR_ATTR(module_search_path_env);
2305 COPY_STR_ATTR(home);
2306 COPY_STR_ATTR(program_name);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002307 COPY_STR_ATTR(program);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002308
Victor Stinner8ded5b82018-01-24 17:03:28 +01002309 COPY_WSTRLIST(argc, argv);
2310 COPY_WSTRLIST(nwarnoption, warnoptions);
2311 COPY_WSTRLIST(nxoption, xoptions);
2312 COPY_WSTRLIST(nmodule_search_path, module_search_paths);
Victor Stinnerc4bca952017-12-19 23:48:17 +01002313
Victor Stinner8ded5b82018-01-24 17:03:28 +01002314 COPY_STR_ATTR(executable);
2315 COPY_STR_ATTR(prefix);
2316 COPY_STR_ATTR(base_prefix);
2317 COPY_STR_ATTR(exec_prefix);
2318 COPY_STR_ATTR(base_exec_prefix);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002319
Victor Stinnerc4bca952017-12-19 23:48:17 +01002320#undef COPY_ATTR
Victor Stinnerda273412017-12-15 01:46:02 +01002321#undef COPY_STR_ATTR
Victor Stinner8ded5b82018-01-24 17:03:28 +01002322#undef COPY_WSTRLIST
Victor Stinnerda273412017-12-15 01:46:02 +01002323 return 0;
2324}
2325
2326
2327void
2328_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config)
2329{
2330 Py_CLEAR(config->argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002331 Py_CLEAR(config->executable);
2332 Py_CLEAR(config->prefix);
2333 Py_CLEAR(config->base_prefix);
2334 Py_CLEAR(config->exec_prefix);
2335 Py_CLEAR(config->base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002336 Py_CLEAR(config->warnoptions);
2337 Py_CLEAR(config->xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002338 Py_CLEAR(config->module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002339}
2340
2341
2342static PyObject*
2343config_copy_attr(PyObject *obj)
2344{
2345 if (PyUnicode_Check(obj)) {
2346 Py_INCREF(obj);
2347 return obj;
2348 }
2349 else if (PyList_Check(obj)) {
2350 return PyList_GetSlice(obj, 0, Py_SIZE(obj));
2351 }
2352 else if (PyDict_Check(obj)) {
2353 /* The dict type is used for xoptions. Make the assumption that keys
2354 and values are immutables */
2355 return PyDict_Copy(obj);
2356 }
2357 else {
2358 PyErr_Format(PyExc_TypeError,
2359 "cannot copy config attribute of type %.200s",
2360 Py_TYPE(obj)->tp_name);
2361 return NULL;
2362 }
2363}
2364
2365
2366int
2367_PyMainInterpreterConfig_Copy(_PyMainInterpreterConfig *config,
2368 const _PyMainInterpreterConfig *config2)
2369{
2370 _PyMainInterpreterConfig_Clear(config);
2371
2372#define COPY_ATTR(ATTR) \
2373 do { \
2374 if (config2->ATTR != NULL) { \
2375 config->ATTR = config_copy_attr(config2->ATTR); \
2376 if (config->ATTR == NULL) { \
2377 return -1; \
2378 } \
2379 } \
2380 } while (0)
2381
2382 COPY_ATTR(argv);
Victor Stinner41264f12017-12-15 02:05:29 +01002383 COPY_ATTR(executable);
2384 COPY_ATTR(prefix);
2385 COPY_ATTR(base_prefix);
2386 COPY_ATTR(exec_prefix);
2387 COPY_ATTR(base_exec_prefix);
Victor Stinnerda273412017-12-15 01:46:02 +01002388 COPY_ATTR(warnoptions);
2389 COPY_ATTR(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002390 COPY_ATTR(module_search_path);
Victor Stinnerda273412017-12-15 01:46:02 +01002391#undef COPY_ATTR
2392 return 0;
2393}
2394
2395
2396
2397
Victor Stinner41264f12017-12-15 02:05:29 +01002398_PyInitError
Victor Stinner9cfc0022017-12-20 19:36:46 +01002399_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *main_config,
2400 const _PyCoreConfig *config)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002401{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002402 if (main_config->install_signal_handlers < 0) {
2403 main_config->install_signal_handlers = config->install_signal_handlers;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002404 }
2405
Victor Stinner9cfc0022017-12-20 19:36:46 +01002406 if (main_config->xoptions == NULL) {
2407 main_config->xoptions = config_create_xoptions_dict(config);
2408 if (main_config->xoptions == NULL) {
2409 return _Py_INIT_NO_MEMORY();
2410 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002411 }
2412
Victor Stinner8ded5b82018-01-24 17:03:28 +01002413#define COPY_WSTR(ATTR) \
2414 do { \
2415 if (main_config->ATTR == NULL) { \
2416 main_config->ATTR = PyUnicode_FromWideChar(config->ATTR, -1); \
2417 if (main_config->ATTR == NULL) { \
2418 return _Py_INIT_NO_MEMORY(); \
2419 } \
2420 } \
2421 } while (0)
2422#define COPY_WSTRLIST(ATTR, LEN, LIST) \
2423 do { \
2424 if (ATTR == NULL) { \
2425 ATTR = wstrlist_as_pylist(LEN, LIST); \
2426 if (ATTR == NULL) { \
2427 return _Py_INIT_NO_MEMORY(); \
2428 } \
2429 } \
2430 } while (0)
2431
2432 COPY_WSTRLIST(main_config->warnoptions,
2433 config->nwarnoption, config->warnoptions);
2434 if (config->argc >= 0) {
2435 COPY_WSTRLIST(main_config->argv,
2436 config->argc, config->argv);
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002437 }
2438
Victor Stinner8ded5b82018-01-24 17:03:28 +01002439 if (!config->_disable_importlib) {
2440 COPY_WSTR(executable);
2441 COPY_WSTR(prefix);
2442 COPY_WSTR(base_prefix);
2443 COPY_WSTR(exec_prefix);
2444 COPY_WSTR(base_exec_prefix);
2445
2446 COPY_WSTRLIST(main_config->module_search_path,
2447 config->nmodule_search_path, config->module_search_paths);
Victor Stinner9cfc0022017-12-20 19:36:46 +01002448 }
Victor Stinner41264f12017-12-15 02:05:29 +01002449
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002450 return _Py_INIT_OK();
Victor Stinner8ded5b82018-01-24 17:03:28 +01002451#undef COPY_WSTR
2452#undef COPY_WSTRLIST
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002453}
2454
2455
2456static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01002457pymain_init_python_main(_PyMain *pymain)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002458{
Victor Stinner9cfc0022017-12-20 19:36:46 +01002459 _PyInitError err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002460
Victor Stinner9cfc0022017-12-20 19:36:46 +01002461 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
2462 err = _PyMainInterpreterConfig_Read(&main_config, &pymain->config);
2463 if (!_Py_INIT_FAILED(err)) {
2464 err = _Py_InitializeMainInterpreter(&main_config);
2465 }
2466 _PyMainInterpreterConfig_Clear(&main_config);
2467
2468 if (_Py_INIT_FAILED(err)) {
2469 pymain->err = err;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002470 return -1;
2471 }
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002472 return 0;
2473}
Victor Stinnera7368ac2017-11-15 18:11:45 -08002474
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002475
2476static int
Victor Stinner9cfc0022017-12-20 19:36:46 +01002477pymain_init_sys_path(_PyMain *pymain)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +01002478{
Victor Stinnerca719ac2017-12-20 18:00:19 +01002479 if (pymain->filename != NULL) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002480 /* If filename is a package (ex: directory or ZIP file) which contains
2481 __main__.py, main_importer_path is set to filename and will be
2482 prepended to sys.path by pymain_run_main_from_importer(). Otherwise,
2483 main_importer_path is set to NULL. */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002484 pymain->main_importer_path = pymain_get_importer(pymain->filename);
Victor Stinnerd5dda982017-12-13 17:31:16 +01002485 }
2486
Victor Stinner19760862017-12-20 01:41:59 +01002487 PyObject *path0;
Victor Stinner9cfc0022017-12-20 19:36:46 +01002488 if (pymain_compute_path0(pymain, &path0) < 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01002489 return -1;
2490 }
Victor Stinner19760862017-12-20 01:41:59 +01002491
Victor Stinner9cfc0022017-12-20 19:36:46 +01002492 pymain_clear_config(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002493
2494 if (path0 != NULL) {
2495 if (pymain_update_sys_path(pymain, path0) < 0) {
2496 Py_DECREF(path0);
2497 return -1;
2498 }
2499 Py_DECREF(path0);
2500 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08002501 return 0;
2502}
2503
2504
2505static void
2506pymain_run_python(_PyMain *pymain)
2507{
Victor Stinner19760862017-12-20 01:41:59 +01002508 PyCompilerFlags cf = {.cf_flags = 0};
Victor Stinnera7368ac2017-11-15 18:11:45 -08002509
2510 pymain_header(pymain);
2511 pymain_import_readline(pymain);
2512
Victor Stinnerca719ac2017-12-20 18:00:19 +01002513 if (pymain->command) {
2514 pymain->status = pymain_run_command(pymain->command, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002515 }
Victor Stinnerca719ac2017-12-20 18:00:19 +01002516 else if (pymain->module) {
2517 pymain->status = (pymain_run_module(pymain->module, 1) != 0);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002518 }
2519 else {
Victor Stinner19760862017-12-20 01:41:59 +01002520 pymain_run_filename(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002521 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01002522
Victor Stinner19760862017-12-20 01:41:59 +01002523 pymain_repl(pymain, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002524}
2525
2526
Victor Stinnerc4bca952017-12-19 23:48:17 +01002527static void
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002528pymain_init(_PyMain *pymain)
2529{
Victor Stinner94540602017-12-16 04:54:22 +01002530 /* 754 requires that FP exceptions run in "no stop" mode by default,
2531 * and until C vendors implement C99's ways to control FP exceptions,
2532 * Python requires non-stop mode. Alas, some platforms enable FP
2533 * exceptions by default. Here we disable them.
2534 */
2535#ifdef __FreeBSD__
2536 fedisableexcept(FE_OVERFLOW);
2537#endif
2538
Victor Stinner9cfc0022017-12-20 19:36:46 +01002539 pymain->config._disable_importlib = 0;
Victor Stinnere32e79f2017-11-23 01:49:45 +01002540 pymain->config.install_signal_handlers = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002541}
2542
Victor Stinnera7368ac2017-11-15 18:11:45 -08002543
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002544static int
Victor Stinnerca719ac2017-12-20 18:00:19 +01002545pymain_cmdline_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002546{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002547 pymain->err = _PyRuntime_Initialize();
2548 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002549 return -1;
2550 }
2551
Victor Stinnerca719ac2017-12-20 18:00:19 +01002552 int res = pymain_read_conf(pymain, cmdline);
Victor Stinnera7368ac2017-11-15 18:11:45 -08002553 if (res < 0) {
2554 return -1;
2555 }
2556 if (res > 0) {
2557 /* --help or --version command: we are done */
Victor Stinner19760862017-12-20 01:41:59 +01002558 return 1;
Victor Stinnera7368ac2017-11-15 18:11:45 -08002559 }
2560
Victor Stinner94540602017-12-16 04:54:22 +01002561 if (cmdline->print_help) {
Victor Stinner9cfc0022017-12-20 19:36:46 +01002562 pymain_usage(0, pymain->config.program);
Victor Stinner19760862017-12-20 01:41:59 +01002563 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002564 }
2565
2566 if (cmdline->print_version) {
2567 printf("Python %s\n",
2568 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
Victor Stinner19760862017-12-20 01:41:59 +01002569 return 1;
Victor Stinner94540602017-12-16 04:54:22 +01002570 }
2571
Victor Stinnerc4bca952017-12-19 23:48:17 +01002572 /* For Py_GetArgcArgv(). Cleared by pymain_free(). */
Victor Stinnerca719ac2017-12-20 18:00:19 +01002573 orig_argv = copy_wstrlist(pymain->argc, cmdline->argv);
2574 if (orig_argv == NULL) {
2575 pymain->err = _Py_INIT_NO_MEMORY();
2576 return -1;
2577 }
Victor Stinnerc4bca952017-12-19 23:48:17 +01002578 orig_argc = pymain->argc;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002579
Victor Stinner9cfc0022017-12-20 19:36:46 +01002580 _PyInitError err = config_init_warnoptions(&pymain->config, cmdline);
2581 if (_Py_INIT_FAILED(err)) {
2582 pymain->err = err;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002583 return -1;
2584 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002585 return 0;
2586}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00002587
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002588
Victor Stinnerca719ac2017-12-20 18:00:19 +01002589/* Read the configuration into _PyCoreConfig and _PyMain, initialize the
2590 LC_CTYPE locale and Py_DecodeLocale().
2591
2592 Configuration:
2593
2594 * Command line arguments
2595 * Environment variables
2596 * Py_xxx global configuration variables
2597
2598 _Py_CommandLineDetails is a temporary structure used to prioritize these
2599 variables. */
2600static int
2601pymain_cmdline(_PyMain *pymain)
2602{
Victor Stinner31e99082017-12-20 23:41:38 +01002603 /* Force default allocator, since pymain_free() and pymain_clear_config()
2604 must use the same allocator than this function. */
2605 PyMemAllocatorEx old_alloc;
2606 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2607#ifdef Py_DEBUG
2608 PyMemAllocatorEx default_alloc;
2609 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &default_alloc);
2610#endif
2611
Victor Stinnerca719ac2017-12-20 18:00:19 +01002612 _Py_CommandLineDetails cmdline;
2613 memset(&cmdline, 0, sizeof(cmdline));
2614
2615 pymain_get_global_config(pymain, &cmdline);
2616
2617 int res = pymain_cmdline_impl(pymain, &cmdline);
2618
2619 pymain_set_global_config(pymain, &cmdline);
2620
2621 pymain_clear_cmdline(pymain, &cmdline);
Victor Stinner31e99082017-12-20 23:41:38 +01002622
2623#ifdef Py_DEBUG
2624 /* Make sure that PYMEM_DOMAIN_RAW has not been modified */
2625 PyMemAllocatorEx cur_alloc;
2626 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &cur_alloc);
2627 assert(memcmp(&cur_alloc, &default_alloc, sizeof(cur_alloc)) == 0);
2628#endif
2629 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerca719ac2017-12-20 18:00:19 +01002630 return res;
2631}
2632
2633
Victor Stinner94540602017-12-16 04:54:22 +01002634static int
2635pymain_main(_PyMain *pymain)
2636{
Victor Stinnerc4bca952017-12-19 23:48:17 +01002637 pymain_init(pymain);
Victor Stinner94540602017-12-16 04:54:22 +01002638
Victor Stinnerca719ac2017-12-20 18:00:19 +01002639 int res = pymain_cmdline(pymain);
Victor Stinner19760862017-12-20 01:41:59 +01002640 if (res < 0) {
Victor Stinner94540602017-12-16 04:54:22 +01002641 _Py_FatalInitError(pymain->err);
2642 }
Victor Stinner19760862017-12-20 01:41:59 +01002643 if (res == 1) {
2644 goto done;
2645 }
2646
Victor Stinner9cfc0022017-12-20 19:36:46 +01002647 pymain_init_stdio(pymain);
2648
2649 pymain->err = _Py_InitializeCore(&pymain->config);
2650 if (_Py_INIT_FAILED(pymain->err)) {
Victor Stinner19760862017-12-20 01:41:59 +01002651 _Py_FatalInitError(pymain->err);
2652 }
2653
2654 if (pymain_init_python_main(pymain) < 0) {
2655 _Py_FatalInitError(pymain->err);
2656 }
2657
Victor Stinner9cfc0022017-12-20 19:36:46 +01002658 if (pymain_init_sys_path(pymain) < 0) {
2659 _Py_FatalInitError(pymain->err);
2660 }
2661
Victor Stinner19760862017-12-20 01:41:59 +01002662 pymain_run_python(pymain);
2663
2664 if (Py_FinalizeEx() < 0) {
2665 /* Value unlikely to be confused with a non-error exit status or
2666 other special meaning */
2667 pymain->status = 120;
2668 }
2669
2670done:
Victor Stinner94540602017-12-16 04:54:22 +01002671 pymain_free(pymain);
2672
Victor Stinner94540602017-12-16 04:54:22 +01002673 return pymain->status;
2674}
2675
2676
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002677int
2678Py_Main(int argc, wchar_t **argv)
2679{
2680 _PyMain pymain = _PyMain_INIT;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002681 pymain.use_bytes_argv = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002682 pymain.argc = argc;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002683 pymain.wchar_argv = argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002684
Victor Stinner94540602017-12-16 04:54:22 +01002685 return pymain_main(&pymain);
Guido van Rossum667d7041995-08-04 04:20:48 +00002686}
2687
Victor Stinner94540602017-12-16 04:54:22 +01002688
2689int
2690_Py_UnixMain(int argc, char **argv)
2691{
2692 _PyMain pymain = _PyMain_INIT;
Victor Stinner94540602017-12-16 04:54:22 +01002693 pymain.use_bytes_argv = 1;
Victor Stinnerc4bca952017-12-19 23:48:17 +01002694 pymain.argc = argc;
Victor Stinner94540602017-12-16 04:54:22 +01002695 pymain.bytes_argv = argv;
2696
2697 return pymain_main(&pymain);
2698}
2699
2700
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002701/* this is gonna seem *real weird*, but if you put some other code between
2702 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
2703 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00002704
Guido van Rossum667d7041995-08-04 04:20:48 +00002705/* Make the *original* argc/argv available to other modules.
2706 This is rare, but it is needed by the secureware extension. */
2707
2708void
Martin v. Löwis790465f2008-04-05 20:41:37 +00002709Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00002710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 *argc = orig_argc;
2712 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00002713}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002714
2715#ifdef __cplusplus
2716}
2717#endif