blob: fa316cff1b097dfce09f248cb8ef65f842fbcab0 [file] [log] [blame]
Guido van Rossum667d7041995-08-04 04:20:48 +00001
2/* Python interpreter main program */
3
4#include "Python.h"
Guido van Rossuma075ce11997-12-05 21:56:45 +00005#include "osdefs.h"
Guido van Rossum667d7041995-08-04 04:20:48 +00006
Guido van Rossum66a70131996-12-09 18:46:58 +00007#ifdef HAVE_UNISTD_H
8#include <unistd.h>
9#endif
Guido van Rossum667d7041995-08-04 04:20:48 +000010
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +000011#ifdef MS_WINDOWS
12#include <fcntl.h>
13#endif
14
Guido van Rossuma075ce11997-12-05 21:56:45 +000015#if defined(PYOS_OS2) || defined(MS_WINDOWS)
16#define PYTHONHOMEHELP "<prefix>\\lib"
17#else
Fredrik Lundh620f3772000-07-09 20:42:34 +000018#define PYTHONHOMEHELP "<prefix>/python2.0"
Guido van Rossuma075ce11997-12-05 21:56:45 +000019#endif
20
Guido van Rossuma22865e2000-09-05 04:41:18 +000021#define COPYRIGHT \
22 "Type \"copyright\", \"credits\" or \"license\" for more information."
23
Guido van Rossum667d7041995-08-04 04:20:48 +000024/* Interface to getopt(): */
25extern int optind;
26extern char *optarg;
27extern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */
28
29
Guido van Rossumac56b031996-07-21 02:33:38 +000030/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum667d7041995-08-04 04:20:48 +000031static char **orig_argv;
32static int orig_argc;
33
Guido van Rossum667d7041995-08-04 04:20:48 +000034/* Short usage message (with %s for argv0) */
35static char *usage_line =
Guido van Rossum6b86a421999-01-28 15:07:47 +000036"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
Guido van Rossum667d7041995-08-04 04:20:48 +000037
38/* Long usage message, split into parts < 512 bytes */
Guido van Rossuma075ce11997-12-05 21:56:45 +000039static char *usage_top = "\
Guido van Rossum667d7041995-08-04 04:20:48 +000040Options and arguments (and corresponding environment variables):\n\
41-d : debug output from parser (also PYTHONDEBUG=x)\n\
Guido van Rossum775af911997-02-14 19:50:32 +000042-i : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000043 and force prompts, even if stdin does not appear to be a terminal\n\
Guido van Rossume7adf3e1998-10-07 14:50:06 +000044-O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
Guido van Rossum6b86a421999-01-28 15:07:47 +000045-OO : remove doc-strings in addition to the -O optimizations\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000046-S : don't imply 'import site' on initialization\n\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000047-t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000048";
Guido van Rossum7922bd71997-08-29 22:34:47 +000049static char *usage_mid = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000050-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossumc15a9a12000-05-01 17:54:33 +000051-U : Unicode literals: treats '...' literals like u'...'\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000052-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000053-x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
Guido van Rossum775af911997-02-14 19:50:32 +000054-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000055file : program read from script file\n\
56- : program read from stdin (default; interactive mode if a tty)\n\
Guido van Rossum7922bd71997-08-29 22:34:47 +000057";
58static char *usage_bot = "\
Guido van Rossumbba92ca1998-04-10 19:39:15 +000059arg ...: arguments passed to program in sys.argv[1:]\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000060Other environment variables:\n\
61PYTHONSTARTUP: file executed on interactive startup (no default)\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000062PYTHONPATH : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000063 default module search path. The result is sys.path.\n\
Guido van Rossuma075ce11997-12-05 21:56:45 +000064PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
65 The default module search path uses %s.\n\
Guido van Rossum667d7041995-08-04 04:20:48 +000066";
67
68
69/* Main program */
70
Guido van Rossum9c1201f1998-12-07 14:28:47 +000071DL_EXPORT(int)
Fredrik Lundh620f3772000-07-09 20:42:34 +000072Py_Main(int argc, char **argv)
Guido van Rossum667d7041995-08-04 04:20:48 +000073{
74 int c;
75 int sts;
76 char *command = NULL;
77 char *filename = NULL;
78 FILE *fp = stdin;
79 char *p;
80 int inspect = 0;
81 int unbuffered = 0;
Guido van Rossuma075ce11997-12-05 21:56:45 +000082 int skipfirstline = 0;
Guido van Rossum775af911997-02-14 19:50:32 +000083 int stdin_is_interactive = 0;
Guido van Rossum667d7041995-08-04 04:20:48 +000084
Guido van Rossumac56b031996-07-21 02:33:38 +000085 orig_argc = argc; /* For Py_GetArgcArgv() */
Guido van Rossum667d7041995-08-04 04:20:48 +000086 orig_argv = argv;
Guido van Rossum667d7041995-08-04 04:20:48 +000087
Guido van Rossum667d7041995-08-04 04:20:48 +000088 if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
89 inspect = 1;
90 if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
91 unbuffered = 1;
92
Guido van Rossumc15a9a12000-05-01 17:54:33 +000093 while ((c = getopt(argc, argv, "c:diOStuUvxX")) != EOF) {
Guido van Rossum667d7041995-08-04 04:20:48 +000094 if (c == 'c') {
95 /* -c is the last option; following arguments
96 that look like options are left for the
97 the command to interpret. */
98 command = malloc(strlen(optarg) + 2);
99 if (command == NULL)
100 Py_FatalError(
101 "not enough memory to copy -c argument");
102 strcpy(command, optarg);
103 strcat(command, "\n");
104 break;
105 }
106
107 switch (c) {
108
109 case 'd':
110 Py_DebugFlag++;
111 break;
112
113 case 'i':
114 inspect++;
Guido van Rossum775af911997-02-14 19:50:32 +0000115 Py_InteractiveFlag++;
Guido van Rossum667d7041995-08-04 04:20:48 +0000116 break;
117
Guido van Rossum7614da61997-03-03 19:14:45 +0000118 case 'O':
119 Py_OptimizeFlag++;
120 break;
121
Guido van Rossum7922bd71997-08-29 22:34:47 +0000122 case 'S':
123 Py_NoSiteFlag++;
124 break;
125
Guido van Rossumbba92ca1998-04-10 19:39:15 +0000126 case 't':
127 Py_TabcheckFlag++;
128 break;
129
Guido van Rossum667d7041995-08-04 04:20:48 +0000130 case 'u':
131 unbuffered++;
132 break;
133
134 case 'v':
135 Py_VerboseFlag++;
136 break;
137
Guido van Rossuma075ce11997-12-05 21:56:45 +0000138 case 'x':
139 skipfirstline = 1;
140 break;
141
Guido van Rossumc15a9a12000-05-01 17:54:33 +0000142 case 'U':
143 Py_UnicodeFlag++;
144 break;
145
Guido van Rossum667d7041995-08-04 04:20:48 +0000146 /* This space reserved for other options */
147
148 default:
149 fprintf(stderr, usage_line, argv[0]);
150 fprintf(stderr, usage_top);
Guido van Rossum7922bd71997-08-29 22:34:47 +0000151 fprintf(stderr, usage_mid);
Guido van Rossuma075ce11997-12-05 21:56:45 +0000152 fprintf(stderr, usage_bot,
153 DELIM, DELIM, PYTHONHOMEHELP);
Guido van Rossum667d7041995-08-04 04:20:48 +0000154 exit(2);
155 /*NOTREACHED*/
156
157 }
158 }
159
Guido van Rossum775af911997-02-14 19:50:32 +0000160 if (command == NULL && optind < argc &&
161 strcmp(argv[optind], "-") != 0)
162 {
163 filename = argv[optind];
164 if (filename != NULL) {
165 if ((fp = fopen(filename, "r")) == NULL) {
166 fprintf(stderr, "%s: can't open file '%s'\n",
167 argv[0], filename);
168 exit(2);
169 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000170 else if (skipfirstline) {
Guido van Rossumdc8b5691999-04-19 17:54:19 +0000171 int ch;
172 /* Push back first newline so line numbers
173 remain the same */
174 while ((ch = getc(fp)) != EOF) {
175 if (ch == '\n') {
176 (void)ungetc(ch, fp);
177 break;
178 }
179 }
Guido van Rossuma075ce11997-12-05 21:56:45 +0000180 }
Guido van Rossum775af911997-02-14 19:50:32 +0000181 }
182 }
183
184 stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
185
Guido van Rossum667d7041995-08-04 04:20:48 +0000186 if (unbuffered) {
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000187#ifdef MS_WINDOWS
Guido van Rossum3e7ae7a1997-01-17 22:05:38 +0000188 _setmode(fileno(stdin), O_BINARY);
189 _setmode(fileno(stdout), O_BINARY);
Guido van Rossumf22d7e21997-01-11 19:28:55 +0000190#endif
Guido van Rossum667d7041995-08-04 04:20:48 +0000191#ifndef MPW
Guido van Rossum22ffac11998-03-06 15:30:39 +0000192#ifdef HAVE_SETVBUF
Guido van Rossum775af911997-02-14 19:50:32 +0000193 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
194 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
195 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000196#else /* !HAVE_SETVBUF */
197 setbuf(stdin, (char *)NULL);
198 setbuf(stdout, (char *)NULL);
199 setbuf(stderr, (char *)NULL);
200#endif /* !HAVE_SETVBUF */
201#else /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000202 /* On MPW (3.2) unbuffered seems to hang */
Guido van Rossum775af911997-02-14 19:50:32 +0000203 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum667d7041995-08-04 04:20:48 +0000204 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
205 setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000206#endif /* MPW */
Guido van Rossum667d7041995-08-04 04:20:48 +0000207 }
Guido van Rossum2a212191997-04-11 21:57:53 +0000208 else if (Py_InteractiveFlag) {
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000209#ifdef MS_WINDOWS
210 /* Doesn't have to have line-buffered -- use unbuffered */
Guido van Rossum01b7ced1999-02-09 18:36:51 +0000211 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000212 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000213#else /* !MS_WINDOWS */
214#ifdef HAVE_SETVBUF
Guido van Rossumb31c7dc1997-04-11 22:19:12 +0000215 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
216 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum22ffac11998-03-06 15:30:39 +0000217#endif /* HAVE_SETVBUF */
218#endif /* !MS_WINDOWS */
Guido van Rossum775af911997-02-14 19:50:32 +0000219 /* Leave stderr alone - it should be unbuffered anyway. */
220 }
Guido van Rossum667d7041995-08-04 04:20:48 +0000221
Guido van Rossumed52aac1997-07-19 19:20:32 +0000222 Py_SetProgramName(argv[0]);
223 Py_Initialize();
224
Guido van Rossum667d7041995-08-04 04:20:48 +0000225 if (Py_VerboseFlag ||
Guido van Rossum129e91a1997-02-14 21:00:50 +0000226 (command == NULL && filename == NULL && stdin_is_interactive))
Guido van Rossumfe4dfc71997-05-19 18:33:01 +0000227 fprintf(stderr, "Python %s on %s\n%s\n",
Guido van Rossuma22865e2000-09-05 04:41:18 +0000228 Py_GetVersion(), Py_GetPlatform(), COPYRIGHT);
Guido van Rossum667d7041995-08-04 04:20:48 +0000229
Guido van Rossum667d7041995-08-04 04:20:48 +0000230
231 if (command != NULL) {
232 /* Backup optind and force sys.argv[0] = '-c' */
233 optind--;
234 argv[optind] = "-c";
235 }
236
237 PySys_SetArgv(argc-optind, argv+optind);
238
Guido van Rossum3d26cc91997-09-16 16:11:28 +0000239 if ((inspect || (command == NULL && filename == NULL)) &&
240 isatty(fileno(stdin))) {
241 PyObject *v;
242 v = PyImport_ImportModule("readline");
243 if (v == NULL)
244 PyErr_Clear();
245 else
246 Py_DECREF(v);
247 }
248
Guido van Rossum667d7041995-08-04 04:20:48 +0000249 if (command) {
250 sts = PyRun_SimpleString(command) != 0;
Guido van Rossum05f7c501997-08-02 03:00:42 +0000251 free(command);
Guido van Rossum667d7041995-08-04 04:20:48 +0000252 }
253 else {
Guido van Rossum775af911997-02-14 19:50:32 +0000254 if (filename == NULL && stdin_is_interactive) {
Guido van Rossum667d7041995-08-04 04:20:48 +0000255 char *startup = getenv("PYTHONSTARTUP");
256 if (startup != NULL && startup[0] != '\0') {
257 FILE *fp = fopen(startup, "r");
258 if (fp != NULL) {
259 (void) PyRun_SimpleFile(fp, startup);
260 PyErr_Clear();
261 fclose(fp);
262 }
263 }
264 }
Guido van Rossum0df002c2000-08-27 19:21:52 +0000265 sts = PyRun_AnyFileEx(
Guido van Rossum775af911997-02-14 19:50:32 +0000266 fp,
Guido van Rossum0df002c2000-08-27 19:21:52 +0000267 filename == NULL ? "<stdin>" : filename,
268 filename != NULL) != 0;
Guido van Rossum667d7041995-08-04 04:20:48 +0000269 }
270
Guido van Rossum775af911997-02-14 19:50:32 +0000271 if (inspect && stdin_is_interactive &&
Guido van Rossum667d7041995-08-04 04:20:48 +0000272 (filename != NULL || command != NULL))
273 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
274
Guido van Rossum5d1770e1997-08-05 02:23:48 +0000275 Py_Finalize();
Guido van Rossum05f7c501997-08-02 03:00:42 +0000276 return sts;
Guido van Rossum667d7041995-08-04 04:20:48 +0000277}
278
279
Guido van Rossum667d7041995-08-04 04:20:48 +0000280/* Make the *original* argc/argv available to other modules.
281 This is rare, but it is needed by the secureware extension. */
282
283void
Fredrik Lundh620f3772000-07-09 20:42:34 +0000284Py_GetArgcArgv(int *argc, char ***argv)
Guido van Rossum667d7041995-08-04 04:20:48 +0000285{
286 *argc = orig_argc;
287 *argv = orig_argv;
288}