blob: 203abf414ccb35df76ede371fb1fde81bc618daf [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"
Victor Stinnerf7e5b562017-11-15 15:48:08 -08005#include "internal/pystate.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00006
Antoine Pitrou5651eaa2008-09-06 20:46:58 +00007#include <locale.h>
8
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +00009#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Martin v. Löwis945362c2007-08-30 14:57:25 +000010#include <windows.h>
Steve Dowerbfce0f92016-12-28 15:41:09 -080011#ifdef HAVE_IO_H
12#include <io.h>
13#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000014#ifdef HAVE_FCNTL_H
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000015#include <fcntl.h>
16#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000017#endif
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000018
Martin v. Löwis945362c2007-08-30 14:57:25 +000019#ifdef _MSC_VER
20#include <crtdbg.h>
21#endif
22
Jesus Ceaab70e2a2012-10-05 01:48:08 +020023#if defined(MS_WINDOWS)
Guido van Rossuma075ce11997-12-05 21:56:45 +000024#define PYTHONHOMEHELP "<prefix>\\lib"
25#else
Marc-André Lemburgda4dbc32001-06-12 16:13:51 +000026#define PYTHONHOMEHELP "<prefix>/pythonX.X"
Guido van Rossuma075ce11997-12-05 21:56:45 +000027#endif
28
Thomas Wouters2cffc7d2000-11-03 08:18:37 +000029#include "pygetopt.h"
30
Guido van Rossuma22865e2000-09-05 04:41:18 +000031#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000032 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
33 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000034
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000035#ifdef __cplusplus
36extern "C" {
37#endif
38
Guido van Rossumac56b031996-07-21 02:33:38 +000039/* For Py_GetArgcArgv(); set by main() */
Martin v. Löwis790465f2008-04-05 20:41:37 +000040static wchar_t **orig_argv;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080041static int orig_argc;
Guido van Rossum667d7041995-08-04 04:20:48 +000042
Guido van Rossumbceccf52001-04-10 22:07:43 +000043/* command line options */
Christian Heimesad73a9c2013-08-10 16:36:18 +020044#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
Guido van Rossumbceccf52001-04-10 22:07:43 +000045
Guido van Rossumbceccf52001-04-10 22:07:43 +000046#define PROGRAM_OPTS BASE_OPTS
Guido van Rossum3ed4c152001-03-02 06:18:03 +000047
Guido van Rossum667d7041995-08-04 04:20:48 +000048/* Short usage message (with %s for argv0) */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020049static const char usage_line[] =
Martin v. Löwis790465f2008-04-05 20:41:37 +000050"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000051
52/* Long usage message, split into parts < 512 bytes */
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020053static const char usage_1[] = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000054Options and arguments (and corresponding environment variables):\n\
Christian Heimes2ab34442008-09-03 20:31:07 +000055-b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
56 and comparing bytes/bytearray with str. (-bb: issue errors)\n\
Xiang Zhang0710d752017-03-11 13:02:52 +080057-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000058-c cmd : program passed in as string (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000059-d : debug output from parser; also PYTHONDEBUG=x\n\
Christian Heimes790c8232008-01-07 21:14:23 +000060-E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000061-h : print this help message and exit (also --help)\n\
Guido van Rossum61c345f2001-09-04 03:26:15 +000062";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020063static const char usage_2[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000064-i : inspect interactively after running script; forces a prompt even\n\
65 if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
Christian Heimesad73a9c2013-08-10 16:36:18 +020066-I : isolate Python from the user's environment (implies -E and -s)\n\
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +000067-m mod : run library module as a script (terminates option list)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000068-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000069-OO : remove doc-strings in addition to the -O optimizations\n\
Georg Brandl9d871192010-12-04 10:47:18 +000070-q : don't print version and copyright messages on interactive startup\n\
Christian Heimes8dc226f2008-05-06 23:45:46 +000071-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000072-S : don't imply 'import site' on initialization\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000073";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020074static const char usage_3[] = "\
Berker Peksag7f580972017-10-13 15:16:31 +030075-u : force the stdout and stderr streams to be unbuffered;\n\
76 this option has no effect on stdin; also PYTHONUNBUFFERED=x\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000077-v : verbose (trace import statements); also PYTHONVERBOSE=x\n\
78 can be supplied multiple times to increase verbosity\n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +000079-V : print the Python version number and exit (also --version)\n\
INADA Naoki0e175a62016-11-21 20:57:14 +090080 when given twice, print more information about the build\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000081-W arg : warning control; arg is action:message:category:module:lineno\n\
Philip Jenvey0805ca32010-04-07 04:04:10 +000082 also PYTHONWARNINGS=arg\n\
Guido van Rossum393661d2001-08-31 17:40:15 +000083-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Antoine Pitrou9583cac2010-10-21 13:42:28 +000084-X opt : set implementation-specific option\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000085";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020086static const char usage_4[] = "\
Guido van Rossum98297ee2007-11-06 21:34:58 +000087file : program read from script file\n\
88- : program read from stdin (default; interactive mode if a tty)\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +000089arg ...: arguments passed to program in sys.argv[1:]\n\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000090Other environment variables:\n\
91PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020092PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000093 default module search path. The result is sys.path.\n\
Christian Heimes790c8232008-01-07 21:14:23 +000094";
Serhiy Storchaka2d06e842015-12-25 19:53:18 +020095static const char usage_5[] =
Serhiy Storchaka1ba01612015-12-30 09:28:19 +020096"PYTHONHOME : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
Victor Stinner9802b392010-08-19 11:36:43 +000097" The default module search path uses %s.\n"
98"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
99"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
Victor Stinner34be807c2016-03-14 12:04:26 +0100100"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
101static const char usage_6[] =
102"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
103" to seed the hashes of str, bytes and datetime objects. It can also be\n"
104" set to an integer in the range [0,4294967295] to get hash values with a\n"
105" predictable seed.\n"
106"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
107" on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000108" hooks.\n"
Stéphane Wirtel7d1017d2017-06-12 13:30:33 +0200109"PYTHONCOERCECLOCALE: if this variable is set to 0, it disables the locale\n"
Nick Coghlaneb817952017-06-18 12:29:42 +1000110" coercion behavior. Use PYTHONCOERCECLOCALE=warn to request display of\n"
111" locale coercion and locale compatibility warnings on stderr.\n";
Guido van Rossum667d7041995-08-04 04:20:48 +0000112
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800113static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800114pymain_usage(int error, const wchar_t* program)
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000115{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800116 FILE *f = error ? stderr : stdout;
Guido van Rossum393661d2001-08-31 17:40:15 +0000117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 fprintf(f, usage_line, program);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800119 if (error)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 fprintf(f, "Try `python -h' for more information.\n");
121 else {
122 fputs(usage_1, f);
123 fputs(usage_2, f);
124 fputs(usage_3, f);
Serhiy Storchaka1ba01612015-12-30 09:28:19 +0200125 fprintf(f, usage_4, (wint_t)DELIM);
126 fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100127 fputs(usage_6, f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000129}
130
Victor Stinnera7368ac2017-11-15 18:11:45 -0800131
132static char*
133pymain_get_env_var(const char *name)
134{
135 char *var = Py_GETENV(name);
136 if (var && var[0] != '\0') {
137 return var;
138 }
139 else {
140 return NULL;
141 }
142}
143
144
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800145static void
146pymain_run_statup(PyCompilerFlags *cf)
Martin v. Löwis6caea372003-11-18 19:46:25 +0000147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 char *startup = Py_GETENV("PYTHONSTARTUP");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800149 if (startup == NULL || startup[0] == '\0') {
150 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800152
153 FILE *fp = _Py_fopen(startup, "r");
154 if (fp == NULL) {
155 int save_errno = errno;
156 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
157 errno = save_errno;
158
159 PyErr_SetFromErrnoWithFilename(PyExc_OSError,
160 startup);
161 PyErr_Print();
162 PyErr_Clear();
163 return;
164 }
165
166 (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
167 PyErr_Clear();
168 fclose(fp);
Martin v. Löwis6caea372003-11-18 19:46:25 +0000169}
170
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800171static void
172pymain_run_interactive_hook(void)
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200173{
174 PyObject *sys, *hook, *result;
175 sys = PyImport_ImportModule("sys");
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800176 if (sys == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200177 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800178 }
179
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200180 hook = PyObject_GetAttrString(sys, "__interactivehook__");
181 Py_DECREF(sys);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800182 if (hook == NULL) {
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200183 PyErr_Clear();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800184 return;
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200185 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800186
187 result = _PyObject_CallNoArg(hook);
188 Py_DECREF(hook);
189 if (result == NULL) {
190 goto error;
191 }
192 Py_DECREF(result);
193
Antoine Pitrou1a6cb302013-05-04 20:08:35 +0200194 return;
195
196error:
197 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
198 PyErr_Print();
199 PyErr_Clear();
200}
201
Thomas Woutersa9773292006-04-21 09:43:23 +0000202
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800203static int
204pymain_run_module(wchar_t *modname, int set_argv0)
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 PyObject *module, *runpy, *runmodule, *runargs, *result;
207 runpy = PyImport_ImportModule("runpy");
208 if (runpy == NULL) {
209 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200210 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 return -1;
212 }
213 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
214 if (runmodule == NULL) {
215 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200216 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 Py_DECREF(runpy);
218 return -1;
219 }
220 module = PyUnicode_FromWideChar(modname, wcslen(modname));
221 if (module == NULL) {
222 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200223 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 Py_DECREF(runpy);
225 Py_DECREF(runmodule);
226 return -1;
227 }
228 runargs = Py_BuildValue("(Oi)", module, set_argv0);
229 if (runargs == NULL) {
230 fprintf(stderr,
231 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner7d36e4f2013-04-10 00:27:23 +0200232 PyErr_Print();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 Py_DECREF(runpy);
234 Py_DECREF(runmodule);
235 Py_DECREF(module);
236 return -1;
237 }
238 result = PyObject_Call(runmodule, runargs, NULL);
239 if (result == NULL) {
240 PyErr_Print();
241 }
242 Py_DECREF(runpy);
243 Py_DECREF(runmodule);
244 Py_DECREF(module);
245 Py_DECREF(runargs);
246 if (result == NULL) {
247 return -1;
248 }
249 Py_DECREF(result);
250 return 0;
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000251}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000252
Nick Coghland2977a32017-03-12 20:38:32 +1000253static PyObject *
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800254pymain_get_importer(wchar_t *filename)
Christian Heimes9cd17752007-11-18 19:35:23 +0000255{
Nick Coghland2977a32017-03-12 20:38:32 +1000256 PyObject *sys_path0 = NULL, *importer;
Christian Heimes9cd17752007-11-18 19:35:23 +0000257
Nick Coghland2977a32017-03-12 20:38:32 +1000258 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800259 if (sys_path0 == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000260 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800261 }
Victor Stinner4726e402010-10-06 23:24:57 +0000262
Nick Coghland2977a32017-03-12 20:38:32 +1000263 importer = PyImport_GetImporter(sys_path0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800264 if (importer == NULL) {
Victor Stinner4726e402010-10-06 23:24:57 +0000265 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800266 }
Victor Stinner4726e402010-10-06 23:24:57 +0000267
Brett Cannonaa936422012-04-27 15:30:58 -0400268 if (importer == Py_None) {
Nick Coghland2977a32017-03-12 20:38:32 +1000269 Py_DECREF(sys_path0);
Victor Stinner4726e402010-10-06 23:24:57 +0000270 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000271 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800273
Victor Stinner4726e402010-10-06 23:24:57 +0000274 Py_DECREF(importer);
Nick Coghland2977a32017-03-12 20:38:32 +1000275 return sys_path0;
Victor Stinner4726e402010-10-06 23:24:57 +0000276
Nick Coghland2977a32017-03-12 20:38:32 +1000277error:
278 Py_XDECREF(sys_path0);
279 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
280 PyErr_Print();
281 PyErr_Clear();
282 return NULL;
283}
284
285
286static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800287pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
Victor Stinnera62207c2010-08-07 10:57:17 +0000288{
289 PyObject *unicode, *bytes;
290 int ret;
291
292 unicode = PyUnicode_FromWideChar(command, -1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800293 if (unicode == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000294 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800295 }
296
Victor Stinnera62207c2010-08-07 10:57:17 +0000297 bytes = PyUnicode_AsUTF8String(unicode);
298 Py_DECREF(unicode);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800299 if (bytes == NULL) {
Victor Stinnera62207c2010-08-07 10:57:17 +0000300 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800301 }
302
Victor Stinnera62207c2010-08-07 10:57:17 +0000303 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
304 Py_DECREF(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800305 return (ret != 0);
Victor Stinnera62207c2010-08-07 10:57:17 +0000306
307error:
Victor Stinner398356b2010-08-18 22:23:22 +0000308 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinnera62207c2010-08-07 10:57:17 +0000309 PyErr_Print();
310 return 1;
311}
312
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800313
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000314static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800315pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000316{
317 PyObject *unicode, *bytes = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +0200318 const char *filename_str;
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000319 int run;
320
321 /* call pending calls like signal handlers (SIGINT) */
322 if (Py_MakePendingCalls() == -1) {
323 PyErr_Print();
324 return 1;
325 }
326
327 if (filename) {
328 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
329 if (unicode != NULL) {
Victor Stinnere0f32682010-10-17 19:34:51 +0000330 bytes = PyUnicode_EncodeFSDefault(unicode);
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000331 Py_DECREF(unicode);
332 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800333 if (bytes != NULL) {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000334 filename_str = PyBytes_AsString(bytes);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800335 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000336 else {
337 PyErr_Clear();
Victor Stinnere0f32682010-10-17 19:34:51 +0000338 filename_str = "<encoding error>";
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000339 }
340 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800341 else {
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000342 filename_str = "<stdin>";
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800343 }
Victor Stinner0a3ddad2010-08-07 16:34:25 +0000344
345 run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
346 Py_XDECREF(bytes);
347 return run != 0;
348}
349
Christian Heimes9cd17752007-11-18 19:35:23 +0000350
Guido van Rossum667d7041995-08-04 04:20:48 +0000351/* Main program */
352
Eric Snow6b4be192017-05-22 21:36:03 -0700353/*TODO: Add arg processing to PEP 432 as a new configuration setup API
354 */
355typedef struct {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800356 size_t len;
357 wchar_t **options;
358} _Py_OptList;
359
360typedef struct {
Eric Snow6b4be192017-05-22 21:36:03 -0700361 wchar_t *filename; /* Trailing arg without -c or -m */
362 wchar_t *command; /* -c argument */
363 wchar_t *module; /* -m argument */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800364 _Py_OptList warning_options; /* -W options */
Eric Snow6b4be192017-05-22 21:36:03 -0700365 PyObject *extra_options; /* -X options */
366 int print_help; /* -h, -? options */
367 int print_version; /* -V option */
368 int bytes_warning; /* Py_BytesWarningFlag */
369 int debug; /* Py_DebugFlag */
370 int inspect; /* Py_InspectFlag */
371 int interactive; /* Py_InteractiveFlag */
372 int isolated; /* Py_IsolatedFlag */
373 int optimization_level; /* Py_OptimizeFlag */
374 int dont_write_bytecode; /* Py_DontWriteBytecodeFlag */
375 int no_user_site_directory; /* Py_NoUserSiteDirectory */
376 int no_site_import; /* Py_NoSiteFlag */
377 int use_unbuffered_io; /* Py_UnbufferedStdioFlag */
378 int verbosity; /* Py_VerboseFlag */
379 int quiet_flag; /* Py_QuietFlag */
380 int skip_first_line; /* -x option */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800381 _Py_OptList xoptions; /* -X options */
Eric Snow6b4be192017-05-22 21:36:03 -0700382} _Py_CommandLineDetails;
383
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800384/* Structure used by Py_Main() to pass data to subfunctions */
385typedef struct {
386 /* Exit status ("exit code") */
387 int status;
388 PyCompilerFlags cf;
389 /* non-zero is stdin is a TTY or if -i option is used */
390 int stdin_is_interactive;
391 _PyCoreConfig core_config;
392 _Py_CommandLineDetails cmdline;
393 PyObject *main_importer_path;
394 /* non-zero if filename, command (-c) or module (-m) is set
395 on the command line */
396 int run_code;
397 wchar_t *program_name;
398 /* Error message if a function failed */
399 _PyInitError err;
400 /* PYTHONWARNINGS env var */
401 _Py_OptList env_warning_options;
402 int argc;
403 wchar_t **argv;
404} _PyMain;
405
406/* .cmdline is initialized to zeros */
407#define _PyMain_INIT \
408 {.status = 0, \
409 .cf = {.cf_flags = 0}, \
410 .core_config = _PyCoreConfig_INIT, \
411 .main_importer_path = NULL, \
412 .run_code = -1, \
413 .program_name = NULL, \
414 .err = _Py_INIT_OK(), \
415 .env_warning_options = {0, NULL}}
416
417
418#define INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed")
419
420
421static void
422pymain_optlist_clear(_Py_OptList *list)
423{
424 for (size_t i=0; i < list->len; i++) {
425 PyMem_RawFree(list->options[i]);
426 }
427 PyMem_RawFree(list->options);
428 list->len = 0;
429 list->options = NULL;
430}
431
432static void
433pymain_free_impl(_PyMain *pymain)
434{
435 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
436 pymain_optlist_clear(&cmdline->warning_options);
437 pymain_optlist_clear(&cmdline->xoptions);
438 PyMem_RawFree(cmdline->command);
439
440 pymain_optlist_clear(&pymain->env_warning_options);
441 Py_CLEAR(pymain->main_importer_path);
442 PyMem_RawFree(pymain->program_name);
443
444#ifdef __INSURE__
445 /* Insure++ is a memory analysis tool that aids in discovering
446 * memory leaks and other memory problems. On Python exit, the
447 * interned string dictionaries are flagged as being in use at exit
448 * (which it is). Under normal circumstances, this is fine because
449 * the memory will be automatically reclaimed by the system. Under
450 * memory debugging, it's a huge source of useless noise, so we
451 * trade off slower shutdown for less distraction in the memory
452 * reports. -baw
453 */
454 _Py_ReleaseInternedUnicodeStrings();
455#endif /* __INSURE__ */
456}
457
458static void
459pymain_free(_PyMain *pymain)
460{
Victor Stinnera7368ac2017-11-15 18:11:45 -0800461 /* Force malloc() memory allocator */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800462 PyMemAllocatorEx old_alloc, raw_alloc;
463 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
464 _PyMem_GetDefaultRawAllocator(&raw_alloc);
465 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &raw_alloc);
466
467 pymain_free_impl(pymain);
468
469 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
470}
471
Eric Snow6b4be192017-05-22 21:36:03 -0700472
473static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800474pymain_run_main_from_importer(_PyMain *pymain)
Guido van Rossum667d7041995-08-04 04:20:48 +0000475{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800476 PyObject *sys_path0 = pymain->main_importer_path;
477 PyObject *sys_path;
478 int sts;
479
480 /* Assume sys_path0 has already been checked by pymain_get_importer(),
481 * so put it in sys.path[0] and import __main__ */
482 sys_path = PySys_GetObject("path");
483 if (sys_path == NULL) {
484 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
485 goto error;
486 }
487
488 sts = PyList_Insert(sys_path, 0, sys_path0);
489 if (sts) {
490 sys_path0 = NULL;
491 goto error;
492 }
493
494 sts = pymain_run_module(L"__main__", 0);
495 return sts != 0;
496
497error:
498 Py_CLEAR(pymain->main_importer_path);
499 PyErr_Print();
500 return 1;
501}
502
503
504static wchar_t*
Victor Stinnera7368ac2017-11-15 18:11:45 -0800505pymain_strdup(_PyMain *pymain, wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800506{
507 size_t len = wcslen(str) + 1; /* +1 for NUL character */
508 wchar_t *str2 = PyMem_RawMalloc(sizeof(wchar_t) * len);
509 if (str2 == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800510 pymain->err = INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800511 return NULL;
512 }
513 memcpy(str2, str, len * sizeof(wchar_t));
514 return str2;
515}
516
517
518static int
Victor Stinnera7368ac2017-11-15 18:11:45 -0800519pymain_optlist_append(_PyMain *pymain, _Py_OptList *list, wchar_t *str)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800520{
Victor Stinnera7368ac2017-11-15 18:11:45 -0800521 wchar_t *str2 = pymain_strdup(pymain, str);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800522 if (str2 == NULL) {
523 return -1;
524 }
525
526 size_t size = (list->len + 1) * sizeof(list[0]);
527 wchar_t **options2 = (wchar_t **)PyMem_RawRealloc(list->options, size);
528 if (options2 == NULL) {
529 PyMem_RawFree(str2);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800530 pymain->err = INIT_NO_MEMORY();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800531 return -1;
532 }
533 options2[list->len] = str2;
534 list->options = options2;
535 list->len++;
536 return 0;
537}
538
539
540/* Parse the command line arguments
541 Return 0 on success.
542 Return 1 if parsing failed.
543 Set pymain->err and return -1 on other errors. */
544static int
Victor Stinnera7368ac2017-11-15 18:11:45 -0800545pymain_parse_cmdline_impl(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800546{
547 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
Eric Snow6b4be192017-05-22 21:36:03 -0700548
Antoine Pitrou86838b02012-02-21 19:03:47 +0100549 _PyOS_ResetGetOpt();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800550 do {
551 int c = _PyOS_GetOpt(pymain->argc, pymain->argv, PROGRAM_OPTS);
552 if (c == EOF) {
553 break;
554 }
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (c == 'c') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 /* -c is the last option; following arguments
558 that look like options are left for the
559 command to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800560 size_t len = wcslen(_PyOS_optarg) + 1 + 1;
561 wchar_t *command = PyMem_RawMalloc(sizeof(wchar_t) * len);
562 if (command == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800563 pymain->err = INIT_NO_MEMORY();
564 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800565 }
566 memcpy(command, _PyOS_optarg, len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 command[len - 2] = '\n';
568 command[len - 1] = 0;
Eric Snow6b4be192017-05-22 21:36:03 -0700569 cmdline->command = command;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 break;
571 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 if (c == 'm') {
574 /* -m is the last option; following arguments
575 that look like options are left for the
576 module to interpret. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800577 cmdline->module = _PyOS_optarg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 break;
579 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 switch (c) {
582 case 'b':
Eric Snow6b4be192017-05-22 21:36:03 -0700583 cmdline->bytes_warning++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 case 'd':
Eric Snow6b4be192017-05-22 21:36:03 -0700587 cmdline->debug++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 case 'i':
Eric Snow6b4be192017-05-22 21:36:03 -0700591 cmdline->inspect++;
592 cmdline->interactive++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000594
Christian Heimesad73a9c2013-08-10 16:36:18 +0200595 case 'I':
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800596 pymain->core_config.ignore_environment++;
Eric Snow6b4be192017-05-22 21:36:03 -0700597 cmdline->isolated++;
598 cmdline->no_user_site_directory++;
Christian Heimesad73a9c2013-08-10 16:36:18 +0200599 break;
600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 /* case 'J': reserved for Jython */
Christian Heimes33fe8092008-04-13 13:53:33 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 case 'O':
Eric Snow6b4be192017-05-22 21:36:03 -0700604 cmdline->optimization_level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 break;
Guido van Rossum7614da61997-03-03 19:14:45 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 case 'B':
Eric Snow6b4be192017-05-22 21:36:03 -0700608 cmdline->dont_write_bytecode++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 break;
Christian Heimes790c8232008-01-07 21:14:23 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 case 's':
Eric Snow6b4be192017-05-22 21:36:03 -0700612 cmdline->no_user_site_directory++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 break;
Christian Heimes8dc226f2008-05-06 23:45:46 +0000614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 case 'S':
Eric Snow6b4be192017-05-22 21:36:03 -0700616 cmdline->no_site_import++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 break;
Guido van Rossum7922bd71997-08-29 22:34:47 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 case 'E':
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800620 pymain->core_config.ignore_environment++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 break;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 case 't':
624 /* ignored for backwards compatibility */
625 break;
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 case 'u':
Eric Snow6b4be192017-05-22 21:36:03 -0700628 cmdline->use_unbuffered_io = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 case 'v':
Eric Snow6b4be192017-05-22 21:36:03 -0700632 cmdline->verbosity++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 break;
Guido van Rossum667d7041995-08-04 04:20:48 +0000634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 case 'x':
Eric Snow6b4be192017-05-22 21:36:03 -0700636 cmdline->skip_first_line = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 break;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 case 'h':
640 case '?':
Eric Snow6b4be192017-05-22 21:36:03 -0700641 cmdline->print_help++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 break;
Guido van Rossum45aecf42006-03-15 04:58:47 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 case 'V':
Eric Snow6b4be192017-05-22 21:36:03 -0700645 cmdline->print_version++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 break;
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 case 'W':
Victor Stinnera7368ac2017-11-15 18:11:45 -0800649 if (pymain_optlist_append(pymain, &cmdline->warning_options,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800650 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800651 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800652 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 break;
Guido van Rossum47f5fdc2000-12-15 22:00:54 +0000654
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000655 case 'X':
Victor Stinnera7368ac2017-11-15 18:11:45 -0800656 if (pymain_optlist_append(pymain, &cmdline->xoptions,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800657 _PyOS_optarg) < 0) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800658 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800659 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +0000660 break;
661
Georg Brandl9d871192010-12-04 10:47:18 +0000662 case 'q':
Eric Snow6b4be192017-05-22 21:36:03 -0700663 cmdline->quiet_flag++;
Georg Brandl9d871192010-12-04 10:47:18 +0000664 break;
665
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100666 case 'R':
Benjamin Petersonc9f54cf2012-02-21 16:08:05 -0500667 /* Ignored */
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100668 break;
669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 /* This space reserved for other options */
Guido van Rossum667d7041995-08-04 04:20:48 +0000671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 default:
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800673 /* unknown argument: parsing failed */
674 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800676 } while (1);
677
678 if (cmdline->command == NULL && cmdline->module == NULL
679 && _PyOS_optind < pymain->argc
680 && wcscmp(pymain->argv[_PyOS_optind], L"-") != 0)
681 {
682 cmdline->filename = pymain->argv[_PyOS_optind];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000684
Eric Snow6b4be192017-05-22 21:36:03 -0700685 return 0;
686}
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000687
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800688
Nick Coghland7ac0612017-10-25 12:11:26 +1000689static void
690maybe_set_flag(int *flag, int value)
691{
692 /* Helper to set flag variables from command line options
693 * - uses the higher of the two values if they're both set
694 * - otherwise leaves the flag unset
695 */
696 if (*flag < value) {
697 *flag = value;
698 }
699}
700
Eric Snow6b4be192017-05-22 21:36:03 -0700701
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800702static int
703pymain_add_xoptions(_PyMain *pymain)
704{
705 _Py_OptList *options = &pymain->cmdline.xoptions;
706 for (size_t i=0; i < options->len; i++) {
707 wchar_t *option = options->options[i];
708 if (_PySys_AddXOptionWithError(option) < 0) {
709 pymain->err = INIT_NO_MEMORY();
710 return -1;
711 }
712 }
Eric Snow6b4be192017-05-22 21:36:03 -0700713 return 0;
714}
715
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800716
717static int
718pymain_add_warnings_optlist(_Py_OptList *warnings)
Eric Snow6b4be192017-05-22 21:36:03 -0700719{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800720 for (size_t i = 0; i < warnings->len; i++) {
721 PyObject *option = PyUnicode_FromWideChar(warnings->options[i], -1);
722 if (option == NULL) {
723 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700724 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800725 if (_PySys_AddWarnOptionWithError(option)) {
726 Py_DECREF(option);
727 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700728 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800729 Py_DECREF(option);
Eric Snow6b4be192017-05-22 21:36:03 -0700730 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800731 return 0;
732}
Eric Snow6b4be192017-05-22 21:36:03 -0700733
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800734static int
735pymain_add_warnings_options(_PyMain *pymain)
736{
737 PySys_ResetWarnOptions();
Eric Snow1abcf672017-05-23 21:46:51 -0700738
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800739 if (pymain_add_warnings_optlist(&pymain->env_warning_options) < 0) {
740 pymain->err = INIT_NO_MEMORY();
741 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700742 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800743 if (pymain_add_warnings_optlist(&pymain->cmdline.warning_options) < 0) {
744 pymain->err = INIT_NO_MEMORY();
745 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -0700746 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800747 return 0;
748}
Eric Snow6b4be192017-05-22 21:36:03 -0700749
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800750
751/* Get warning options from PYTHONWARNINGS environment variable.
752 Return 0 on success.
753 Set pymain->err and return -1 on error. */
754static int
755pymain_warnings_envvar(_PyMain *pymain)
756{
757 if (Py_IgnoreEnvironmentFlag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 return 0;
759 }
Barry Warsaw3b2aedb2000-09-15 18:40:42 +0000760
Philip Jenveye53de3d2010-04-14 03:01:39 +0000761#ifdef MS_WINDOWS
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800762 wchar_t *wp;
763
764 if ((wp = _wgetenv(L"PYTHONWARNINGS")) && *wp != L'\0') {
Steve Dowerf63dab52015-02-25 20:48:01 -0800765 wchar_t *buf, *warning, *context = NULL;
Philip Jenvey0805ca32010-04-07 04:04:10 +0000766
Victor Stinner1a7425f2013-07-07 16:25:15 +0200767 buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800768 if (buf == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800769 pymain->err = INIT_NO_MEMORY();
770 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800771 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 wcscpy(buf, wp);
Steve Dowerf63dab52015-02-25 20:48:01 -0800773 for (warning = wcstok_s(buf, L",", &context);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 warning != NULL;
Steve Dowerf63dab52015-02-25 20:48:01 -0800775 warning = wcstok_s(NULL, L",", &context)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800776
Victor Stinnera7368ac2017-11-15 18:11:45 -0800777 if (pymain_optlist_append(pymain, &pymain->env_warning_options,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800778 warning) < 0) {
779 PyMem_RawFree(buf);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800780 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800781 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200783 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000785#else
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800786 char *p;
787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
789 char *buf, *oldloc;
Philip Jenveye53de3d2010-04-14 03:01:39 +0000790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 /* settle for strtok here as there's no one standard
792 C89 wcstok */
Victor Stinner1a7425f2013-07-07 16:25:15 +0200793 buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800794 if (buf == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800795 pymain->err = INIT_NO_MEMORY();
796 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800797 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 strcpy(buf, p);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200799 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 setlocale(LC_ALL, "");
801 for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800802 size_t len;
803 wchar_t *warning = Py_DecodeLocale(p, &len);
804 if (warning == NULL) {
805 if (len == (size_t)-2) {
806 pymain->err = _Py_INIT_ERR("failed to decode "
807 "PYTHONWARNINGS");
808 return -1;
809 }
810 else {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800811 pymain->err = INIT_NO_MEMORY();
812 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800813 }
Victor Stinneraf02e1c2011-12-16 23:56:01 +0100814 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800815 if (pymain_optlist_append(pymain, &pymain->env_warning_options,
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800816 warning) < 0) {
817 PyMem_RawFree(warning);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800818 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800819 }
820 PyMem_RawFree(warning);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 }
822 setlocale(LC_ALL, oldloc);
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200823 PyMem_RawFree(oldloc);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200824 PyMem_RawFree(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 }
Philip Jenveye53de3d2010-04-14 03:01:39 +0000826#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800827 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800828}
829
830
831static void
832pymain_init_stdio(_PyMain *pymain)
833{
834 pymain->stdin_is_interactive = (isatty(fileno(stdin))
835 || Py_InteractiveFlag);
Guido van Rossum775af911997-02-14 19:50:32 +0000836
Sjoerd Mullender9cf424b2002-08-09 13:35:18 +0000837#if defined(MS_WINDOWS) || defined(__CYGWIN__)
Victor Stinner89e34362011-01-07 18:47:22 +0000838 /* don't translate newlines (\r\n <=> \n) */
839 _setmode(fileno(stdin), O_BINARY);
840 _setmode(fileno(stdout), O_BINARY);
841 _setmode(fileno(stderr), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000842#endif
Victor Stinner89e34362011-01-07 18:47:22 +0000843
844 if (Py_UnbufferedStdioFlag) {
Guido van Rossum22ffac11998-03-06 15:30:39 +0000845#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
847 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
848 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000849#else /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 setbuf(stdin, (char *)NULL);
851 setbuf(stdout, (char *)NULL);
852 setbuf(stderr, (char *)NULL);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000853#endif /* !HAVE_SETVBUF */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 }
855 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000856#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 /* Doesn't have to have line-buffered -- use unbuffered */
858 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
859 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000860#else /* !MS_WINDOWS */
861#ifdef HAVE_SETVBUF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
863 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000864#endif /* HAVE_SETVBUF */
865#endif /* !MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 /* Leave stderr alone - it should be unbuffered anyway. */
867 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800868}
Guido van Rossum667d7041995-08-04 04:20:48 +0000869
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800870
871/* Get the program name: use PYTHONEXECUTABLE and __PYVENV_LAUNCHER__
872 environment variables on macOS if available, use argv[0] by default.
873
874 Return 0 on success.
875 Set pymain->err and return -1 on error. */
876static int
877pymain_get_program_name(_PyMain *pymain)
878{
879 assert(pymain->program_name == NULL);
Just van Rossum2ac79ef2003-03-05 15:46:54 +0000880#ifdef __APPLE__
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800881 char *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 /* On MacOS X, when the Python interpreter is embedded in an
883 application bundle, it gets executed by a bootstrapping script
884 that does os.execve() with an argv[0] that's different from the
885 actual Python executable. This is needed to keep the Finder happy,
886 or rather, to work around Apple's overly strict requirements of
887 the process name. However, we still need a usable sys.executable,
888 so the actual executable path is passed in an environment variable.
889 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
890 script. */
891 if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
892 wchar_t* buffer;
Ronald Oussoreneb61f8b2012-08-22 14:24:14 +0200893 size_t len = strlen(p) + 1;
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000894
Victor Stinner1a7425f2013-07-07 16:25:15 +0200895 buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 if (buffer == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800897 pymain->err = INIT_NO_MEMORY();
898 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 }
Ronald Oussoren3e264e12009-02-12 15:55:38 +0000900
Brett Cannonb94767f2011-02-22 20:15:44 +0000901 mbstowcs(buffer, p, len);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800902 pymain->program_name = buffer;
903 }
Vinay Sajip90db6612012-07-17 17:33:46 +0100904#ifdef WITH_NEXT_FRAMEWORK
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800905 else {
Vinay Sajip90db6612012-07-17 17:33:46 +0100906 char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
Vinay Sajip90db6612012-07-17 17:33:46 +0100907 if (pyvenv_launcher && *pyvenv_launcher) {
908 /* Used by Mac/Tools/pythonw.c to forward
909 * the argv0 of the stub executable
910 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800911 size_t len;
912 wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, &len);
Vinay Sajip90db6612012-07-17 17:33:46 +0100913 if (wbuf == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800914 if (len == (size_t)-2) {
915 pymain->err = _Py_INIT_ERR("failed to decode "
916 "__PYVENV_LAUNCHER__");
917 return -1;
918 }
919 else {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800920 pymain->err = INIT_NO_MEMORY();
921 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800922 }
Vinay Sajip90db6612012-07-17 17:33:46 +0100923 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800924 pymain->program_name = wbuf;
Vinay Sajip90db6612012-07-17 17:33:46 +0100925 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800927#endif /* WITH_NEXT_FRAMEWORK */
928#endif /* __APPLE__ */
Eric Snowc7ec9982017-05-23 23:00:52 -0700929
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800930 if (pymain->program_name == NULL) {
931 /* Use argv[0] by default */
Victor Stinnera7368ac2017-11-15 18:11:45 -0800932 pymain->program_name = pymain_strdup(pymain, pymain->argv[0]);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800933 if (pymain->program_name == NULL) {
Victor Stinnera7368ac2017-11-15 18:11:45 -0800934 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800935 }
936 }
937 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800938}
939
940
941/* Initialize the main interpreter.
942 *
943 * Replaces previous call to Py_Initialize()
944 *
945 * TODO: Move environment queries (etc) into Py_ReadConfig
946 *
947 * Return 0 on success.
948 * Set pymain->err and return -1 on error.
949 */
950static int
951pymain_init_main_interpreter(_PyMain *pymain)
952{
953 _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
954 _PyInitError err;
955
956 /* TODO: Moar config options! */
957 config.install_signal_handlers = 1;
958
959 /* TODO: Print any exceptions raised by these operations */
960 err = _Py_ReadMainInterpreterConfig(&config);
961 if (_Py_INIT_FAILED(err)) {
962 pymain->err = err;
963 return -1;
Eric Snowc7ec9982017-05-23 23:00:52 -0700964 }
Guido van Rossumed52aac1997-07-19 19:20:32 +0000965
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800966 err = _Py_InitializeMainInterpreter(&config);
967 if (_Py_INIT_FAILED(err)) {
968 pymain->err = err;
969 return -1;
970 }
971 return 0;
972}
973
974
975static void
976pymain_header(_PyMain *pymain)
977{
Eric Snow1abcf672017-05-23 21:46:51 -0700978 /* TODO: Move this to _PyRun_PrepareMain */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800979 if (Py_QuietFlag) {
980 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 }
Guido van Rossum393661d2001-08-31 17:40:15 +0000982
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800983 if (!Py_VerboseFlag && (pymain->run_code || !pymain->stdin_is_interactive)) {
984 return;
985 }
986
987 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
988 if (!Py_NoSiteFlag) {
989 fprintf(stderr, "%s\n", COPYRIGHT);
990 }
991}
992
993
994static void
Victor Stinnera7368ac2017-11-15 18:11:45 -0800995pymain_set_argv(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800996{
997 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
998
Eric Snow1abcf672017-05-23 21:46:51 -0700999 /* TODO: Move this to _Py_InitializeMainInterpreter */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001000 if (cmdline->command != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
1002 _PyOS_optind--;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001003 pymain->argv[_PyOS_optind] = L"-c";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001005
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001006 if (cmdline->module != NULL) {
Nick Coghland26c18a2010-08-17 13:06:11 +00001007 /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 _PyOS_optind--;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001009 pymain->argv[_PyOS_optind] = L"-m";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 }
Raymond Hettingerdb29e0f2004-10-07 06:46:25 +00001011
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001012 int update_path;
1013 if (pymain->main_importer_path != NULL) {
1014 /* Let pymain_run_main_from_importer() adjust sys.path[0] later */
1015 update_path = 0;
Nick Coghland2977a32017-03-12 20:38:32 +10001016 } else {
1017 /* Use config settings to decide whether or not to update sys.path[0] */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001018 update_path = (Py_IsolatedFlag == 0);
1019 }
1020 PySys_SetArgvEx(pymain->argc - _PyOS_optind,
1021 pymain->argv + _PyOS_optind,
1022 update_path);
1023}
1024
1025
1026/* Set Py_XXX global configuration variables */
1027static void
1028pymain_set_global_config(_PyMain *pymain)
1029{
1030 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1031 maybe_set_flag(&Py_BytesWarningFlag, cmdline->bytes_warning);
1032 maybe_set_flag(&Py_DebugFlag, cmdline->debug);
1033 maybe_set_flag(&Py_InspectFlag, cmdline->inspect);
1034 maybe_set_flag(&Py_InteractiveFlag, cmdline->interactive);
1035 maybe_set_flag(&Py_IsolatedFlag, cmdline->isolated);
1036 maybe_set_flag(&Py_OptimizeFlag, cmdline->optimization_level);
1037 maybe_set_flag(&Py_DontWriteBytecodeFlag, cmdline->dont_write_bytecode);
1038 maybe_set_flag(&Py_NoUserSiteDirectory, cmdline->no_user_site_directory);
1039 maybe_set_flag(&Py_NoSiteFlag, cmdline->no_site_import);
1040 maybe_set_flag(&Py_UnbufferedStdioFlag, cmdline->use_unbuffered_io);
1041 maybe_set_flag(&Py_VerboseFlag, cmdline->verbosity);
1042 maybe_set_flag(&Py_QuietFlag, cmdline->quiet_flag);
1043
1044 maybe_set_flag(&Py_IgnoreEnvironmentFlag, pymain->core_config.ignore_environment);
1045}
1046
1047
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001048static void
1049pymain_import_readline(_PyMain *pymain)
1050{
1051 if (Py_IsolatedFlag) {
1052 return;
1053 }
1054 if (!Py_InspectFlag && pymain->run_code) {
1055 return;
1056 }
1057 if (!isatty(fileno(stdin))) {
1058 return;
Nick Coghland2977a32017-03-12 20:38:32 +10001059 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001060
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001061 PyObject *mod = PyImport_ImportModule("readline");
1062 if (mod == NULL) {
1063 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 }
1065 else {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001066 Py_DECREF(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001068}
1069
1070
1071static FILE*
1072pymain_open_filename(_PyMain *pymain)
1073{
1074 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1075 FILE* fp;
1076
1077 fp = _Py_wfopen(cmdline->filename, L"r");
1078 if (fp == NULL) {
1079 char *cfilename_buffer;
1080 const char *cfilename;
1081 int err = errno;
1082 cfilename_buffer = Py_EncodeLocale(cmdline->filename, NULL);
1083 if (cfilename_buffer != NULL)
1084 cfilename = cfilename_buffer;
1085 else
1086 cfilename = "<unprintable file name>";
1087 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
1088 pymain->argv[0], cfilename, err, strerror(err));
1089 PyMem_Free(cfilename_buffer);
1090 pymain->status = 2;
1091 return NULL;
1092 }
1093
1094 if (cmdline->skip_first_line) {
1095 int ch;
1096 /* Push back first newline so line numbers
1097 remain the same */
1098 while ((ch = getc(fp)) != EOF) {
1099 if (ch == '\n') {
1100 (void)ungetc(ch, fp);
1101 break;
1102 }
1103 }
1104 }
1105
1106 struct _Py_stat_struct sb;
1107 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1108 S_ISDIR(sb.st_mode)) {
1109 fprintf(stderr,
1110 "%ls: '%ls' is a directory, cannot continue\n",
1111 pymain->argv[0], cmdline->filename);
1112 fclose(fp);
1113 pymain->status = 1;
1114 return NULL;
1115 }
1116
1117 return fp;
1118}
1119
1120
1121static void
Victor Stinnera7368ac2017-11-15 18:11:45 -08001122pymain_run_filename(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001123{
1124 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1125
1126 if (cmdline->filename == NULL && pymain->stdin_is_interactive) {
1127 Py_InspectFlag = 0; /* do exit on SystemExit */
1128 pymain_run_statup(&pymain->cf);
1129 pymain_run_interactive_hook();
1130 }
1131 /* XXX */
1132
1133 if (pymain->main_importer_path != NULL) {
1134 pymain->status = pymain_run_main_from_importer(pymain);
1135 return;
1136 }
1137
1138 FILE *fp;
1139 if (cmdline->filename != NULL) {
1140 fp = pymain_open_filename(pymain);
1141 if (fp == NULL) {
1142 return;
1143 }
1144 }
1145 else {
1146 fp = stdin;
1147 }
1148
1149 pymain->status = pymain_run_file(fp, cmdline->filename, &pymain->cf);
1150}
1151
1152
1153static void
1154pymain_repl(_PyMain *pymain)
1155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 /* Check this environment variable at the end, to give programs the
Victor Stinnera7368ac2017-11-15 18:11:45 -08001157 opportunity to set it from Python. */
1158 if (!Py_InspectFlag && pymain_get_env_var("PYTHONINSPECT")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 Py_InspectFlag = 1;
1160 }
Guido van Rossum667d7041995-08-04 04:20:48 +00001161
Victor Stinnera7368ac2017-11-15 18:11:45 -08001162 if (!(Py_InspectFlag && pymain->stdin_is_interactive
1163 && pymain->run_code)) {
1164 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001166
1167 Py_InspectFlag = 0;
1168 pymain_run_interactive_hook();
1169 /* XXX */
1170 int res = PyRun_AnyFileFlags(stdin, "<stdin>", &pymain->cf);
1171 pymain->status = (res != 0);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001172}
1173
1174
1175/* Parse the command line.
1176 Handle --version and --help options directly.
1177
1178 Return 1 if Python must exit.
1179 Return 0 on success.
1180 Set pymain->err and return -1 on failure. */
1181static int
Victor Stinnera7368ac2017-11-15 18:11:45 -08001182pymain_parse_cmdline(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001183{
1184 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1185
Victor Stinnera7368ac2017-11-15 18:11:45 -08001186 int res = pymain_parse_cmdline_impl(pymain);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001187 if (res < 0) {
1188 return -1;
1189 }
1190 if (res) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001191 pymain_usage(1, pymain->argv[0]);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001192 pymain->status = 2;
1193 return 1;
1194 }
1195
1196 if (cmdline->print_help) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001197 pymain_usage(0, pymain->argv[0]);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001198 pymain->status = 0;
1199 return 1;
1200 }
1201
1202 if (cmdline->print_version) {
1203 printf("Python %s\n",
1204 (cmdline->print_version >= 2) ? Py_GetVersion() : PY_VERSION);
1205 return 1;
1206 }
1207
1208 pymain->run_code = (cmdline->command != NULL || cmdline->filename != NULL
1209 || cmdline->module != NULL);
1210
1211 return 0;
1212}
1213
1214
Victor Stinnera7368ac2017-11-15 18:11:45 -08001215static wchar_t*
1216pymain_get_xoption(_PyMain *pymain, wchar_t *name)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001217{
Victor Stinnera7368ac2017-11-15 18:11:45 -08001218 _Py_OptList *list = &pymain->cmdline.xoptions;
1219 for (size_t i=0; i < list->len; i++) {
1220 wchar_t *option = list->options[i];
1221 size_t len;
1222 wchar_t *sep = wcschr(option, L'=');
1223 if (sep != NULL) {
1224 len = (sep - option);
1225 }
1226 else {
1227 len = wcslen(option);
1228 }
1229 if (wcsncmp(option, name, len) == 0 && name[len] == L'\0') {
1230 return option;
1231 }
1232 }
1233 return NULL;
1234}
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001235
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001236
Victor Stinnera7368ac2017-11-15 18:11:45 -08001237static int
1238pymain_str_to_int(char *str, int *result)
1239{
1240 errno = 0;
1241 char *endptr = str;
1242 long value = strtol(str, &endptr, 10);
1243 if (*endptr != '\0' || errno == ERANGE) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001244 return -1;
1245 }
Victor Stinnera7368ac2017-11-15 18:11:45 -08001246 if (value < INT_MIN || value > INT_MAX) {
1247 return -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001248 }
1249
Victor Stinnera7368ac2017-11-15 18:11:45 -08001250 *result = (int)value;
1251 return 0;
1252}
1253
1254
1255static int
1256pymain_wstr_to_int(wchar_t *wstr, int *result)
1257{
1258 errno = 0;
1259 wchar_t *endptr = wstr;
1260 long value = wcstol(wstr, &endptr, 10);
1261 if (*endptr != '\0' || errno == ERANGE) {
1262 return -1;
1263 }
1264 if (value < INT_MIN || value > INT_MAX) {
1265 return -1;
1266 }
1267
1268 *result = (int)value;
1269 return 0;
1270}
1271
1272
1273static int
1274pymain_init_tracemalloc(_PyMain *pymain)
1275{
1276 int nframe;
1277 int valid;
1278
1279 char *env = pymain_get_env_var("PYTHONTRACEMALLOC");
1280 if (env) {
1281 if (!pymain_str_to_int(env, &nframe)) {
1282 valid = (nframe >= 1);
1283 }
1284 else {
1285 valid = 0;
1286 }
1287 if (!valid) {
1288 pymain->err = _Py_INIT_USER_ERR("PYTHONTRACEMALLOC: invalid "
1289 "number of frames");
1290 return -1;
1291 }
1292 pymain->core_config.tracemalloc = nframe;
1293 }
1294
1295 wchar_t *xoption = pymain_get_xoption(pymain, L"tracemalloc");
1296 if (xoption) {
1297 wchar_t *sep = wcschr(xoption, L'=');
1298 if (sep) {
1299 if (!pymain_wstr_to_int(sep + 1, &nframe)) {
1300 valid = (nframe >= 1);
1301 }
1302 else {
1303 valid = 0;
1304 }
1305 if (!valid) {
1306 pymain->err = _Py_INIT_USER_ERR("-X tracemalloc=NFRAME: "
1307 "invalid number of frames");
1308 return -1;
1309 }
1310 }
1311 else {
1312 /* -X tracemalloc behaves as -X tracemalloc=1 */
1313 nframe = 1;
1314 }
1315 pymain->core_config.tracemalloc = nframe;
1316 }
1317 return 0;
1318}
1319
1320
1321static void
1322pymain_set_flag_from_env(int *flag, const char *name)
1323{
1324 char *var = pymain_get_env_var(name);
1325 if (!var) {
1326 return;
1327 }
1328 int value;
1329 if (pymain_str_to_int(var, &value) < 0 || value < 0) {
1330 /* PYTHONDEBUG=text and PYTHONDEBUG=-2 behave as PYTHONDEBUG=1 */
1331 value = 1;
1332 }
1333 if (*flag < value) {
1334 *flag = value;
1335 }
1336}
1337
1338
1339static void
1340pymain_set_flags_from_env(_PyMain *pymain)
1341{
1342 pymain_set_flag_from_env(&Py_DebugFlag,
1343 "PYTHONDEBUG");
1344 pymain_set_flag_from_env(&Py_VerboseFlag,
1345 "PYTHONVERBOSE");
1346 pymain_set_flag_from_env(&Py_OptimizeFlag,
1347 "PYTHONOPTIMIZE");
1348 pymain_set_flag_from_env(&Py_InspectFlag,
1349 "PYTHONINSPECT");
1350 pymain_set_flag_from_env(&Py_DontWriteBytecodeFlag,
1351 "PYTHONDONTWRITEBYTECODE");
1352 pymain_set_flag_from_env(&Py_NoUserSiteDirectory,
1353 "PYTHONNOUSERSITE");
1354 pymain_set_flag_from_env(&Py_UnbufferedStdioFlag,
1355 "PYTHONUNBUFFERED");
1356#ifdef MS_WINDOWS
1357 pymain_set_flag_from_env(&Py_LegacyWindowsFSEncodingFlag,
1358 "PYTHONLEGACYWINDOWSFSENCODING");
1359 pymain_set_flag_from_env(&Py_LegacyWindowsStdioFlag,
1360 "PYTHONLEGACYWINDOWSSTDIO");
1361#endif
1362}
1363
1364
1365static int
1366pymain_parse_envvars(_PyMain *pymain)
1367{
1368 _PyCoreConfig *core_config = &pymain->core_config;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001369
1370 /* Get environment variables */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001371 pymain_set_flags_from_env(pymain);
1372
1373 /* The variable is only tested for existence here;
1374 _Py_HashRandomization_Init will check its value further. */
1375 if (pymain_get_env_var("PYTHONHASHSEED")) {
1376 Py_HashRandomizationFlag = 1;
1377 }
1378
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001379 if (pymain_warnings_envvar(pymain) < 0) {
1380 return -1;
1381 }
1382 if (pymain_get_program_name(pymain) < 0) {
1383 return -1;
1384 }
1385 core_config->allocator = Py_GETENV("PYTHONMALLOC");
1386
Victor Stinnera7368ac2017-11-15 18:11:45 -08001387 /* More complex options: env var and/or -X option */
1388 if (pymain_get_env_var("PYTHONFAULTHANDLER")
1389 || pymain_get_xoption(pymain, L"faulthandler")) {
1390 core_config->faulthandler = 1;
1391 }
1392 if (pymain_get_env_var("PYTHONPROFILEIMPORTTIME")
1393 || pymain_get_xoption(pymain, L"importtime")) {
1394 core_config->importtime = 1;
1395 }
1396 if (pymain_init_tracemalloc(pymain) < 0) {
1397 return -1;
1398 }
Victor Stinnerccb04422017-11-16 03:20:31 -08001399 if (pymain_get_xoption(pymain, L"dev")) {
1400 /* "python3 -X dev ..." behaves
1401 as "PYTHONMALLOC=debug python3 -Wd -X faulthandler ..." */
1402 core_config->allocator = "debug";
1403 if (pymain_optlist_append(pymain, &pymain->cmdline.warning_options,
1404 L"default") < 0) {
1405 return -1;
1406 }
1407 core_config->faulthandler = 1;
1408 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001409 return 0;
1410}
1411
1412
Victor Stinnera7368ac2017-11-15 18:11:45 -08001413/* Parse command line options and environment variables.
1414 This code must not use Python runtime apart PyMem_Raw memory allocator.
1415
1416 Return 0 on success.
1417 Return 1 if Python is done and must exit.
1418 Set pymain->err and return -1 on error. */
1419static int
1420pymain_parse_cmdline_envvars_impl(_PyMain *pymain)
1421{
1422 int res = pymain_parse_cmdline(pymain);
1423 if (res < 0) {
1424 return -1;
1425 }
1426 if (res > 0) {
1427 return 1;
1428 }
1429
1430 pymain_set_global_config(pymain);
1431
1432 if (pymain_parse_envvars(pymain) < 0) {
1433 return -1;
1434 }
1435
1436 return 0;
1437}
1438
1439
1440static int
1441pymain_parse_cmdline_envvars(_PyMain *pymain)
1442{
1443 /* Force malloc() memory allocator */
1444 PyMemAllocatorEx old_alloc, raw_alloc;
1445 PyMem_GetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1446 _PyMem_GetDefaultRawAllocator(&raw_alloc);
1447 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &raw_alloc);
1448
1449 int res = pymain_parse_cmdline_envvars_impl(pymain);
1450
1451 /* Restore the old memory allocator */
1452 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1453
1454 return res;
1455}
1456
1457static int
1458pymain_init_python(_PyMain *pymain)
1459{
1460 pymain_init_stdio(pymain);
1461
1462 pymain->err = _Py_InitializeCore(&pymain->core_config);
1463 if (_Py_INIT_FAILED(pymain->err)) {
1464 return -1;
1465 }
1466
1467 Py_SetProgramName(pymain->program_name);
1468 /* Don't free program_name here: the argument to Py_SetProgramName
1469 must remain valid until Py_FinalizeEx is called. The string is freed
1470 by pymain_free(). */
1471
1472 if (pymain_add_xoptions(pymain)) {
1473 return -1;
1474 }
1475 if (pymain_add_warnings_options(pymain)) {
1476 return -1;
1477 }
1478
1479 if (pymain_init_main_interpreter(pymain)) {
1480 return -1;
1481 }
1482 return 0;
1483}
1484
1485
1486static void
1487pymain_run_python(_PyMain *pymain)
1488{
1489 _Py_CommandLineDetails *cmdline = &pymain->cmdline;
1490
1491 pymain_header(pymain);
1492 pymain_import_readline(pymain);
1493
1494 if (cmdline->filename != NULL) {
1495 pymain->main_importer_path = pymain_get_importer(cmdline->filename);
1496 }
1497
1498 pymain_set_argv(pymain);
1499
1500 if (cmdline->command) {
1501 pymain->status = pymain_run_command(cmdline->command, &pymain->cf);
1502 }
1503 else if (cmdline->module) {
1504 pymain->status = (pymain_run_module(cmdline->module, 1) != 0);
1505 }
1506 else {
1507 pymain_run_filename(pymain);
1508 }
1509 pymain_repl(pymain);
1510}
1511
1512
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001513static int
1514pymain_init(_PyMain *pymain)
1515{
1516 pymain->err = _PyRuntime_Initialize();
1517 if (_Py_INIT_FAILED(pymain->err)) {
1518 return -1;
1519 }
1520
Victor Stinnera7368ac2017-11-15 18:11:45 -08001521 pymain->core_config._disable_importlib = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001522
Victor Stinnera7368ac2017-11-15 18:11:45 -08001523 orig_argc = pymain->argc; /* For Py_GetArgcArgv() */
1524 orig_argv = pymain->argv;
1525 return 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001526}
1527
Victor Stinnera7368ac2017-11-15 18:11:45 -08001528
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001529static int
Victor Stinnera7368ac2017-11-15 18:11:45 -08001530pymain_impl(_PyMain *pymain)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001531{
Victor Stinnera7368ac2017-11-15 18:11:45 -08001532 int res = pymain_init(pymain);
1533 if (res < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001534 return -1;
1535 }
1536
Victor Stinnera7368ac2017-11-15 18:11:45 -08001537 res = pymain_parse_cmdline_envvars(pymain);
1538 if (res < 0) {
1539 return -1;
1540 }
1541 if (res > 0) {
1542 /* --help or --version command: we are done */
1543 return 0;
1544 }
1545
1546 res = pymain_init_python(pymain);
1547 if (res < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001548 return -1;
1549 }
1550
Victor Stinnera7368ac2017-11-15 18:11:45 -08001551 pymain_run_python(pymain);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001553 if (Py_FinalizeEx() < 0) {
1554 /* Value unlikely to be confused with a non-error exit status or
Victor Stinnera7368ac2017-11-15 18:11:45 -08001555 other special meaning */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001556 pymain->status = 120;
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001557 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001558 return 0;
1559}
Barry Warsaw3e13b1e2001-02-23 16:46:39 +00001560
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001561
1562int
1563Py_Main(int argc, wchar_t **argv)
1564{
1565 _PyMain pymain = _PyMain_INIT;
1566 memset(&pymain.cmdline, 0, sizeof(pymain.cmdline));
1567 pymain.argc = argc;
1568 pymain.argv = argv;
1569
Victor Stinnera7368ac2017-11-15 18:11:45 -08001570 if (pymain_impl(&pymain) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001571 _Py_FatalInitError(pymain.err);
1572 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001573 pymain_free(&pymain);
1574
1575 return pymain.status;
Guido van Rossum667d7041995-08-04 04:20:48 +00001576}
1577
Skip Montanaro786ea6b2004-03-01 15:44:05 +00001578/* this is gonna seem *real weird*, but if you put some other code between
1579 Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
1580 while statement in Misc/gdbinit:ppystack */
Guido van Rossum667d7041995-08-04 04:20:48 +00001581
Guido van Rossum667d7041995-08-04 04:20:48 +00001582/* Make the *original* argc/argv available to other modules.
1583 This is rare, but it is needed by the secureware extension. */
1584
1585void
Martin v. Löwis790465f2008-04-05 20:41:37 +00001586Py_GetArgcArgv(int *argc, wchar_t ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +00001587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 *argc = orig_argc;
1589 *argv = orig_argv;
Guido van Rossum667d7041995-08-04 04:20:48 +00001590}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001591
1592#ifdef __cplusplus
1593}
1594#endif