1
/* Return the initial module search path. */
10
#include <mach-o/dyld.h>
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 slashes 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
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
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.
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.
100
#define VERSION "2.1"
111
# define PREFIX "/usr/local"
116
#define EXEC_PREFIX PREFIX
120
#define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
121
EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
125
#define LANDMARK "os.py"
128
static char prefix[MAXPATHLEN+1];
129
static char exec_prefix[MAXPATHLEN+1];
130
static char progpath[MAXPATHLEN+1];
131
static char *module_search_path = NULL;
132
static char lib_python[] = "lib/python" VERSION;
137
size_t i = strlen(dir);
138
while (i > 0 && dir[i] != SEP)
145
isfile(char *filename) /* Is file, not directory */
148
if (stat(filename, &buf) != 0)
150
if (!S_ISREG(buf.st_mode))
157
ismodule(char *filename) /* Is module -- check for .pyc/.pyo too */
159
if (isfile(filename))
162
/* Check for the compiled version of prefix. */
163
if (strlen(filename) < MAXPATHLEN) {
164
strcat(filename, Py_OptimizeFlag ? "o" : "c");
165
if (isfile(filename))
173
isxfile(char *filename) /* Is executable file */
176
if (stat(filename, &buf) != 0)
178
if (!S_ISREG(buf.st_mode))
180
if ((buf.st_mode & 0111) == 0)
187
isdir(char *filename) /* Is directory */
190
if (stat(filename, &buf) != 0)
192
if (!S_ISDIR(buf.st_mode))
198
/* Add a path component, by appending stuff to buffer.
199
buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a
200
NUL-terminated string with no more than MAXPATHLEN characters (not counting
201
the trailing NUL). It's a fatal error if it contains a string longer than
202
that (callers must be careful!). If these requirements are met, it's
203
guaranteed that buffer will still be a NUL-terminated string with no more
204
than MAXPATHLEN characters at exit. If stuff is too long, only as much of
205
stuff as fits will be appended.
208
joinpath(char *buffer, char *stuff)
215
if (n > 0 && buffer[n-1] != SEP && n < MAXPATHLEN)
219
Py_FatalError("buffer overflow in getpath.c's joinpath()");
221
if (n + k > MAXPATHLEN)
223
strncpy(buffer+n, stuff, k);
227
/* copy_absolute requires that path be allocated at least
228
MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */
230
copy_absolute(char *path, char *p)
235
getcwd(path, MAXPATHLEN);
236
if (p[0] == '.' && p[1] == SEP)
242
/* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */
244
absolutize(char *path)
246
char buffer[MAXPATHLEN + 1];
250
copy_absolute(buffer, path);
251
strcpy(path, buffer);
254
/* search_for_prefix requires that argv0_path be no more than MAXPATHLEN
258
search_for_prefix(char *argv0_path, char *home)
263
/* If PYTHONHOME is set, we believe it unconditionally */
266
strncpy(prefix, home, MAXPATHLEN);
267
delim = strchr(prefix, DELIM);
270
joinpath(prefix, lib_python);
271
joinpath(prefix, LANDMARK);
275
/* Check to see if argv[0] is in the build directory */
276
strcpy(prefix, argv0_path);
277
joinpath(prefix, "Modules/Setup");
278
if (isfile(prefix)) {
279
/* Check VPATH to see if argv0_path is in the build directory. */
281
strcpy(prefix, argv0_path);
282
joinpath(prefix, vpath);
283
joinpath(prefix, "Lib");
284
joinpath(prefix, LANDMARK);
285
if (ismodule(prefix))
289
/* Search from argv0_path, until root is found */
290
copy_absolute(prefix, argv0_path);
293
joinpath(prefix, lib_python);
294
joinpath(prefix, LANDMARK);
295
if (ismodule(prefix))
301
/* Look at configure's PREFIX */
302
strncpy(prefix, PREFIX, MAXPATHLEN);
303
joinpath(prefix, lib_python);
304
joinpath(prefix, LANDMARK);
305
if (ismodule(prefix))
313
/* search_for_exec_prefix requires that argv0_path be no more than
314
MAXPATHLEN bytes long.
317
search_for_exec_prefix(char *argv0_path, char *home)
321
/* If PYTHONHOME is set, we believe it unconditionally */
324
delim = strchr(home, DELIM);
326
strncpy(exec_prefix, delim+1, MAXPATHLEN);
328
strncpy(exec_prefix, home, MAXPATHLEN);
329
joinpath(exec_prefix, lib_python);
330
joinpath(exec_prefix, "lib-dynload");
334
/* Check to see if argv[0] is in the build directory */
335
strcpy(exec_prefix, argv0_path);
336
joinpath(exec_prefix, "Modules/Setup");
337
if (isfile(exec_prefix)) {
342
/* Search from argv0_path, until root is found */
343
copy_absolute(exec_prefix, argv0_path);
345
n = strlen(exec_prefix);
346
joinpath(exec_prefix, lib_python);
347
joinpath(exec_prefix, "lib-dynload");
348
if (isdir(exec_prefix))
350
exec_prefix[n] = '\0';
352
} while (exec_prefix[0]);
354
/* Look at configure's EXEC_PREFIX */
355
strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN);
356
joinpath(exec_prefix, lib_python);
357
joinpath(exec_prefix, "lib-dynload");
358
if (isdir(exec_prefix))
369
extern char *Py_GetProgramName(void);
371
static char delimiter[2] = {DELIM, '\0'};
372
static char separator[2] = {SEP, '\0'};
373
char *pythonpath = PYTHONPATH;
374
char *rtpypath = Py_GETENV("PYTHONPATH");
375
char *home = Py_GetPythonHome();
376
char *path = getenv("PATH");
377
char *prog = Py_GetProgramName();
378
char argv0_path[MAXPATHLEN+1];
379
char zip_path[MAXPATHLEN+1];
380
int pfound, efound; /* 1 if found; -1 if found build directory */
384
char *defpath = pythonpath;
385
#ifdef WITH_NEXT_FRAMEWORK
386
NSModule pythonModule;
389
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
390
uint32_t nsexeclength = MAXPATHLEN;
392
unsigned long nsexeclength = MAXPATHLEN;
396
/* If there is no slash in the argv0 path, then we have to
397
* assume python is on the user's $PATH, since there's no
398
* other way to find a directory to start the search from. If
399
* $PATH isn't exported, you lose.
401
if (strchr(prog, SEP))
402
strncpy(progpath, prog, MAXPATHLEN);
404
/* On Mac OS X, if a script uses an interpreter of the form
405
* "#!/opt/python2.3/bin/python", the kernel only passes "python"
406
* as argv[0], which falls through to the $PATH search below.
407
* If /opt/python2.3/bin isn't in your path, or is near the end,
408
* this algorithm may incorrectly find /usr/bin/python. To work
409
* around this, we can use _NSGetExecutablePath to get a better
410
* hint of what the intended interpreter was, although this
411
* will fail if a relative path was used. but in that case,
412
* absolutize() should help us out below
414
else if(0 == _NSGetExecutablePath(progpath, &nsexeclength) && progpath[0] == SEP)
416
#endif /* __APPLE__ */
419
char *delim = strchr(path, DELIM);
422
size_t len = delim - path;
423
if (len > MAXPATHLEN)
425
strncpy(progpath, path, len);
426
*(progpath + len) = '\0';
429
strncpy(progpath, path, MAXPATHLEN);
431
joinpath(progpath, prog);
432
if (isxfile(progpath))
444
if (progpath[0] != SEP)
445
absolutize(progpath);
446
strncpy(argv0_path, progpath, MAXPATHLEN);
447
argv0_path[MAXPATHLEN] = '\0';
449
#ifdef WITH_NEXT_FRAMEWORK
450
/* On Mac OS X we have a special case if we're running from a framework.
451
** This is because the python home should be set relative to the library,
452
** which is in the framework, not relative to the executable, which may
453
** be outside of the framework. Except when we're in the build directory...
455
pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize"));
456
/* Use dylib functions to find out where the framework was loaded from */
457
buf = (char *)NSLibraryNameForModule(pythonModule);
459
/* We're in a framework. */
460
/* See if we might be in the build directory. The framework in the
461
** build directory is incomplete, it only has the .dylib and a few
462
** needed symlinks, it doesn't have the Lib directories and such.
463
** If we're running with the framework from the build directory we must
464
** be running the interpreter in the build directory, so we use the
465
** build-directory-specific logic to find Lib and such.
467
strncpy(argv0_path, buf, MAXPATHLEN);
469
joinpath(argv0_path, lib_python);
470
joinpath(argv0_path, LANDMARK);
471
if (!ismodule(argv0_path)) {
472
/* We are in the build directory so use the name of the
473
executable - we know that the absolute path is passed */
474
strncpy(argv0_path, prog, MAXPATHLEN);
477
/* Use the location of the library as the progpath */
478
strncpy(argv0_path, buf, MAXPATHLEN);
485
char tmpbuffer[MAXPATHLEN+1];
486
int linklen = readlink(progpath, tmpbuffer, MAXPATHLEN);
487
while (linklen != -1) {
488
/* It's not null terminated! */
489
tmpbuffer[linklen] = '\0';
490
if (tmpbuffer[0] == SEP)
491
/* tmpbuffer should never be longer than MAXPATHLEN,
492
but extra check does not hurt */
493
strncpy(argv0_path, tmpbuffer, MAXPATHLEN);
495
/* Interpret relative to progpath */
497
joinpath(argv0_path, tmpbuffer);
499
linklen = readlink(argv0_path, tmpbuffer, MAXPATHLEN);
502
#endif /* HAVE_READLINK */
505
/* At this point, argv0_path is guaranteed to be less than
506
MAXPATHLEN bytes long.
509
if (!(pfound = search_for_prefix(argv0_path, home))) {
512
"Could not find platform independent libraries <prefix>\n");
513
strncpy(prefix, PREFIX, MAXPATHLEN);
514
joinpath(prefix, lib_python);
519
strncpy(zip_path, prefix, MAXPATHLEN);
520
zip_path[MAXPATHLEN] = '\0';
521
if (pfound > 0) { /* Use the reduced prefix returned by Py_GetPrefix() */
526
strncpy(zip_path, PREFIX, MAXPATHLEN);
527
joinpath(zip_path, "lib/python00.zip");
528
bufsz = strlen(zip_path); /* Replace "00" with version */
529
zip_path[bufsz - 6] = VERSION[0];
530
zip_path[bufsz - 5] = VERSION[2];
532
if (!(efound = search_for_exec_prefix(argv0_path, home))) {
535
"Could not find platform dependent libraries <exec_prefix>\n");
536
strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN);
537
joinpath(exec_prefix, "lib/lib-dynload");
539
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
541
if ((!pfound || !efound) && !Py_FrozenFlag)
543
"Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]\n");
545
/* Calculate size of return buffer.
550
bufsz += strlen(rtpypath) + 1;
552
prefixsz = strlen(prefix) + 1;
555
char *delim = strchr(defpath, DELIM);
557
if (defpath[0] != SEP)
558
/* Paths are relative to prefix */
562
bufsz += delim - defpath + 1;
564
bufsz += strlen(defpath) + 1;
570
bufsz += strlen(zip_path) + 1;
571
bufsz += strlen(exec_prefix) + 1;
573
/* This is the only malloc call in this file */
574
buf = (char *)PyMem_Malloc(bufsz);
577
/* We can't exit, so print a warning and limp along */
578
fprintf(stderr, "Not enough memory for dynamic PYTHONPATH.\n");
579
fprintf(stderr, "Using default static PYTHONPATH.\n");
580
module_search_path = PYTHONPATH;
583
/* Run-time value of $PYTHONPATH goes first */
585
strcpy(buf, rtpypath);
586
strcat(buf, delimiter);
591
/* Next is the default zip path */
592
strcat(buf, zip_path);
593
strcat(buf, delimiter);
595
/* Next goes merge of compile-time $PYTHONPATH with
596
* dynamically located prefix.
598
defpath = pythonpath;
600
char *delim = strchr(defpath, DELIM);
602
if (defpath[0] != SEP) {
604
strcat(buf, separator);
608
size_t len = delim - defpath + 1;
609
size_t end = strlen(buf) + len;
610
strncat(buf, defpath, len);
614
strcat(buf, defpath);
619
strcat(buf, delimiter);
621
/* Finally, on goes the directory for dynamic-load modules */
622
strcat(buf, exec_prefix);
624
/* And publish the results */
625
module_search_path = buf;
628
/* Reduce prefix and exec_prefix to their essence,
629
* e.g. /usr/local/lib/python1.5 is reduced to /usr/local.
630
* If we're loading relative to the build directory,
631
* return the compiled-in defaults instead.
636
/* The prefix is the root directory, but reduce() chopped
639
strcpy(prefix, separator);
642
strncpy(prefix, PREFIX, MAXPATHLEN);
649
strcpy(exec_prefix, separator);
652
strncpy(exec_prefix, EXEC_PREFIX, MAXPATHLEN);
656
/* External interface */
661
if (!module_search_path)
663
return module_search_path;
669
if (!module_search_path)
675
Py_GetExecPrefix(void)
677
if (!module_search_path)
683
Py_GetProgramFullPath(void)
685
if (!module_search_path)