blob: 90a3961fef87fa48db80a81e5d08c1a21170dfd0 [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum667d7041995-08-04 04:20:48 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum667d7041995-08-04 04:20:48 +00009******************************************************************/
10
11/* Python interpreter main program */
12
13#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +000014#include "osdefs.h"
Guido van Rossum667d7041995-08-04 04:20:48 +000015
Guido van Rossum66a70131996-12-09 18:46:58 +000016#ifdef HAVE_UNISTD_H
17#include <unistd.h>
18#endif
Guido van Rossum667d7041995-08-04 04:20:48 +000019
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000020#ifdef MS_WINDOWS
21#include <fcntl.h>
22#endif
23
Guido van Rossuma075ce11997-12-05 21:56:45 +000024#if defined(PYOS_OS2) || defined(MS_WINDOWS)
25#define PYTHONHOMEHELP "<prefix>\\lib"
26#else
27#define PYTHONHOMEHELP "<prefix>/python1.5"
28#endif
29
Guido van Rossum667d7041995-08-04 04:20:48 +000030/* Interface to getopt(): */
31extern int optind;
32extern char *optarg;
33extern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */
34
35
Guido van Rossumac56b031996-07-21 02:33:38 +000036/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum667d7041995-08-04 04:20:48 +000037static char **orig_argv;
38static int orig_argc;
39
Guido van Rossum667d7041995-08-04 04:20:48 +000040/* Short usage message (with %s for argv0) */
41static char *usage_line =
Guido van Rossum6b86a421999-01-28 15:07:47 +000042"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000043
44/* Long usage message, split into parts < 512 bytes */
Guido van Rossuma075ce11997-12-05 21:56:45 +000045static char *usage_top = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000046Options and arguments (and corresponding environment variables):\n\
47-d : debug output from parser (also PYTHONDEBUG=x)\n\
Guido van Rossum775af911997-02-14 19:50:32 +000048-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000049 and force prompts, even if stdin does not appear to be a terminal\n\
Guido van Rossume7adf3e1998-10-07 14:50:06 +000050-O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000051-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000052-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000053-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000054";
Guido van Rossum7922bd71997-08-29 22:34:47 +000055static char *usage_mid = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000056-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossumc15a9a12000-05-01 17:54:33 +000057-U : Unicode literals: treats '...' literals like u'...'\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000058-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000059-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Guido van Rossum775af911997-02-14 19:50:32 +000060-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000061file : program read from script file\n\
62- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000063";
64static char *usage_bot = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000065arg ...: arguments passed to program in sys.argv[1:]\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000066Other environment variables:\n\
67PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000068PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000069 default module search path. The result is sys.path.\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000070PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
71 The default module search path uses %s.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000072";
73
74
75/* Main program */
76
Guido van Rossum9c1201f1998-12-07 14:28:47 +000077DL_EXPORT(int)
Guido van Rossumed52aac1997-07-19 19:20:32 +000078Py_Main(argc, argv)
Guido van Rossum667d7041995-08-04 04:20:48 +000079 int argc;
80 char **argv;
81{
82 int c;
83 int sts;
84 char *command = NULL;
85 char *filename = NULL;
86 FILE *fp = stdin;
87 char *p;
88 int inspect = 0;
89 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +000090 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +000091 int stdin_is_interactive = 0;
Guido van Rossum667d7041995-08-04 04:20:48 +000092
Guido van Rossumac56b031996-07-21 02:33:38 +000093 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +000094 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000095
Guido van Rossum667d7041995-08-04 04:20:48 +000096 if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
97 inspect = 1;
98 if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
99 unbuffered = 1;
100
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000101 while ((c = getopt(argc, argv, "c:diOStuUvxX")) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000102 if (c == 'c') {
103 /* -c is the last option; following arguments
104 that look like options are left for the
105 the command to interpret. */
106 command = malloc(strlen(optarg) + 2);
107 if (command == NULL)
108 Py_FatalError(
109 "not enough memory to copy -c argument");
110 strcpy(command, optarg);
111 strcat(command, "\n");
112 break;
113 }
114
115 switch (c) {
116
117 case 'd':
118 Py_DebugFlag++;
119 break;
120
121 case 'i':
122 inspect++;
Guido van Rossum775af911997-02-14 19:50:32 +0000123 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000124 break;
125
Guido van Rossum7614da61997-03-03 19:14:45 +0000126 case 'O':
127 Py_OptimizeFlag++;
128 break;
129
Guido van Rossum7922bd71997-08-29 22:34:47 +0000130 case 'S':
131 Py_NoSiteFlag++;
132 break;
133
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000134 case 't':
135 Py_TabcheckFlag++;
136 break;
137
Guido van Rossum667d7041995-08-04 04:20:48 +0000138 case 'u':
139 unbuffered++;
140 break;
141
142 case 'v':
143 Py_VerboseFlag++;
144 break;
145
Guido van Rossuma075ce11997-12-05 21:56:45 +0000146 case 'x':
147 skipfirstline = 1;
148 break;
149
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000150 case 'U':
151 Py_UnicodeFlag++;
152 break;
153
Guido van Rossum667d7041995-08-04 04:20:48 +0000154 /* This space reserved for other options */
155
156 default:
157 fprintf(stderr, usage_line, argv[0]);
158 fprintf(stderr, usage_top);
Guido van Rossum7922bd71997-08-29 22:34:47 +0000159 fprintf(stderr, usage_mid);
Guido van Rossuma075ce11997-12-05 21:56:45 +0000160 fprintf(stderr, usage_bot,
161 DELIM, DELIM, PYTHONHOMEHELP);
Guido van Rossum667d7041995-08-04 04:20:48 +0000162 exit(2);
163 /*NOTREACHED*/
164
165 }
166 }
167
Guido van Rossum775af911997-02-14 19:50:32 +0000168 if (command == NULL && optind < argc &&
169 strcmp(argv[optind], "-") != 0)
170 {
171 filename = argv[optind];
172 if (filename != NULL) {
173 if ((fp = fopen(filename, "r")) == NULL) {
174 fprintf(stderr, "%s: can't open file '%s'\n",
175 argv[0], filename);
176 exit(2);
177 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000178 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000179 int ch;
180 /* Push back first newline so line numbers
181 remain the same */
182 while ((ch = getc(fp)) != EOF) {
183 if (ch == '\n') {
184 (void)ungetc(ch, fp);
185 break;
186 }
187 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000188 }
Guido van Rossum775af911997-02-14 19:50:32 +0000189 }
190 }
191
192 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
193
Guido van Rossum667d7041995-08-04 04:20:48 +0000194 if (unbuffered) {
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000195#ifdef MS_WINDOWS
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000196 _setmode(fileno(stdin), O_BINARY);
197 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000198#endif
Guido van Rossum667d7041995-08-04 04:20:48 +0000199#ifndef MPW
Guido van Rossum22ffac11998-03-06 15:30:39 +0000200#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000201 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
202 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
203 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000204#else /* !HAVE_SETVBUF */
205 setbuf(stdin, (char *)NULL);
206 setbuf(stdout, (char *)NULL);
207 setbuf(stderr, (char *)NULL);
208#endif /* !HAVE_SETVBUF */
209#else /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000210 /* On MPW (3.2) unbuffered seems to hang */
Guido van Rossum775af911997-02-14 19:50:32 +0000211 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum667d7041995-08-04 04:20:48 +0000212 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
213 setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000214#endif /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000215 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000216 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000217#ifdef MS_WINDOWS
218 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000219 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000220 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000221#else /* !MS_WINDOWS */
222#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000223 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
224 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000225#endif /* HAVE_SETVBUF */
226#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000227 /* Leave stderr alone - it should be unbuffered anyway. */
228 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000229
Guido van Rossumed52aac1997-07-19 19:20:32 +0000230 Py_SetProgramName(argv[0]);
231 Py_Initialize();
232
Guido van Rossum667d7041995-08-04 04:20:48 +0000233 if (Py_VerboseFlag ||
Guido van Rossum129e91a1997-02-14 21:00:50 +0000234 (command == NULL && filename == NULL && stdin_is_interactive))
Guido van Rossumfe4dfc71997-05-19 18:33:01 +0000235 fprintf(stderr, "Python %s on %s\n%s\n",
236 Py_GetVersion(), Py_GetPlatform(), Py_GetCopyright());
Guido van Rossum667d7041995-08-04 04:20:48 +0000237
Guido van Rossum667d7041995-08-04 04:20:48 +0000238
239 if (command != NULL) {
240 /* Backup optind and force sys.argv[0] = '-c' */
241 optind--;
242 argv[optind] = "-c";
243 }
244
245 PySys_SetArgv(argc-optind, argv+optind);
246
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000247 if ((inspect || (command == NULL && filename == NULL)) &&
248 isatty(fileno(stdin))) {
249 PyObject *v;
250 v = PyImport_ImportModule("readline");
251 if (v == NULL)
252 PyErr_Clear();
253 else
254 Py_DECREF(v);
255 }
256
Guido van Rossum667d7041995-08-04 04:20:48 +0000257 if (command) {
258 sts = PyRun_SimpleString(command) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000259 free(command);
Guido van Rossum667d7041995-08-04 04:20:48 +0000260 }
261 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000262 if (filename == NULL && stdin_is_interactive) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000263 char *startup = getenv("PYTHONSTARTUP");
264 if (startup != NULL && startup[0] != '\0') {
265 FILE *fp = fopen(startup, "r");
266 if (fp != NULL) {
267 (void) PyRun_SimpleFile(fp, startup);
268 PyErr_Clear();
269 fclose(fp);
270 }
271 }
272 }
273 sts = PyRun_AnyFile(
Guido van Rossum775af911997-02-14 19:50:32 +0000274 fp,
275 filename == NULL ? "<stdin>" : filename) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000276 if (filename != NULL)
277 fclose(fp);
278 }
279
Guido van Rossum775af911997-02-14 19:50:32 +0000280 if (inspect && stdin_is_interactive &&
Guido van Rossum667d7041995-08-04 04:20:48 +0000281 (filename != NULL || command != NULL))
282 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
283
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000284 Py_Finalize();
Guido van Rossum05f7c501997-08-02 03:00:42 +0000285 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000286}
287
288
Guido van Rossum667d7041995-08-04 04:20:48 +0000289/* Make the *original* argc/argv available to other modules.
290 This is rare, but it is needed by the secureware extension. */
291
292void
Guido van Rossumac56b031996-07-21 02:33:38 +0000293Py_GetArgcArgv(argc, argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000294 int *argc;
295 char ***argv;
296{
297 *argc = orig_argc;
298 *argv = orig_argv;
299}