blob: e680ed49759c51d2512e8c53173f3ac2cb552480 [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 Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum667d7041995-08-04 04:20:48 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum667d7041995-08-04 04:20:48 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum667d7041995-08-04 04:20:48 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum667d7041995-08-04 04:20:48 +000029
30******************************************************************/
31
32/* Python interpreter main program */
33
34#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +000035#include "osdefs.h"
Guido van Rossum667d7041995-08-04 04:20:48 +000036
Guido van Rossum66a70131996-12-09 18:46:58 +000037#ifdef HAVE_UNISTD_H
38#include <unistd.h>
39#endif
Guido van Rossum667d7041995-08-04 04:20:48 +000040
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000041#ifdef MS_WINDOWS
42#include <fcntl.h>
43#endif
44
Guido van Rossuma075ce11997-12-05 21:56:45 +000045#if defined(PYOS_OS2) || defined(MS_WINDOWS)
46#define PYTHONHOMEHELP "<prefix>\\lib"
47#else
48#define PYTHONHOMEHELP "<prefix>/python1.5"
49#endif
50
Guido van Rossum667d7041995-08-04 04:20:48 +000051/* Interface to getopt(): */
52extern int optind;
53extern char *optarg;
54extern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */
55
56
Guido van Rossumac56b031996-07-21 02:33:38 +000057/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum667d7041995-08-04 04:20:48 +000058static char **orig_argv;
59static int orig_argc;
60
Guido van Rossum667d7041995-08-04 04:20:48 +000061/* Short usage message (with %s for argv0) */
62static char *usage_line =
Guido van Rossum6b86a421999-01-28 15:07:47 +000063"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000064
65/* Long usage message, split into parts < 512 bytes */
Guido van Rossuma075ce11997-12-05 21:56:45 +000066static char *usage_top = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000067Options and arguments (and corresponding environment variables):\n\
68-d : debug output from parser (also PYTHONDEBUG=x)\n\
Guido van Rossum775af911997-02-14 19:50:32 +000069-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000070 and force prompts, even if stdin does not appear to be a terminal\n\
Guido van Rossume7adf3e1998-10-07 14:50:06 +000071-O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000072-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000073-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000074-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000075";
Guido van Rossum7922bd71997-08-29 22:34:47 +000076static char *usage_mid = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000077-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossumc15a9a12000-05-01 17:54:33 +000078-U : Unicode literals: treats '...' literals like u'...'\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000079-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000080-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Guido van Rossum775af911997-02-14 19:50:32 +000081-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000082file : program read from script file\n\
83- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000084";
85static char *usage_bot = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000086arg ...: arguments passed to program in sys.argv[1:]\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000087Other environment variables:\n\
88PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000089PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000090 default module search path. The result is sys.path.\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000091PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
92 The default module search path uses %s.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000093";
94
95
96/* Main program */
97
Guido van Rossum9c1201f1998-12-07 14:28:47 +000098DL_EXPORT(int)
Guido van Rossumed52aac1997-07-19 19:20:32 +000099Py_Main(argc, argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000100 int argc;
101 char **argv;
102{
103 int c;
104 int sts;
105 char *command = NULL;
106 char *filename = NULL;
107 FILE *fp = stdin;
108 char *p;
109 int inspect = 0;
110 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +0000111 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +0000112 int stdin_is_interactive = 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000113
Guido van Rossumac56b031996-07-21 02:33:38 +0000114 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +0000115 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +0000116
Guido van Rossum667d7041995-08-04 04:20:48 +0000117 if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
118 inspect = 1;
119 if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
120 unbuffered = 1;
121
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000122 while ((c = getopt(argc, argv, "c:diOStuUvxX")) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000123 if (c == 'c') {
124 /* -c is the last option; following arguments
125 that look like options are left for the
126 the command to interpret. */
127 command = malloc(strlen(optarg) + 2);
128 if (command == NULL)
129 Py_FatalError(
130 "not enough memory to copy -c argument");
131 strcpy(command, optarg);
132 strcat(command, "\n");
133 break;
134 }
135
136 switch (c) {
137
138 case 'd':
139 Py_DebugFlag++;
140 break;
141
142 case 'i':
143 inspect++;
Guido van Rossum775af911997-02-14 19:50:32 +0000144 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000145 break;
146
Guido van Rossum7614da61997-03-03 19:14:45 +0000147 case 'O':
148 Py_OptimizeFlag++;
149 break;
150
Guido van Rossum7922bd71997-08-29 22:34:47 +0000151 case 'S':
152 Py_NoSiteFlag++;
153 break;
154
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000155 case 't':
156 Py_TabcheckFlag++;
157 break;
158
Guido van Rossum667d7041995-08-04 04:20:48 +0000159 case 'u':
160 unbuffered++;
161 break;
162
163 case 'v':
164 Py_VerboseFlag++;
165 break;
166
Guido van Rossuma075ce11997-12-05 21:56:45 +0000167 case 'x':
168 skipfirstline = 1;
169 break;
170
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000171 case 'U':
172 Py_UnicodeFlag++;
173 break;
174
Guido van Rossum667d7041995-08-04 04:20:48 +0000175 /* This space reserved for other options */
176
177 default:
178 fprintf(stderr, usage_line, argv[0]);
179 fprintf(stderr, usage_top);
Guido van Rossum7922bd71997-08-29 22:34:47 +0000180 fprintf(stderr, usage_mid);
Guido van Rossuma075ce11997-12-05 21:56:45 +0000181 fprintf(stderr, usage_bot,
182 DELIM, DELIM, PYTHONHOMEHELP);
Guido van Rossum667d7041995-08-04 04:20:48 +0000183 exit(2);
184 /*NOTREACHED*/
185
186 }
187 }
188
Guido van Rossum775af911997-02-14 19:50:32 +0000189 if (command == NULL && optind < argc &&
190 strcmp(argv[optind], "-") != 0)
191 {
192 filename = argv[optind];
193 if (filename != NULL) {
194 if ((fp = fopen(filename, "r")) == NULL) {
195 fprintf(stderr, "%s: can't open file '%s'\n",
196 argv[0], filename);
197 exit(2);
198 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000199 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000200 int ch;
201 /* Push back first newline so line numbers
202 remain the same */
203 while ((ch = getc(fp)) != EOF) {
204 if (ch == '\n') {
205 (void)ungetc(ch, fp);
206 break;
207 }
208 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000209 }
Guido van Rossum775af911997-02-14 19:50:32 +0000210 }
211 }
212
213 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
214
Guido van Rossum667d7041995-08-04 04:20:48 +0000215 if (unbuffered) {
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000216#ifdef MS_WINDOWS
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000217 _setmode(fileno(stdin), O_BINARY);
218 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000219#endif
Guido van Rossum667d7041995-08-04 04:20:48 +0000220#ifndef MPW
Guido van Rossum22ffac11998-03-06 15:30:39 +0000221#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000222 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
223 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
224 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000225#else /* !HAVE_SETVBUF */
226 setbuf(stdin, (char *)NULL);
227 setbuf(stdout, (char *)NULL);
228 setbuf(stderr, (char *)NULL);
229#endif /* !HAVE_SETVBUF */
230#else /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000231 /* On MPW (3.2) unbuffered seems to hang */
Guido van Rossum775af911997-02-14 19:50:32 +0000232 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum667d7041995-08-04 04:20:48 +0000233 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
234 setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000235#endif /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000236 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000237 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000238#ifdef MS_WINDOWS
239 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000240 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000241 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000242#else /* !MS_WINDOWS */
243#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000244 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
245 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000246#endif /* HAVE_SETVBUF */
247#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000248 /* Leave stderr alone - it should be unbuffered anyway. */
249 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000250
Guido van Rossumed52aac1997-07-19 19:20:32 +0000251 Py_SetProgramName(argv[0]);
252 Py_Initialize();
253
Guido van Rossum667d7041995-08-04 04:20:48 +0000254 if (Py_VerboseFlag ||
Guido van Rossum129e91a1997-02-14 21:00:50 +0000255 (command == NULL && filename == NULL && stdin_is_interactive))
Guido van Rossumfe4dfc71997-05-19 18:33:01 +0000256 fprintf(stderr, "Python %s on %s\n%s\n",
257 Py_GetVersion(), Py_GetPlatform(), Py_GetCopyright());
Guido van Rossum667d7041995-08-04 04:20:48 +0000258
Guido van Rossum667d7041995-08-04 04:20:48 +0000259
260 if (command != NULL) {
261 /* Backup optind and force sys.argv[0] = '-c' */
262 optind--;
263 argv[optind] = "-c";
264 }
265
266 PySys_SetArgv(argc-optind, argv+optind);
267
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000268 if ((inspect || (command == NULL && filename == NULL)) &&
269 isatty(fileno(stdin))) {
270 PyObject *v;
271 v = PyImport_ImportModule("readline");
272 if (v == NULL)
273 PyErr_Clear();
274 else
275 Py_DECREF(v);
276 }
277
Guido van Rossum667d7041995-08-04 04:20:48 +0000278 if (command) {
279 sts = PyRun_SimpleString(command) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000280 free(command);
Guido van Rossum667d7041995-08-04 04:20:48 +0000281 }
282 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000283 if (filename == NULL && stdin_is_interactive) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000284 char *startup = getenv("PYTHONSTARTUP");
285 if (startup != NULL && startup[0] != '\0') {
286 FILE *fp = fopen(startup, "r");
287 if (fp != NULL) {
288 (void) PyRun_SimpleFile(fp, startup);
289 PyErr_Clear();
290 fclose(fp);
291 }
292 }
293 }
294 sts = PyRun_AnyFile(
Guido van Rossum775af911997-02-14 19:50:32 +0000295 fp,
296 filename == NULL ? "<stdin>" : filename) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000297 if (filename != NULL)
298 fclose(fp);
299 }
300
Guido van Rossum775af911997-02-14 19:50:32 +0000301 if (inspect && stdin_is_interactive &&
Guido van Rossum667d7041995-08-04 04:20:48 +0000302 (filename != NULL || command != NULL))
303 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
304
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000305 Py_Finalize();
Guido van Rossum05f7c501997-08-02 03:00:42 +0000306 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000307}
308
309
Guido van Rossum667d7041995-08-04 04:20:48 +0000310/* Make the *original* argc/argv available to other modules.
311 This is rare, but it is needed by the secureware extension. */
312
313void
Guido van Rossumac56b031996-07-21 02:33:38 +0000314Py_GetArgcArgv(argc, argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000315 int *argc;
316 char ***argv;
317{
318 *argc = orig_argc;
319 *argv = orig_argv;
320}