blob: 254f6247f1202068a3dc45e1614f41fe0f134dea [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossum667d7041995-08-04 04:20:48 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum667d7041995-08-04 04:20:48 +000014
15******************************************************************/
16
17/* Python interpreter main program */
18
19#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +000020#include "osdefs.h"
Guido van Rossum667d7041995-08-04 04:20:48 +000021
Guido van Rossum66a70131996-12-09 18:46:58 +000022#ifdef HAVE_UNISTD_H
23#include <unistd.h>
24#endif
Guido van Rossum667d7041995-08-04 04:20:48 +000025
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000026#ifdef MS_WINDOWS
27#include <fcntl.h>
28#endif
29
Guido van Rossuma075ce11997-12-05 21:56:45 +000030#if defined(PYOS_OS2) || defined(MS_WINDOWS)
31#define PYTHONHOMEHELP "<prefix>\\lib"
32#else
33#define PYTHONHOMEHELP "<prefix>/python1.5"
34#endif
35
Guido van Rossum667d7041995-08-04 04:20:48 +000036/* Interface to getopt(): */
37extern int optind;
38extern char *optarg;
39extern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */
40
41
Guido van Rossumac56b031996-07-21 02:33:38 +000042/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum667d7041995-08-04 04:20:48 +000043static char **orig_argv;
44static int orig_argc;
45
Guido van Rossum667d7041995-08-04 04:20:48 +000046/* Short usage message (with %s for argv0) */
47static char *usage_line =
Guido van Rossum6b86a421999-01-28 15:07:47 +000048"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000049
50/* Long usage message, split into parts < 512 bytes */
Guido van Rossuma075ce11997-12-05 21:56:45 +000051static char *usage_top = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000052Options and arguments (and corresponding environment variables):\n\
53-d : debug output from parser (also PYTHONDEBUG=x)\n\
Guido van Rossum775af911997-02-14 19:50:32 +000054-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000055 and force prompts, even if stdin does not appear to be a terminal\n\
Guido van Rossume7adf3e1998-10-07 14:50:06 +000056-O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000057-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000058-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000059-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000060";
Guido van Rossum7922bd71997-08-29 22:34:47 +000061static char *usage_mid = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000062-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossumc15a9a12000-05-01 17:54:33 +000063-U : Unicode literals: treats '...' literals like u'...'\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000064-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000065-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Guido van Rossum775af911997-02-14 19:50:32 +000066-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000067file : program read from script file\n\
68- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000069";
70static char *usage_bot = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000071arg ...: arguments passed to program in sys.argv[1:]\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000072Other environment variables:\n\
73PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000074PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000075 default module search path. The result is sys.path.\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000076PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
77 The default module search path uses %s.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000078";
79
80
81/* Main program */
82
Guido van Rossum9c1201f1998-12-07 14:28:47 +000083DL_EXPORT(int)
Guido van Rossumed52aac1997-07-19 19:20:32 +000084Py_Main(argc, argv)
Guido van Rossum667d7041995-08-04 04:20:48 +000085 int argc;
86 char **argv;
87{
88 int c;
89 int sts;
90 char *command = NULL;
91 char *filename = NULL;
92 FILE *fp = stdin;
93 char *p;
94 int inspect = 0;
95 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +000096 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +000097 int stdin_is_interactive = 0;
Guido van Rossum667d7041995-08-04 04:20:48 +000098
Guido van Rossumac56b031996-07-21 02:33:38 +000099 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000100 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000101
Guido van Rossum667d7041995-08-04 04:20:48 +0000102 if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
103 inspect = 1;
104 if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
105 unbuffered = 1;
106
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000107 while ((c = getopt(argc, argv, "c:diOStuUvxX")) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000108 if (c == 'c') {
109 /* -c is the last option; following arguments
110 that look like options are left for the
111 the command to interpret. */
112 command = malloc(strlen(optarg) + 2);
113 if (command == NULL)
114 Py_FatalError(
115 "not enough memory to copy -c argument");
116 strcpy(command, optarg);
117 strcat(command, "\n");
118 break;
119 }
120
121 switch (c) {
122
123 case 'd':
124 Py_DebugFlag++;
125 break;
126
127 case 'i':
128 inspect++;
Guido van Rossum775af911997-02-14 19:50:32 +0000129 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000130 break;
131
Guido van Rossum7614da61997-03-03 19:14:45 +0000132 case 'O':
133 Py_OptimizeFlag++;
134 break;
135
Guido van Rossum7922bd71997-08-29 22:34:47 +0000136 case 'S':
137 Py_NoSiteFlag++;
138 break;
139
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000140 case 't':
141 Py_TabcheckFlag++;
142 break;
143
Guido van Rossum667d7041995-08-04 04:20:48 +0000144 case 'u':
145 unbuffered++;
146 break;
147
148 case 'v':
149 Py_VerboseFlag++;
150 break;
151
Guido van Rossuma075ce11997-12-05 21:56:45 +0000152 case 'x':
153 skipfirstline = 1;
154 break;
155
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000156 case 'U':
157 Py_UnicodeFlag++;
158 break;
159
Guido van Rossum667d7041995-08-04 04:20:48 +0000160 /* This space reserved for other options */
161
162 default:
163 fprintf(stderr, usage_line, argv[0]);
164 fprintf(stderr, usage_top);
Guido van Rossum7922bd71997-08-29 22:34:47 +0000165 fprintf(stderr, usage_mid);
Guido van Rossuma075ce11997-12-05 21:56:45 +0000166 fprintf(stderr, usage_bot,
167 DELIM, DELIM, PYTHONHOMEHELP);
Guido van Rossum667d7041995-08-04 04:20:48 +0000168 exit(2);
169 /*NOTREACHED*/
170
171 }
172 }
173
Guido van Rossum775af911997-02-14 19:50:32 +0000174 if (command == NULL && optind < argc &&
175 strcmp(argv[optind], "-") != 0)
176 {
177 filename = argv[optind];
178 if (filename != NULL) {
179 if ((fp = fopen(filename, "r")) == NULL) {
180 fprintf(stderr, "%s: can't open file '%s'\n",
181 argv[0], filename);
182 exit(2);
183 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000184 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000185 int ch;
186 /* Push back first newline so line numbers
187 remain the same */
188 while ((ch = getc(fp)) != EOF) {
189 if (ch == '\n') {
190 (void)ungetc(ch, fp);
191 break;
192 }
193 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000194 }
Guido van Rossum775af911997-02-14 19:50:32 +0000195 }
196 }
197
198 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
199
Guido van Rossum667d7041995-08-04 04:20:48 +0000200 if (unbuffered) {
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000201#ifdef MS_WINDOWS
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000202 _setmode(fileno(stdin), O_BINARY);
203 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000204#endif
Guido van Rossum667d7041995-08-04 04:20:48 +0000205#ifndef MPW
Guido van Rossum22ffac11998-03-06 15:30:39 +0000206#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000207 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
208 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
209 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000210#else /* !HAVE_SETVBUF */
211 setbuf(stdin, (char *)NULL);
212 setbuf(stdout, (char *)NULL);
213 setbuf(stderr, (char *)NULL);
214#endif /* !HAVE_SETVBUF */
215#else /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000216 /* On MPW (3.2) unbuffered seems to hang */
Guido van Rossum775af911997-02-14 19:50:32 +0000217 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum667d7041995-08-04 04:20:48 +0000218 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
219 setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000220#endif /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000221 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000222 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000223#ifdef MS_WINDOWS
224 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000225 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000226 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000227#else /* !MS_WINDOWS */
228#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000229 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
230 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000231#endif /* HAVE_SETVBUF */
232#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000233 /* Leave stderr alone - it should be unbuffered anyway. */
234 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000235
Guido van Rossumed52aac1997-07-19 19:20:32 +0000236 Py_SetProgramName(argv[0]);
237 Py_Initialize();
238
Guido van Rossum667d7041995-08-04 04:20:48 +0000239 if (Py_VerboseFlag ||
Guido van Rossum129e91a1997-02-14 21:00:50 +0000240 (command == NULL && filename == NULL && stdin_is_interactive))
Guido van Rossumfe4dfc71997-05-19 18:33:01 +0000241 fprintf(stderr, "Python %s on %s\n%s\n",
242 Py_GetVersion(), Py_GetPlatform(), Py_GetCopyright());
Guido van Rossum667d7041995-08-04 04:20:48 +0000243
Guido van Rossum667d7041995-08-04 04:20:48 +0000244
245 if (command != NULL) {
246 /* Backup optind and force sys.argv[0] = '-c' */
247 optind--;
248 argv[optind] = "-c";
249 }
250
251 PySys_SetArgv(argc-optind, argv+optind);
252
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000253 if ((inspect || (command == NULL && filename == NULL)) &&
254 isatty(fileno(stdin))) {
255 PyObject *v;
256 v = PyImport_ImportModule("readline");
257 if (v == NULL)
258 PyErr_Clear();
259 else
260 Py_DECREF(v);
261 }
262
Guido van Rossum667d7041995-08-04 04:20:48 +0000263 if (command) {
264 sts = PyRun_SimpleString(command) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000265 free(command);
Guido van Rossum667d7041995-08-04 04:20:48 +0000266 }
267 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000268 if (filename == NULL && stdin_is_interactive) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000269 char *startup = getenv("PYTHONSTARTUP");
270 if (startup != NULL && startup[0] != '\0') {
271 FILE *fp = fopen(startup, "r");
272 if (fp != NULL) {
273 (void) PyRun_SimpleFile(fp, startup);
274 PyErr_Clear();
275 fclose(fp);
276 }
277 }
278 }
279 sts = PyRun_AnyFile(
Guido van Rossum775af911997-02-14 19:50:32 +0000280 fp,
281 filename == NULL ? "<stdin>" : filename) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000282 if (filename != NULL)
283 fclose(fp);
284 }
285
Guido van Rossum775af911997-02-14 19:50:32 +0000286 if (inspect && stdin_is_interactive &&
Guido van Rossum667d7041995-08-04 04:20:48 +0000287 (filename != NULL || command != NULL))
288 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
289
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000290 Py_Finalize();
Guido van Rossum05f7c501997-08-02 03:00:42 +0000291 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000292}
293
294
Guido van Rossum667d7041995-08-04 04:20:48 +0000295/* Make the *original* argc/argv available to other modules.
296 This is rare, but it is needed by the secureware extension. */
297
298void
Guido van Rossumac56b031996-07-21 02:33:38 +0000299Py_GetArgcArgv(argc, argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000300 int *argc;
301 char ***argv;
302{
303 *argc = orig_argc;
304 *argv = orig_argv;
305}