Exceptions raised during renaming in rotating file handlers are now passed to handleE...
[python.git] / Modules / getpath.c
blob3264e246a41af6bed459fb52d3a6c61834657df1
1 /* Return the initial module search path. */
3 #include "Python.h"
4 #include "osdefs.h"
6 #include <sys/types.h>
7 #include <string.h>
9 #ifdef __APPLE__
10 #include <mach-o/dyld.h>
11 #endif
13 /* Search in some common locations for the associated Python libraries.
15 * Two directories must be found, the platform independent directory
16 * (prefix), containing the common .py and .pyc files, and the platform
17 * dependent directory (exec_prefix), containing the shared library
18 * modules. Note that prefix and exec_prefix can be the same directory,
19 * but for some installations, they are different.
21 * Py_GetPath() carries out separate searches for prefix and exec_prefix.
22 * Each search tries a number of different locations until a ``landmark''
23 * file or directory is found. If no prefix or exec_prefix is found, a
24 * warning message is issued and the preprocessor defined PREFIX and
25 * EXEC_PREFIX are used (even though they will not work); python carries on
26 * as best as is possible, but most imports will fail.
28 * Before any searches are done, the location of the executable is
29 * determined. If argv[0] has one or more slashs in it, it is used
30 * unchanged. Otherwise, it must have been invoked from the shell's path,
31 * so we search $PATH for the named executable and use that. If the
32 * executable was not found on $PATH (or there was no $PATH environment
33 * variable), the original argv[0] string is used.
35 * Next, the executable location is examined to see if it is a symbolic
36 * link. If so, the link is chased (correctly interpreting a relative
37 * pathname if one is found) and the directory of the link target is used.
39 * Finally, argv0_path is set to the directory containing the executable
40 * (i.e. the last component is stripped).
42 * With argv0_path in hand, we perform a number of steps. The same steps
43 * are performed for prefix and for exec_prefix, but with a different
44 * landmark.
46 * Step 1. Are we running python out of the build directory? This is
47 * checked by looking for a different kind of landmark relative to
48 * argv0_path. For prefix, the landmark's path is derived from the VPATH
49 * preprocessor variable (taking into account that its value is almost, but
50 * not quite, what we need). For exec_prefix, the landmark is
51 * Modules/Setup. If the landmark is found, we're done.
53 * For the remaining steps, the prefix landmark will always be
54 * lib/python$VERSION/os.py and the exec_prefix will always be
55 * lib/python$VERSION/lib-dynload, where $VERSION is Python's version
56 * number as supplied by the Makefile. Note that this means that no more
57 * build directory checking is performed; if the first step did not find
58 * the landmarks, the assumption is that python is running from an
59 * installed setup.
61 * Step 2. See if the $PYTHONHOME environment variable points to the
62 * installed location of the Python libraries. If $PYTHONHOME is set, then
63 * it points to prefix and exec_prefix. $PYTHONHOME can be a single
64 * directory, which is used for both, or the prefix and exec_prefix
65 * directories separated by a colon.
67 * Step 3. Try to find prefix and exec_prefix relative to argv0_path,
68 * backtracking up the path until it is exhausted. This is the most common
69 * step to succeed. Note that if prefix and exec_prefix are different,
70 * exec_prefix is more likely to be found; however if exec_prefix is a
71 * subdirectory of prefix, both will be found.
73 * Step 4. Search the directories pointed to by the preprocessor variables
74 * PREFIX and EXEC_PREFIX. These are supplied by the Makefile but can be
75 * passed in as options to the configure script.
77 * That's it!
79 * Well, almost. Once we have determined prefix and exec_prefix, the
80 * preprocessor variable PYTHONPATH is used to construct a path. Each
81 * relative path on PYTHONPATH is prefixed with prefix. Then the directory
82 * containing the shared library modules is appended. The environment
83 * variable $PYTHONPATH is inserted in front of it all. Finally, the
84 * prefix and exec_prefix globals are tweaked so they reflect the values
85 * expected by other code, by stripping the "lib/python$VERSION/..." stuff
86 * off. If either points to the build directory, the globals are reset to
87 * the corresponding preprocessor variables (so sys.prefix will reflect the
88 * installation location, even though sys.path points into the build
89 * directory). This seems to make more sense given that currently the only
90 * known use of sys.prefix and sys.exec_prefix is for the ILU installation
91 * process to find the installed Python tree.
94 #ifndef VERSION
95 #if defined(__VMS)
96 #define VERSION "2_1"
97 #else
98 #define VERSION "2.1"
99 #endif
100 #endif
102 #ifndef VPATH
103 #define VPATH "."
104 #endif
106 #ifndef PREFIX
107 #define PREFIX "/usr/local"
108 #endif
110 #ifndef EXEC_PREFIX
111 #define EXEC_PREFIX PREFIX
112 #endif
114 #ifndef PYTHONPATH
115 #define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
116 EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
117 #endif
119 #ifndef LANDMARK
120 #define LANDMARK "os.py"
121 #endif
123 static char prefix[MAXPATHLEN+1];
124 static char exec_prefix[MAXPATHLEN+1];
125 static char progpath[MAXPATHLEN+1];
126 static char *module_search_path = NULL;
127 static char lib_python[] = "lib/python" VERSION;
129 static void
130 reduce(char *dir)
132 size_t i = strlen(dir);
133 while (i > 0 && dir[i] != SEP)
134 --i;
135 dir[i] = '\0';
139 static int
140 isfile(char *filename) /* Is file, not directory */
142 struct stat buf;
143 if (stat(filename, &buf) != 0)
144 return 0;
145 if (!S_ISREG(buf.st_mode))
146 return 0;
147 return 1;
151 static int
152 ismodule(char *filename) /* Is module -- check for .pyc/.pyo too */
154 if (isfile(filename))
155 return 1;
157 /* Check for the compiled version of prefix. */
158 if (strlen(filename) < MAXPATHLEN) {
159 strcat(filename, Py_OptimizeFlag ? "o" : "c");
160 if (isfile(filename))
161 return 1;
163 return 0;
167 static int
168 isxfile(char *filename) /* Is executable file */
170 struct stat buf;
171 if (stat(filename, &buf) != 0)
172 return 0;
173 if (!S_ISREG(buf.st_mode))
174 return 0;
175 if ((buf.st_mode & 0111) == 0)
176 return 0;
177 return 1;
181 static int
182 isdir(char *filename) /* Is directory */
184 struct stat buf;
185 if (stat(filename, &buf) != 0)
186 return 0;
187 if (!S_ISDIR(buf.st_mode))
188 return 0;
189 return 1;
193 /* Add a path component, by appending stuff to buffer.
194 buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a
195 NUL-terminated string with no more than MAXPATHLEN characters (not counting
196 the trailing NUL). It's a fatal error if it contains a string longer than
197 that (callers must be careful!). If these requirements are met, it's
198 guaranteed that buffer will still be a NUL-terminated string with no more
199 than MAXPATHLEN characters at exit. If stuff is too long, only as much of
200 stuff as fits will be appended.
202 static void
203 joinpath(char *buffer, char *stuff)
205 size_t n, k;
206 if (stuff[0] == SEP)
207 n = 0;
208 else {
209 n = strlen(buffer);
210 if (n > 0 && buffer[n-1] != SEP && n < MAXPATHLEN)
211 buffer[n++] = SEP;
213 if (n > MAXPATHLEN)
214 Py_FatalError("buffer overflow in getpath.c's joinpath()");
215 k = strlen(stuff);
216 if (n + k > MAXPATHLEN)
217 k = MAXPATHLEN - n;
218 strncpy(buffer+n, stuff, k);
219 buffer[n+k] = '\0';
222 /* copy_absolute requires that path be allocated at least
223 MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */
224 static void
225 copy_absolute(char *path, char *p)
227 if (p[0] == SEP)
228 strcpy(path, p);
229 else {
230 getcwd(path, MAXPATHLEN);
231 if (p[0] == '.' && p[1] == SEP)
232 p += 2;
233 joinpath(path, p);
237 /* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */
238 static void
239 absolutize(char *path)
241 char buffer[MAXPATHLEN + 1];
243 if (path[0] == SEP)
244 return;
245 copy_absolute(buffer, path);
246 strcpy(path, buffer);
249 /* search_for_prefix requires that argv0_path be no more than MAXPATHLEN
250 bytes long.
252 static int
253 search_for_prefix(char *argv0_path, char *home)
255 size_t n;
256 char *vpath;
258 /* If PYTHONHOME is set, we believe it unconditionally */
259 if (home) {
260 char *delim;
261 strncpy(prefix, home, MAXPATHLEN);
262 delim = strchr(prefix, DELIM);
263 if (delim)
264 *delim = '\0';
265 joinpath(prefix, lib_python);
266 joinpath(prefix, LANDMARK);
267 return 1;
270 /* Check to see if argv[0] is in the build directory */
271 strcpy(prefix, argv0_path);
272 joinpath(prefix, "Modules/Setup");
273 if (isfile(prefix)) {
274 /* Check VPATH to see if argv0_path is in the build directory. */
275 vpath = VPATH;
276 strcpy(prefix, argv0_path);
277 joinpath(prefix, vpath);
278 joinpath(prefix, "Lib");
279 joinpath(prefix, LANDMARK);
280 if (ismodule(prefix))
281 return -1;
284 /* Search from argv0_path, until root is found */
285 copy_absolute(prefix, argv0_path);
286 do {
287 n = strlen(prefix);
288 joinpath(prefix, lib_python);
289 joinpath(prefix, LANDMARK);
290 if (ismodule(prefix))
291 return 1;
292 prefix[n] = '\0';
293 reduce(prefix);
294 } while (prefix[0]);
296 /* Look at configure's PREFIX */
297 strncpy(prefix, PREFIX, MAXPATHLEN);
298 joinpath(prefix, lib_python);
299 joinpath(prefix, LANDMARK);
300 if (ismodule(prefix))
301 return 1;
303 /* Fail */
304 return 0;
308 /* search_for_exec_prefix requires that argv0_path be no more than
309 MAXPATHLEN bytes long.
311 static int
312 search_for_exec_prefix(char *argv0_path, char *home)
314 size_t n;
316 /* If PYTHONHOME is set, we believe it unconditionally */
317 if (home) {
318 char *delim;
319 delim = strchr(home, DELIM);
320 if (delim)
321 strncpy(exec_prefix, delim+1, MAXPATHLEN);
322 else
323 strncpy(exec_prefix, home, MAXPATHLEN);
324 joinpath(exec_prefix, lib_python);
325 joinpath(exec_prefix, "lib-dynload");
326 return 1;
329 /* Check to see if argv[0] is in the build directory */
330 strcpy(exec_prefix, argv0_path);
331 joinpath(exec_prefix, "Modules/Setup");
332 if (isfile(exec_prefix)) {
333 reduce(exec_prefix);
334 return -1;
337 /* Search from argv0_path, until root is found */
338 copy_absolute(exec_prefix, argv0_path);
339 do {
340 n = strlen(exec_prefix);
341 joinpath(exec_prefix, lib_python);
342 joinpath(exec_prefix, "lib-dynload");
343 if (isdir(exec_prefix))
344 return 1;
345 exec_prefix[n] = '\0';
346 reduce(exec_prefix);
347 } while (exec_prefix[0]);
349 /* Look at configure's EXEC_PREFIX */
350 strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN);
351 joinpath(exec_prefix, lib_python);
352 joinpath(exec_prefix, "lib-dynload");
353 if (isdir(exec_prefix))
354 return 1;
356 /* Fail */
357 return 0;
361 static void
362 calculate_path(void)
364 extern char *Py_GetProgramName(void);
366 static char delimiter[2] = {DELIM, '\0'};
367 static char separator[2] = {SEP, '\0'};
368 char *pythonpath = PYTHONPATH;
369 char *rtpypath = Py_GETENV("PYTHONPATH");
370 char *home = Py_GetPythonHome();
371 char *path = getenv("PATH");
372 char *prog = Py_GetProgramName();
373 char argv0_path[MAXPATHLEN+1];
374 char zip_path[MAXPATHLEN+1];
375 int pfound, efound; /* 1 if found; -1 if found build directory */
376 char *buf;
377 size_t bufsz;
378 size_t prefixsz;
379 char *defpath = pythonpath;
380 #ifdef WITH_NEXT_FRAMEWORK
381 NSModule pythonModule;
382 #endif
383 #ifdef __APPLE__
384 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
385 uint32_t nsexeclength = MAXPATHLEN;
386 #else
387 unsigned long nsexeclength = MAXPATHLEN;
388 #endif
389 #endif
391 /* If there is no slash in the argv0 path, then we have to
392 * assume python is on the user's $PATH, since there's no
393 * other way to find a directory to start the search from. If
394 * $PATH isn't exported, you lose.
396 if (strchr(prog, SEP))
397 strncpy(progpath, prog, MAXPATHLEN);
398 #ifdef __APPLE__
399 /* On Mac OS X, if a script uses an interpreter of the form
400 * "#!/opt/python2.3/bin/python", the kernel only passes "python"
401 * as argv[0], which falls through to the $PATH search below.
402 * If /opt/python2.3/bin isn't in your path, or is near the end,
403 * this algorithm may incorrectly find /usr/bin/python. To work
404 * around this, we can use _NSGetExecutablePath to get a better
405 * hint of what the intended interpreter was, although this
406 * will fail if a relative path was used. but in that case,
407 * absolutize() should help us out below
409 else if(0 == _NSGetExecutablePath(progpath, &nsexeclength) && progpath[0] == SEP)
411 #endif /* __APPLE__ */
412 else if (path) {
413 while (1) {
414 char *delim = strchr(path, DELIM);
416 if (delim) {
417 size_t len = delim - path;
418 if (len > MAXPATHLEN)
419 len = MAXPATHLEN;
420 strncpy(progpath, path, len);
421 *(progpath + len) = '\0';
423 else
424 strncpy(progpath, path, MAXPATHLEN);
426 joinpath(progpath, prog);
427 if (isxfile(progpath))
428 break;
430 if (!delim) {
431 progpath[0] = '\0';
432 break;
434 path = delim + 1;
437 else
438 progpath[0] = '\0';
439 if (progpath[0] != SEP)
440 absolutize(progpath);
441 strncpy(argv0_path, progpath, MAXPATHLEN);
442 argv0_path[MAXPATHLEN] = '\0';
444 #ifdef WITH_NEXT_FRAMEWORK
445 /* On Mac OS X we have a special case if we're running from a framework.
446 ** This is because the python home should be set relative to the library,
447 ** which is in the framework, not relative to the executable, which may
448 ** be outside of the framework. Except when we're in the build directory...
450 pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize"));
451 /* Use dylib functions to find out where the framework was loaded from */
452 buf = (char *)NSLibraryNameForModule(pythonModule);
453 if (buf != NULL) {
454 /* We're in a framework. */
455 /* See if we might be in the build directory. The framework in the
456 ** build directory is incomplete, it only has the .dylib and a few
457 ** needed symlinks, it doesn't have the Lib directories and such.
458 ** If we're running with the framework from the build directory we must
459 ** be running the interpreter in the build directory, so we use the
460 ** build-directory-specific logic to find Lib and such.
462 strncpy(argv0_path, buf, MAXPATHLEN);
463 reduce(argv0_path);
464 joinpath(argv0_path, lib_python);
465 joinpath(argv0_path, LANDMARK);
466 if (!ismodule(argv0_path)) {
467 /* We are in the build directory so use the name of the
468 executable - we know that the absolute path is passed */
469 strncpy(argv0_path, prog, MAXPATHLEN);
471 else {
472 /* Use the location of the library as the progpath */
473 strncpy(argv0_path, buf, MAXPATHLEN);
476 #endif
478 #if HAVE_READLINK
480 char tmpbuffer[MAXPATHLEN+1];
481 int linklen = readlink(progpath, tmpbuffer, MAXPATHLEN);
482 while (linklen != -1) {
483 /* It's not null terminated! */
484 tmpbuffer[linklen] = '\0';
485 if (tmpbuffer[0] == SEP)
486 /* tmpbuffer should never be longer than MAXPATHLEN,
487 but extra check does not hurt */
488 strncpy(argv0_path, tmpbuffer, MAXPATHLEN);
489 else {
490 /* Interpret relative to progpath */
491 reduce(argv0_path);
492 joinpath(argv0_path, tmpbuffer);
494 linklen = readlink(argv0_path, tmpbuffer, MAXPATHLEN);
497 #endif /* HAVE_READLINK */
499 reduce(argv0_path);
500 /* At this point, argv0_path is guaranteed to be less than
501 MAXPATHLEN bytes long.
504 if (!(pfound = search_for_prefix(argv0_path, home))) {
505 if (!Py_FrozenFlag)
506 fprintf(stderr,
507 "Could not find platform independent libraries <prefix>\n");
508 strncpy(prefix, PREFIX, MAXPATHLEN);
509 joinpath(prefix, lib_python);
511 else
512 reduce(prefix);
514 strncpy(zip_path, prefix, MAXPATHLEN);
515 zip_path[MAXPATHLEN] = '\0';
516 if (pfound > 0) { /* Use the reduced prefix returned by Py_GetPrefix() */
517 reduce(zip_path);
518 reduce(zip_path);
520 else
521 strncpy(zip_path, PREFIX, MAXPATHLEN);
522 joinpath(zip_path, "lib/python00.zip");
523 bufsz = strlen(zip_path); /* Replace "00" with version */
524 zip_path[bufsz - 6] = VERSION[0];
525 zip_path[bufsz - 5] = VERSION[2];
527 if (!(efound = search_for_exec_prefix(argv0_path, home))) {
528 if (!Py_FrozenFlag)
529 fprintf(stderr,
530 "Could not find platform dependent libraries <exec_prefix>\n");
531 strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN);
532 joinpath(exec_prefix, "lib/lib-dynload");
534 /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
536 if ((!pfound || !efound) && !Py_FrozenFlag)
537 fprintf(stderr,
538 "Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]\n");
540 /* Calculate size of return buffer.
542 bufsz = 0;
544 if (rtpypath)
545 bufsz += strlen(rtpypath) + 1;
547 prefixsz = strlen(prefix) + 1;
549 while (1) {
550 char *delim = strchr(defpath, DELIM);
552 if (defpath[0] != SEP)
553 /* Paths are relative to prefix */
554 bufsz += prefixsz;
556 if (delim)
557 bufsz += delim - defpath + 1;
558 else {
559 bufsz += strlen(defpath) + 1;
560 break;
562 defpath = delim + 1;
565 bufsz += strlen(zip_path) + 1;
566 bufsz += strlen(exec_prefix) + 1;
568 /* This is the only malloc call in this file */
569 buf = PyMem_Malloc(bufsz);
571 if (buf == NULL) {
572 /* We can't exit, so print a warning and limp along */
573 fprintf(stderr, "Not enough memory for dynamic PYTHONPATH.\n");
574 fprintf(stderr, "Using default static PYTHONPATH.\n");
575 module_search_path = PYTHONPATH;
577 else {
578 /* Run-time value of $PYTHONPATH goes first */
579 if (rtpypath) {
580 strcpy(buf, rtpypath);
581 strcat(buf, delimiter);
583 else
584 buf[0] = '\0';
586 /* Next is the default zip path */
587 strcat(buf, zip_path);
588 strcat(buf, delimiter);
590 /* Next goes merge of compile-time $PYTHONPATH with
591 * dynamically located prefix.
593 defpath = pythonpath;
594 while (1) {
595 char *delim = strchr(defpath, DELIM);
597 if (defpath[0] != SEP) {
598 strcat(buf, prefix);
599 strcat(buf, separator);
602 if (delim) {
603 size_t len = delim - defpath + 1;
604 size_t end = strlen(buf) + len;
605 strncat(buf, defpath, len);
606 *(buf + end) = '\0';
608 else {
609 strcat(buf, defpath);
610 break;
612 defpath = delim + 1;
614 strcat(buf, delimiter);
616 /* Finally, on goes the directory for dynamic-load modules */
617 strcat(buf, exec_prefix);
619 /* And publish the results */
620 module_search_path = buf;
623 /* Reduce prefix and exec_prefix to their essence,
624 * e.g. /usr/local/lib/python1.5 is reduced to /usr/local.
625 * If we're loading relative to the build directory,
626 * return the compiled-in defaults instead.
628 if (pfound > 0) {
629 reduce(prefix);
630 reduce(prefix);
632 else
633 strncpy(prefix, PREFIX, MAXPATHLEN);
635 if (efound > 0) {
636 reduce(exec_prefix);
637 reduce(exec_prefix);
638 reduce(exec_prefix);
640 else
641 strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN);
645 /* External interface */
647 char *
648 Py_GetPath(void)
650 if (!module_search_path)
651 calculate_path();
652 return module_search_path;
655 char *
656 Py_GetPrefix(void)
658 if (!module_search_path)
659 calculate_path();
660 return prefix;
663 char *
664 Py_GetExecPrefix(void)
666 if (!module_search_path)
667 calculate_path();
668 return exec_prefix;
671 char *
672 Py_GetProgramFullPath(void)
674 if (!module_search_path)
675 calculate_path();
676 return progpath;