blob: 3aa4d91c9a3cdca1d7c50f9be9415fae48c29375 [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001/* Python interpreter main program */
2
3#include "Python.h"
Victor Stinner4f98f462020-04-15 04:01:58 +02004#include "pycore_initconfig.h" // _PyArgv
5#include "pycore_interp.h" // _PyInterpreterState.sysdict
6#include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0()
7#include "pycore_pylifecycle.h" // _Py_PreInitializeFromPyArgv()
8#include "pycore_pystate.h" // _PyInterpreterState_GET()
Guido van Rossum667d7041995-08-04 04:20:48 +00009
Victor Stinner95e2cbf2019-03-01 16:25:19 +010010/* Includes for exit_sigint() */
Victor Stinner4f98f462020-04-15 04:01:58 +020011#include <stdio.h> // perror()
Victor Stinner95e2cbf2019-03-01 16:25:19 +010012#ifdef HAVE_SIGNAL_H
Victor Stinner4f98f462020-04-15 04:01:58 +020013# include <signal.h> // SIGINT
Guido van Rossuma075ce11997-12-05 21:56:45 +000014#endif
Victor Stinner95e2cbf2019-03-01 16:25:19 +010015#if defined(HAVE_GETPID) && defined(HAVE_UNISTD_H)
Victor Stinner4f98f462020-04-15 04:01:58 +020016# include <unistd.h> // getpid()
Victor Stinner95e2cbf2019-03-01 16:25:19 +010017#endif
Erik Janssens925af1d2019-05-21 12:11:11 +020018#ifdef MS_WINDOWS
Victor Stinner4f98f462020-04-15 04:01:58 +020019# include <windows.h> // STATUS_CONTROL_C_EXIT
Victor Stinner95e2cbf2019-03-01 16:25:19 +010020#endif
21/* End of includes for exit_sigint() */
Guido van Rossuma075ce11997-12-05 21:56:45 +000022
Guido van Rossuma22865e2000-09-05 04:41:18 +000023#define COPYRIGHT \
Guido van Rossum36002d72001-07-18 16:59:46 +000024 "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
25 "for more information."
Guido van Rossuma22865e2000-09-05 04:41:18 +000026
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000027#ifdef __cplusplus
28extern "C" {
29#endif
30
Victor Stinner95e2cbf2019-03-01 16:25:19 +010031/* --- pymain_init() ---------------------------------------------- */
32
Victor Stinner331a6a52019-05-27 16:39:22 +020033static PyStatus
Victor Stinner5ac27a52019-03-27 13:40:14 +010034pymain_init(const _PyArgv *args)
Victor Stinner95e2cbf2019-03-01 16:25:19 +010035{
Victor Stinner331a6a52019-05-27 16:39:22 +020036 PyStatus status;
Victor Stinner95e2cbf2019-03-01 16:25:19 +010037
Victor Stinner331a6a52019-05-27 16:39:22 +020038 status = _PyRuntime_Initialize();
39 if (_PyStatus_EXCEPTION(status)) {
40 return status;
Victor Stinner95e2cbf2019-03-01 16:25:19 +010041 }
42
Victor Stinner331a6a52019-05-27 16:39:22 +020043 PyPreConfig preconfig;
Victor Stinner3c30a762019-10-01 10:56:37 +020044 PyPreConfig_InitPythonConfig(&preconfig);
Victor Stinner441b10c2019-09-28 04:28:35 +020045
Victor Stinner331a6a52019-05-27 16:39:22 +020046 status = _Py_PreInitializeFromPyArgv(&preconfig, args);
47 if (_PyStatus_EXCEPTION(status)) {
48 return status;
Victor Stinner6dcb5422019-03-05 02:44:12 +010049 }
50
Victor Stinner331a6a52019-05-27 16:39:22 +020051 PyConfig config;
Victor Stinner8462a492019-10-01 12:06:16 +020052 PyConfig_InitPythonConfig(&config);
Victor Stinnercab5d072019-05-17 19:01:14 +020053
Victor Stinnerd929f182019-03-27 18:28:46 +010054 /* pass NULL as the config: config is read from command line arguments,
55 environment variables, configuration files */
Victor Stinner5ac27a52019-03-27 13:40:14 +010056 if (args->use_bytes_argv) {
Victor Stinner331a6a52019-05-27 16:39:22 +020057 status = PyConfig_SetBytesArgv(&config, args->argc, args->bytes_argv);
Victor Stinner484f20d2019-03-27 02:04:16 +010058 }
Victor Stinner5ac27a52019-03-27 13:40:14 +010059 else {
Victor Stinner331a6a52019-05-27 16:39:22 +020060 status = PyConfig_SetArgv(&config, args->argc, args->wchar_argv);
Victor Stinner484f20d2019-03-27 02:04:16 +010061 }
Victor Stinner331a6a52019-05-27 16:39:22 +020062 if (_PyStatus_EXCEPTION(status)) {
Victor Stinner67310022019-07-01 19:52:45 +020063 goto done;
Victor Stinner331a6a52019-05-27 16:39:22 +020064 }
65
66 status = Py_InitializeFromConfig(&config);
67 if (_PyStatus_EXCEPTION(status)) {
Victor Stinner67310022019-07-01 19:52:45 +020068 goto done;
Victor Stinner331a6a52019-05-27 16:39:22 +020069 }
Victor Stinner67310022019-07-01 19:52:45 +020070 status = _PyStatus_OK();
71
72done:
73 PyConfig_Clear(&config);
74 return status;
Victor Stinner95e2cbf2019-03-01 16:25:19 +010075}
76
77
78/* --- pymain_run_python() ---------------------------------------- */
79
80/* Non-zero if filename, command (-c) or module (-m) is set
81 on the command line */
Victor Stinner331a6a52019-05-27 16:39:22 +020082static inline int config_run_code(const PyConfig *config)
83{
84 return (config->run_command != NULL
85 || config->run_filename != NULL
86 || config->run_module != NULL);
87}
88
Victor Stinner95e2cbf2019-03-01 16:25:19 +010089
90/* Return non-zero is stdin is a TTY or if -i command line option is used */
91static int
Victor Stinner331a6a52019-05-27 16:39:22 +020092stdin_is_interactive(const PyConfig *config)
Victor Stinner95e2cbf2019-03-01 16:25:19 +010093{
94 return (isatty(fileno(stdin)) || config->interactive);
95}
96
97
Victor Stinner12083282019-05-17 23:05:29 +020098/* Display the current Python exception and return an exitcode */
99static int
100pymain_err_print(int *exitcode_p)
101{
102 int exitcode;
103 if (_Py_HandleSystemExit(&exitcode)) {
104 *exitcode_p = exitcode;
105 return 1;
106 }
107
108 PyErr_Print();
109 return 0;
110}
111
112
113static int
114pymain_exit_err_print(void)
115{
116 int exitcode = 1;
117 pymain_err_print(&exitcode);
118 return exitcode;
119}
120
121
122/* Write an exitcode into *exitcode and return 1 if we have to exit Python.
123 Return 0 otherwise. */
124static int
125pymain_get_importer(const wchar_t *filename, PyObject **importer_p, int *exitcode)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100126{
127 PyObject *sys_path0 = NULL, *importer;
128
129 sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
130 if (sys_path0 == NULL) {
131 goto error;
132 }
133
134 importer = PyImport_GetImporter(sys_path0);
135 if (importer == NULL) {
136 goto error;
137 }
138
139 if (importer == Py_None) {
140 Py_DECREF(sys_path0);
141 Py_DECREF(importer);
Victor Stinner12083282019-05-17 23:05:29 +0200142 return 0;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100143 }
144
145 Py_DECREF(importer);
Victor Stinner12083282019-05-17 23:05:29 +0200146 *importer_p = sys_path0;
147 return 0;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100148
149error:
150 Py_XDECREF(sys_path0);
Victor Stinner12083282019-05-17 23:05:29 +0200151
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100152 PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
Victor Stinner12083282019-05-17 23:05:29 +0200153 return pymain_err_print(exitcode);
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100154}
155
156
157static int
158pymain_sys_path_add_path0(PyInterpreterState *interp, PyObject *path0)
159{
160 _Py_IDENTIFIER(path);
161 PyObject *sys_path;
162 PyObject *sysdict = interp->sysdict;
163 if (sysdict != NULL) {
164 sys_path = _PyDict_GetItemIdWithError(sysdict, &PyId_path);
165 if (sys_path == NULL && PyErr_Occurred()) {
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200166 return -1;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100167 }
168 }
169 else {
170 sys_path = NULL;
171 }
172 if (sys_path == NULL) {
173 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200174 return -1;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100175 }
176
177 if (PyList_Insert(sys_path, 0, path0)) {
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200178 return -1;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100179 }
180 return 0;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100181}
182
183
184static void
Victor Stinner331a6a52019-05-27 16:39:22 +0200185pymain_header(const PyConfig *config)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100186{
187 if (config->quiet) {
188 return;
189 }
190
Victor Stinner331a6a52019-05-27 16:39:22 +0200191 if (!config->verbose && (config_run_code(config) || !stdin_is_interactive(config))) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100192 return;
193 }
194
195 fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
196 if (config->site_import) {
197 fprintf(stderr, "%s\n", COPYRIGHT);
198 }
199}
200
201
202static void
Victor Stinner331a6a52019-05-27 16:39:22 +0200203pymain_import_readline(const PyConfig *config)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100204{
Victor Stinner20004952019-03-26 02:31:11 +0100205 if (config->isolated) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100206 return;
207 }
Victor Stinner331a6a52019-05-27 16:39:22 +0200208 if (!config->inspect && config_run_code(config)) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100209 return;
210 }
211 if (!isatty(fileno(stdin))) {
212 return;
213 }
214
215 PyObject *mod = PyImport_ImportModule("readline");
216 if (mod == NULL) {
217 PyErr_Clear();
218 }
219 else {
220 Py_DECREF(mod);
221 }
222}
223
224
225static int
226pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
227{
228 PyObject *unicode, *bytes;
229 int ret;
230
231 unicode = PyUnicode_FromWideChar(command, -1);
232 if (unicode == NULL) {
233 goto error;
234 }
235
Steve Dowere226e832019-07-01 16:03:53 -0700236 if (PySys_Audit("cpython.run_command", "O", unicode) < 0) {
237 return pymain_exit_err_print();
238 }
239
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100240 bytes = PyUnicode_AsUTF8String(unicode);
241 Py_DECREF(unicode);
242 if (bytes == NULL) {
243 goto error;
244 }
245
246 ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
247 Py_DECREF(bytes);
248 return (ret != 0);
249
250error:
251 PySys_WriteStderr("Unable to decode the command from the command line:\n");
Victor Stinner12083282019-05-17 23:05:29 +0200252 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100253}
254
255
256static int
257pymain_run_module(const wchar_t *modname, int set_argv0)
258{
259 PyObject *module, *runpy, *runmodule, *runargs, *result;
Steve Dowere226e832019-07-01 16:03:53 -0700260 if (PySys_Audit("cpython.run_module", "u", modname) < 0) {
261 return pymain_exit_err_print();
262 }
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100263 runpy = PyImport_ImportModule("runpy");
264 if (runpy == NULL) {
265 fprintf(stderr, "Could not import runpy module\n");
Victor Stinner12083282019-05-17 23:05:29 +0200266 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100267 }
268 runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
269 if (runmodule == NULL) {
270 fprintf(stderr, "Could not access runpy._run_module_as_main\n");
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100271 Py_DECREF(runpy);
Victor Stinner12083282019-05-17 23:05:29 +0200272 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100273 }
274 module = PyUnicode_FromWideChar(modname, wcslen(modname));
275 if (module == NULL) {
276 fprintf(stderr, "Could not convert module name to unicode\n");
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100277 Py_DECREF(runpy);
278 Py_DECREF(runmodule);
Victor Stinner12083282019-05-17 23:05:29 +0200279 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100280 }
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +0300281 runargs = PyTuple_Pack(2, module, set_argv0 ? Py_True : Py_False);
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100282 if (runargs == NULL) {
283 fprintf(stderr,
284 "Could not create arguments for runpy._run_module_as_main\n");
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100285 Py_DECREF(runpy);
286 Py_DECREF(runmodule);
287 Py_DECREF(module);
Victor Stinner12083282019-05-17 23:05:29 +0200288 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100289 }
Thomas Graingera68a2ad2020-09-22 16:53:03 +0100290 _Py_UnhandledKeyboardInterrupt = 0;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100291 result = PyObject_Call(runmodule, runargs, NULL);
Thomas Graingera68a2ad2020-09-22 16:53:03 +0100292 if (!result && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
293 _Py_UnhandledKeyboardInterrupt = 1;
294 }
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100295 Py_DECREF(runpy);
296 Py_DECREF(runmodule);
297 Py_DECREF(module);
298 Py_DECREF(runargs);
299 if (result == NULL) {
Victor Stinner12083282019-05-17 23:05:29 +0200300 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100301 }
302 Py_DECREF(result);
303 return 0;
304}
305
306
307static int
Victor Stinnerda7933e2020-04-13 03:04:28 +0200308pymain_run_file(const PyConfig *config, PyCompilerFlags *cf)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100309{
310 const wchar_t *filename = config->run_filename;
Steve Dowere226e832019-07-01 16:03:53 -0700311 if (PySys_Audit("cpython.run_file", "u", filename) < 0) {
312 return pymain_exit_err_print();
313 }
Inada Naoki10654c12019-04-01 18:35:20 +0900314 FILE *fp = _Py_wfopen(filename, L"rb");
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100315 if (fp == NULL) {
316 char *cfilename_buffer;
317 const char *cfilename;
318 int err = errno;
319 cfilename_buffer = _Py_EncodeLocaleRaw(filename, NULL);
320 if (cfilename_buffer != NULL)
321 cfilename = cfilename_buffer;
322 else
323 cfilename = "<unprintable file name>";
324 fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
Victor Stinnerfed02e12019-05-17 11:12:09 +0200325 config->program_name, cfilename, err, strerror(err));
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100326 PyMem_RawFree(cfilename_buffer);
327 return 2;
328 }
329
330 if (config->skip_source_first_line) {
331 int ch;
332 /* Push back first newline so line numbers remain the same */
333 while ((ch = getc(fp)) != EOF) {
334 if (ch == '\n') {
335 (void)ungetc(ch, fp);
336 break;
337 }
338 }
339 }
340
341 struct _Py_stat_struct sb;
342 if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) {
343 fprintf(stderr,
344 "%ls: '%ls' is a directory, cannot continue\n",
Victor Stinnerfed02e12019-05-17 11:12:09 +0200345 config->program_name, filename);
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100346 fclose(fp);
347 return 1;
348 }
349
350 /* call pending calls like signal handlers (SIGINT) */
351 if (Py_MakePendingCalls() == -1) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100352 fclose(fp);
Victor Stinner12083282019-05-17 23:05:29 +0200353 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100354 }
355
356 PyObject *unicode, *bytes = NULL;
357 const char *filename_str;
358
359 unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
360 if (unicode != NULL) {
361 bytes = PyUnicode_EncodeFSDefault(unicode);
362 Py_DECREF(unicode);
363 }
364 if (bytes != NULL) {
365 filename_str = PyBytes_AsString(bytes);
366 }
367 else {
368 PyErr_Clear();
369 filename_str = "<filename encoding error>";
370 }
371
372 /* PyRun_AnyFileExFlags(closeit=1) calls fclose(fp) before running code */
373 int run = PyRun_AnyFileExFlags(fp, filename_str, 1, cf);
374 Py_XDECREF(bytes);
375 return (run != 0);
376}
377
378
Victor Stinner12083282019-05-17 23:05:29 +0200379static int
Victor Stinner331a6a52019-05-27 16:39:22 +0200380pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100381{
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300382 int ret;
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300383 if (!config->use_environment) {
384 return 0;
385 }
Victor Stinner550e4672020-12-09 00:32:54 +0100386 PyObject *startup = NULL;
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300387#ifdef MS_WINDOWS
Victor Stinner550e4672020-12-09 00:32:54 +0100388 const wchar_t *env = _wgetenv(L"PYTHONSTARTUP");
389 if (env == NULL || env[0] == L'\0') {
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300390 return 0;
391 }
Victor Stinner550e4672020-12-09 00:32:54 +0100392 startup = PyUnicode_FromWideChar(env, wcslen(env));
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100393 if (startup == NULL) {
Victor Stinner550e4672020-12-09 00:32:54 +0100394 goto error;
395 }
396#else
397 const char *env = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP");
398 if (env == NULL) {
Victor Stinner12083282019-05-17 23:05:29 +0200399 return 0;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100400 }
Victor Stinner550e4672020-12-09 00:32:54 +0100401 startup = PyUnicode_DecodeFSDefault(env);
402 if (startup == NULL) {
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300403 goto error;
Steve Dowere226e832019-07-01 16:03:53 -0700404 }
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300405#endif
Victor Stinner550e4672020-12-09 00:32:54 +0100406 if (PySys_Audit("cpython.run_startup", "O", startup) < 0) {
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300407 goto error;
Serhiy Storchaka6c6810d2020-06-24 08:46:05 +0300408 }
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100409
Victor Stinner550e4672020-12-09 00:32:54 +0100410 FILE *fp = _Py_fopen_obj(startup, "r");
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100411 if (fp == NULL) {
412 int save_errno = errno;
Serhiy Storchaka6c6810d2020-06-24 08:46:05 +0300413 PyErr_Clear();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100414 PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100415
Victor Stinner12083282019-05-17 23:05:29 +0200416 errno = save_errno;
Victor Stinner550e4672020-12-09 00:32:54 +0100417 PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, startup, NULL);
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300418 goto error;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100419 }
420
Victor Stinner550e4672020-12-09 00:32:54 +0100421 (void) _PyRun_SimpleFileObject(fp, startup, 0, cf);
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100422 PyErr_Clear();
423 fclose(fp);
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300424 ret = 0;
425
426done:
Victor Stinner550e4672020-12-09 00:32:54 +0100427 Py_XDECREF(startup);
Serhiy Storchakaa7dc7142020-06-24 19:46:30 +0300428 return ret;
429
430error:
431 ret = pymain_err_print(exitcode);
432 goto done;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100433}
434
435
Victor Stinner12083282019-05-17 23:05:29 +0200436/* Write an exitcode into *exitcode and return 1 if we have to exit Python.
437 Return 0 otherwise. */
438static int
439pymain_run_interactive_hook(int *exitcode)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100440{
441 PyObject *sys, *hook, *result;
442 sys = PyImport_ImportModule("sys");
443 if (sys == NULL) {
444 goto error;
445 }
446
447 hook = PyObject_GetAttrString(sys, "__interactivehook__");
448 Py_DECREF(sys);
449 if (hook == NULL) {
450 PyErr_Clear();
Victor Stinner12083282019-05-17 23:05:29 +0200451 return 0;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100452 }
453
Steve Dowere226e832019-07-01 16:03:53 -0700454 if (PySys_Audit("cpython.run_interactivehook", "O", hook) < 0) {
455 goto error;
456 }
457
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100458 result = _PyObject_CallNoArg(hook);
459 Py_DECREF(hook);
460 if (result == NULL) {
461 goto error;
462 }
463 Py_DECREF(result);
464
Victor Stinner12083282019-05-17 23:05:29 +0200465 return 0;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100466
467error:
468 PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
Victor Stinner12083282019-05-17 23:05:29 +0200469 return pymain_err_print(exitcode);
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100470}
471
472
473static int
Victor Stinner331a6a52019-05-27 16:39:22 +0200474pymain_run_stdin(PyConfig *config, PyCompilerFlags *cf)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100475{
476 if (stdin_is_interactive(config)) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100477 config->inspect = 0;
Victor Stinnerc96be812019-05-14 17:34:56 +0200478 Py_InspectFlag = 0; /* do exit on SystemExit */
Victor Stinner12083282019-05-17 23:05:29 +0200479
480 int exitcode;
481 if (pymain_run_startup(config, cf, &exitcode)) {
482 return exitcode;
483 }
484
485 if (pymain_run_interactive_hook(&exitcode)) {
486 return exitcode;
487 }
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100488 }
489
490 /* call pending calls like signal handlers (SIGINT) */
491 if (Py_MakePendingCalls() == -1) {
Victor Stinner12083282019-05-17 23:05:29 +0200492 return pymain_exit_err_print();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100493 }
494
Steve Dowere226e832019-07-01 16:03:53 -0700495 if (PySys_Audit("cpython.run_stdin", NULL) < 0) {
496 return pymain_exit_err_print();
497 }
498
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100499 int run = PyRun_AnyFileExFlags(stdin, "<stdin>", 0, cf);
500 return (run != 0);
501}
502
503
504static void
Victor Stinner331a6a52019-05-27 16:39:22 +0200505pymain_repl(PyConfig *config, PyCompilerFlags *cf, int *exitcode)
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100506{
507 /* Check this environment variable at the end, to give programs the
508 opportunity to set it from Python. */
Victor Stinnerc96be812019-05-14 17:34:56 +0200509 if (!config->inspect && _Py_GetEnv(config->use_environment, "PYTHONINSPECT")) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100510 config->inspect = 1;
Victor Stinnerc96be812019-05-14 17:34:56 +0200511 Py_InspectFlag = 1;
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100512 }
513
Victor Stinner331a6a52019-05-27 16:39:22 +0200514 if (!(config->inspect && stdin_is_interactive(config) && config_run_code(config))) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100515 return;
516 }
517
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100518 config->inspect = 0;
Victor Stinnerc96be812019-05-14 17:34:56 +0200519 Py_InspectFlag = 0;
Victor Stinner12083282019-05-17 23:05:29 +0200520 if (pymain_run_interactive_hook(exitcode)) {
521 return;
522 }
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100523
524 int res = PyRun_AnyFileFlags(stdin, "<stdin>", cf);
525 *exitcode = (res != 0);
526}
527
528
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200529static void
Victor Stinner5ac27a52019-03-27 13:40:14 +0100530pymain_run_python(int *exitcode)
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +0100531{
Victor Stinner81a7be32020-04-14 15:14:01 +0200532 PyInterpreterState *interp = _PyInterpreterState_GET();
Victor Stinner5ac27a52019-03-27 13:40:14 +0100533 /* pymain_run_stdin() modify the config */
Victor Stinnerda7933e2020-04-13 03:04:28 +0200534 PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp);
Victor Stinnerd3b19192018-07-25 10:21:03 +0200535
536 PyObject *main_importer_path = NULL;
Victor Stinner62be7632019-03-01 13:10:14 +0100537 if (config->run_filename != NULL) {
Victor Stinnerd5dda982017-12-13 17:31:16 +0100538 /* If filename is a package (ex: directory or ZIP file) which contains
539 __main__.py, main_importer_path is set to filename and will be
Victor Stinnerd3b19192018-07-25 10:21:03 +0200540 prepended to sys.path.
541
Victor Stinner12083282019-05-17 23:05:29 +0200542 Otherwise, main_importer_path is left unchanged. */
543 if (pymain_get_importer(config->run_filename, &main_importer_path,
544 exitcode)) {
545 return;
546 }
Victor Stinnerd5dda982017-12-13 17:31:16 +0100547 }
548
Victor Stinnerd3b19192018-07-25 10:21:03 +0200549 if (main_importer_path != NULL) {
550 if (pymain_sys_path_add_path0(interp, main_importer_path) < 0) {
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200551 goto error;
Victor Stinnerd3b19192018-07-25 10:21:03 +0200552 }
Victor Stinnerd5dda982017-12-13 17:31:16 +0100553 }
Victor Stinner20004952019-03-26 02:31:11 +0100554 else if (!config->isolated) {
Victor Stinnerdcf61712019-03-19 16:09:27 +0100555 PyObject *path0 = NULL;
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200556 int res = _PyPathConfig_ComputeSysPath0(&config->argv, &path0);
557 if (res < 0) {
558 goto error;
559 }
Victor Stinner19760862017-12-20 01:41:59 +0100560
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200561 if (res > 0) {
Victor Stinnerdcf61712019-03-19 16:09:27 +0100562 if (pymain_sys_path_add_path0(interp, path0) < 0) {
563 Py_DECREF(path0);
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200564 goto error;
Victor Stinnerdcf61712019-03-19 16:09:27 +0100565 }
Victor Stinner19760862017-12-20 01:41:59 +0100566 Py_DECREF(path0);
Victor Stinner19760862017-12-20 01:41:59 +0100567 }
Victor Stinner19760862017-12-20 01:41:59 +0100568 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800569
Victor Stinner37d66d72019-06-13 02:16:41 +0200570 PyCompilerFlags cf = _PyCompilerFlags_INIT;
Victor Stinnera7368ac2017-11-15 18:11:45 -0800571
Victor Stinner62be7632019-03-01 13:10:14 +0100572 pymain_header(config);
573 pymain_import_readline(config);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800574
Victor Stinner62be7632019-03-01 13:10:14 +0100575 if (config->run_command) {
576 *exitcode = pymain_run_command(config->run_command, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800577 }
Victor Stinner62be7632019-03-01 13:10:14 +0100578 else if (config->run_module) {
Victor Stinner12083282019-05-17 23:05:29 +0200579 *exitcode = pymain_run_module(config->run_module, 1);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800580 }
Victor Stinnerd3b19192018-07-25 10:21:03 +0200581 else if (main_importer_path != NULL) {
Victor Stinner12083282019-05-17 23:05:29 +0200582 *exitcode = pymain_run_module(L"__main__", 0);
Victor Stinnerd3b19192018-07-25 10:21:03 +0200583 }
Victor Stinner62be7632019-03-01 13:10:14 +0100584 else if (config->run_filename != NULL) {
585 *exitcode = pymain_run_file(config, &cf);
Victor Stinner72ec3192018-08-02 19:34:20 +0200586 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800587 else {
Victor Stinner62be7632019-03-01 13:10:14 +0100588 *exitcode = pymain_run_stdin(config, &cf);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800589 }
Victor Stinner9cfc0022017-12-20 19:36:46 +0100590
Victor Stinner62be7632019-03-01 13:10:14 +0100591 pymain_repl(config, &cf, exitcode);
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200592 goto done;
593
594error:
Victor Stinner12083282019-05-17 23:05:29 +0200595 *exitcode = pymain_exit_err_print();
Victor Stinnerd3b19192018-07-25 10:21:03 +0200596
597done:
598 Py_XDECREF(main_importer_path);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800599}
600
Victor Stinnera7368ac2017-11-15 18:11:45 -0800601
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100602/* --- pymain_main() ---------------------------------------------- */
603
604static void
605pymain_free(void)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800606{
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100607 _PyImport_Fini2();
Victor Stinner99fcc612019-04-29 13:04:07 +0200608
609 /* Free global variables which cannot be freed in Py_Finalize():
610 configuration options set before Py_Initialize() which should
611 remain valid after Py_Finalize(), since
612 Py_Initialize()-Py_Finalize() can be called multiple times. */
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100613 _PyPathConfig_ClearGlobal();
614 _Py_ClearStandardStreamEncoding();
615 _Py_ClearArgcArgv();
Victor Stinnerf5f336a2019-03-19 14:53:58 +0100616 _PyRuntime_Finalize();
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100617}
Victor Stinner94540602017-12-16 04:54:22 +0100618
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200619
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100620static int
621exit_sigint(void)
622{
623 /* bpo-1054041: We need to exit via the
624 * SIG_DFL handler for SIGINT if KeyboardInterrupt went unhandled.
625 * If we don't, a calling process such as a shell may not know
626 * about the user's ^C. https://www.cons.org/cracauer/sigint.html */
627#if defined(HAVE_GETPID) && !defined(MS_WINDOWS)
628 if (PyOS_setsig(SIGINT, SIG_DFL) == SIG_ERR) {
629 perror("signal"); /* Impossible in normal environments. */
630 } else {
631 kill(getpid(), SIGINT);
Victor Stinner19760862017-12-20 01:41:59 +0100632 }
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100633 /* If setting SIG_DFL failed, or kill failed to terminate us,
634 * there isn't much else we can do aside from an error code. */
635#endif /* HAVE_GETPID && !MS_WINDOWS */
636#ifdef MS_WINDOWS
637 /* cmd.exe detects this, prints ^C, and offers to terminate. */
638 /* https://msdn.microsoft.com/en-us/library/cc704588.aspx */
639 return STATUS_CONTROL_C_EXIT;
640#else
641 return SIGINT + 128;
642#endif /* !MS_WINDOWS */
Victor Stinner1dc6e392018-07-25 02:49:17 +0200643}
644
645
Victor Stinner2f549082019-03-29 15:13:46 +0100646static void _Py_NO_RETURN
Victor Stinner331a6a52019-05-27 16:39:22 +0200647pymain_exit_error(PyStatus status)
Victor Stinner1dc6e392018-07-25 02:49:17 +0200648{
Victor Stinner331a6a52019-05-27 16:39:22 +0200649 if (_PyStatus_IS_EXIT(status)) {
Victor Stinner4cb525a2019-04-26 13:05:47 +0200650 /* If it's an error rather than a regular exit, leave Python runtime
Victor Stinner331a6a52019-05-27 16:39:22 +0200651 alive: Py_ExitStatusException() uses the current exception and use
Victor Stinner4cb525a2019-04-26 13:05:47 +0200652 sys.stdout in this case. */
653 pymain_free();
654 }
Victor Stinner331a6a52019-05-27 16:39:22 +0200655 Py_ExitStatusException(status);
Victor Stinner2f549082019-03-29 15:13:46 +0100656}
Victor Stinner1dc6e392018-07-25 02:49:17 +0200657
Victor Stinnerdfe88472019-03-01 12:14:41 +0100658
Victor Stinner2f549082019-03-29 15:13:46 +0100659int
Victor Stinner331a6a52019-05-27 16:39:22 +0200660Py_RunMain(void)
Victor Stinner2f549082019-03-29 15:13:46 +0100661{
Victor Stinnerdfe88472019-03-01 12:14:41 +0100662 int exitcode = 0;
Victor Stinner2f549082019-03-29 15:13:46 +0100663
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200664 pymain_run_python(&exitcode);
Victor Stinnerae239f62019-05-16 17:02:56 +0200665
Victor Stinnerdfe88472019-03-01 12:14:41 +0100666 if (Py_FinalizeEx() < 0) {
667 /* Value unlikely to be confused with a non-error exit status or
668 other special meaning */
669 exitcode = 120;
Victor Stinner19760862017-12-20 01:41:59 +0100670 }
671
Victor Stinner62be7632019-03-01 13:10:14 +0100672 pymain_free();
Victor Stinner94540602017-12-16 04:54:22 +0100673
Gregory P. Smith38f11cc2019-02-16 12:57:40 -0800674 if (_Py_UnhandledKeyboardInterrupt) {
Victor Stinner95e2cbf2019-03-01 16:25:19 +0100675 exitcode = exit_sigint();
Gregory P. Smith38f11cc2019-02-16 12:57:40 -0800676 }
677
Victor Stinnerdfe88472019-03-01 12:14:41 +0100678 return exitcode;
Victor Stinner2f549082019-03-29 15:13:46 +0100679}
Victor Stinnerc1834442019-03-18 22:24:28 +0100680
Victor Stinner2f549082019-03-29 15:13:46 +0100681
682static int
683pymain_main(_PyArgv *args)
684{
Victor Stinner331a6a52019-05-27 16:39:22 +0200685 PyStatus status = pymain_init(args);
686 if (_PyStatus_IS_EXIT(status)) {
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200687 pymain_free();
Victor Stinner331a6a52019-05-27 16:39:22 +0200688 return status.exitcode;
Victor Stinnerdbacfc22019-05-16 16:39:26 +0200689 }
Victor Stinner331a6a52019-05-27 16:39:22 +0200690 if (_PyStatus_EXCEPTION(status)) {
691 pymain_exit_error(status);
Victor Stinner2f549082019-03-29 15:13:46 +0100692 }
693
Victor Stinner331a6a52019-05-27 16:39:22 +0200694 return Py_RunMain();
Victor Stinner94540602017-12-16 04:54:22 +0100695}
696
697
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800698int
699Py_Main(int argc, wchar_t **argv)
700{
Victor Stinner62be7632019-03-01 13:10:14 +0100701 _PyArgv args = {
702 .argc = argc,
703 .use_bytes_argv = 0,
704 .bytes_argv = NULL,
705 .wchar_argv = argv};
706 return pymain_main(&args);
Guido van Rossum667d7041995-08-04 04:20:48 +0000707}
708
Victor Stinner94540602017-12-16 04:54:22 +0100709
710int
Victor Stinner331a6a52019-05-27 16:39:22 +0200711Py_BytesMain(int argc, char **argv)
Victor Stinner94540602017-12-16 04:54:22 +0100712{
Victor Stinner62be7632019-03-01 13:10:14 +0100713 _PyArgv args = {
714 .argc = argc,
715 .use_bytes_argv = 1,
716 .bytes_argv = argv,
717 .wchar_argv = NULL};
718 return pymain_main(&args);
Victor Stinner94540602017-12-16 04:54:22 +0100719}
720
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000721#ifdef __cplusplus
722}
723#endif