blob: ecde205b53ea1a6cfbb4ec75fa89fc2262ff2039 [file] [log] [blame]
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +00001
2/* Return the initial module search path. */
Guido van Rossumc4995721998-08-08 20:05:31 +00003/* Used by DOS, OS/2, Windows 3.1, Windows 95/98, Windows NT. */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +00004
Guido van Rossum88716bb2000-03-30 19:45:39 +00005/* ----------------------------------------------------------------
6 PATH RULES FOR WINDOWS:
7 This describes how sys.path is formed on Windows. It describes the
8 functionality, not the implementation (ie, the order in which these
9 are actually fetched is different)
10
11 * Python always adds an empty entry at the start, which corresponds
12 to the current directory.
13
14 * If the PYTHONPATH env. var. exists, it's entries are added next.
15
16 * We look in the registry for "application paths" - that is, sub-keys
17 under the main PythonPath registry key. These are added next (the
18 order of sub-key processing is undefined).
19 HKEY_CURRENT_USER is searched and added first.
20 HKEY_LOCAL_MACHINE is searched and added next.
21 (Note that all known installers only use HKLM, so HKCU is typically
22 empty)
23
24 * We attempt to locate the "Python Home" - if the PYTHONHOME env var
25 is set, we believe it. Otherwise, we use the path of our host .EXE's
Jeremy Hylton847a9962000-05-26 21:49:07 +000026 to try and locate our "landmark" (lib\\os.py) and deduce our home.
Guido van Rossum88716bb2000-03-30 19:45:39 +000027 - If we DO have a Python Home: The relevant sub-directories (Lib,
28 plat-win, lib-tk, etc) are based on the Python Home
29 - If we DO NOT have a Python Home, the core Python Path is
30 loaded from the registry. This is the main PythonPath key,
31 and both HKLM and HKCU are combined to form the path)
32
33 * Iff - we can not locate the Python Home, have not had a PYTHONPATH
34 specified, and can't locate any Registry entries (ie, we have _nothing_
35 we can assume is a good path), a default path with relative entries is
36 used (eg. .\Lib;.\plat-win, etc)
37
38
39 The end result of all this is:
40 * When running python.exe, or any other .exe in the main Python directory
41 (either an installed version, or directly from the PCbuild directory),
42 the core path is deduced, and the core paths in the registry are
43 ignored. Other "application paths" in the registry are always read.
44
45 * When Python is hosted in another exe (different directory, embedded via
46 COM, etc), the Python Home will not be deduced, so the core path from
Mark Hammond19fdbfb2001-09-07 14:08:01 +000047 the registry is used. Other "application paths" in the registry are
Guido van Rossum88716bb2000-03-30 19:45:39 +000048 always read.
49
50 * If Python can't find its home and there is no registry (eg, frozen
51 exe, some very strange installation setup) you get a path with
52 some default, but relative, paths.
53
54 ---------------------------------------------------------------- */
55
56
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000057#include "Python.h"
58#include "osdefs.h"
59
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000060#ifdef MS_WINDOWS
Guido van Rossum8f1b6511997-08-13 19:55:43 +000061#include <windows.h>
Guido van Rossum88716bb2000-03-30 19:45:39 +000062#include <tchar.h>
Guido van Rossum8f1b6511997-08-13 19:55:43 +000063#endif
64
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000065#include <sys/types.h>
66#include <sys/stat.h>
67#include <string.h>
68
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000069/* Search in some common locations for the associated Python libraries.
70 *
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000071 * Py_GetPath() tries to return a sensible Python module search path.
72 *
Guido van Rossum42a97441998-02-19 21:00:45 +000073 * The approach is an adaptation for Windows of the strategy used in
74 * ../Modules/getpath.c; it uses the Windows Registry as one of its
75 * information sources.
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000076 */
77
78#ifndef LANDMARK
Jeremy Hylton847a9962000-05-26 21:49:07 +000079#define LANDMARK "lib\\os.py"
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000080#endif
81
82static char prefix[MAXPATHLEN+1];
83static char progpath[MAXPATHLEN+1];
Just van Rossum52e14d62002-12-30 22:08:05 +000084static char dllpath[MAXPATHLEN+1];
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000085static char *module_search_path = NULL;
86
Guido van Rossumeea14491997-08-13 21:30:44 +000087
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000088static int
Thomas Wouters78890102000-07-22 19:25:51 +000089is_sep(char ch) /* determine if "ch" is a separator character */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000090{
91#ifdef ALTSEP
92 return ch == SEP || ch == ALTSEP;
93#else
94 return ch == SEP;
95#endif
96}
97
Mark Hammond8bf9e3b2000-10-07 11:10:50 +000098/* assumes 'dir' null terminated in bounds. Never writes
99 beyond existing terminator.
100*/
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000101static void
Thomas Wouters78890102000-07-22 19:25:51 +0000102reduce(char *dir)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000103{
Guido van Rossum1c44e282000-06-28 22:20:06 +0000104 size_t i = strlen(dir);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000105 while (i > 0 && !is_sep(dir[i]))
106 --i;
107 dir[i] = '\0';
108}
109
110
111static int
Thomas Wouters78890102000-07-22 19:25:51 +0000112exists(char *filename)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000113{
114 struct stat buf;
115 return stat(filename, &buf) == 0;
116}
117
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000118/* Assumes 'filename' MAXPATHLEN+1 bytes long -
119 may extend 'filename' by one character.
120*/
Guido van Rossum43ff1141998-08-08 23:40:40 +0000121static int
Thomas Wouters78890102000-07-22 19:25:51 +0000122ismodule(char *filename) /* Is module -- check for .pyc/.pyo too */
Guido van Rossum43ff1141998-08-08 23:40:40 +0000123{
124 if (exists(filename))
125 return 1;
126
127 /* Check for the compiled version of prefix. */
128 if (strlen(filename) < MAXPATHLEN) {
129 strcat(filename, Py_OptimizeFlag ? "o" : "c");
130 if (exists(filename))
131 return 1;
132 }
133 return 0;
134}
135
Tim Peters8484fbf2004-08-07 19:12:27 +0000136/* Add a path component, by appending stuff to buffer.
137 buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a
138 NUL-terminated string with no more than MAXPATHLEN characters (not counting
139 the trailing NUL). It's a fatal error if it contains a string longer than
140 that (callers must be careful!). If these requirements are met, it's
141 guaranteed that buffer will still be a NUL-terminated string with no more
142 than MAXPATHLEN characters at exit. If stuff is too long, only as much of
143 stuff as fits will be appended.
144*/
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000145static void
Thomas Wouters78890102000-07-22 19:25:51 +0000146join(char *buffer, char *stuff)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000147{
Guido van Rossum1c44e282000-06-28 22:20:06 +0000148 size_t n, k;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000149 if (is_sep(stuff[0]))
150 n = 0;
151 else {
152 n = strlen(buffer);
153 if (n > 0 && !is_sep(buffer[n-1]) && n < MAXPATHLEN)
154 buffer[n++] = SEP;
155 }
Tim Peters8484fbf2004-08-07 19:12:27 +0000156 if (n > MAXPATHLEN)
157 Py_FatalError("buffer overflow in getpathp.c's joinpath()");
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000158 k = strlen(stuff);
159 if (n + k > MAXPATHLEN)
160 k = MAXPATHLEN - n;
161 strncpy(buffer+n, stuff, k);
162 buffer[n+k] = '\0';
163}
164
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000165/* gotlandmark only called by search_for_prefix, which ensures
166 'prefix' is null terminated in bounds. join() ensures
167 'landmark' can not overflow prefix if too long.
168*/
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000169static int
Thomas Wouters78890102000-07-22 19:25:51 +0000170gotlandmark(char *landmark)
Guido van Rossume02e48b2000-03-29 01:49:47 +0000171{
172 int n, ok;
173
174 n = strlen(prefix);
175 join(prefix, landmark);
176 ok = ismodule(prefix);
177 prefix[n] = '\0';
178 return ok;
179}
180
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000181/* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd.
182 assumption provided by only caller, calculate_path() */
Guido van Rossume02e48b2000-03-29 01:49:47 +0000183static int
Thomas Wouters78890102000-07-22 19:25:51 +0000184search_for_prefix(char *argv0_path, char *landmark)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000185{
Guido van Rossume02e48b2000-03-29 01:49:47 +0000186 /* Search from argv0_path, until landmark is found */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000187 strcpy(prefix, argv0_path);
188 do {
Guido van Rossume02e48b2000-03-29 01:49:47 +0000189 if (gotlandmark(landmark))
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000190 return 1;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000191 reduce(prefix);
192 } while (prefix[0]);
193 return 0;
194}
195
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000196#ifdef MS_WINDOWS
Guido van Rossum43ff1141998-08-08 23:40:40 +0000197
Guido van Rossum88716bb2000-03-30 19:45:39 +0000198/* a string loaded from the DLL at startup.*/
199extern const char *PyWin_DLLVersionString;
Guido van Rossum271f9771997-09-29 23:39:31 +0000200
Guido van Rossumeea14491997-08-13 21:30:44 +0000201
202/* Load a PYTHONPATH value from the registry.
203 Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER.
204
Guido van Rossum88716bb2000-03-30 19:45:39 +0000205 Works in both Unicode and 8bit environments. Only uses the
206 Ex family of functions so it also works with Windows CE.
207
Guido van Rossumeea14491997-08-13 21:30:44 +0000208 Returns NULL, or a pointer that should be freed.
Mark Hammond5edc6272001-02-23 11:38:38 +0000209
210 XXX - this code is pretty strange, as it used to also
211 work on Win16, where the buffer sizes werent available
212 in advance. It could be simplied now Win16/Win32s is dead!
Guido van Rossumeea14491997-08-13 21:30:44 +0000213*/
214
215static char *
Guido van Rossum88716bb2000-03-30 19:45:39 +0000216getpythonregpath(HKEY keyBase, int skipcore)
Guido van Rossumeea14491997-08-13 21:30:44 +0000217{
218 HKEY newKey = 0;
Guido van Rossumeea14491997-08-13 21:30:44 +0000219 DWORD dataSize = 0;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000220 DWORD numKeys = 0;
Guido van Rossumeea14491997-08-13 21:30:44 +0000221 LONG rc;
222 char *retval = NULL;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000223 TCHAR *dataBuf = NULL;
224 static const TCHAR keyPrefix[] = _T("Software\\Python\\PythonCore\\");
225 static const TCHAR keySuffix[] = _T("\\PythonPath");
Guido van Rossum1c44e282000-06-28 22:20:06 +0000226 size_t versionLen;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000227 DWORD index;
228 TCHAR *keyBuf = NULL;
229 TCHAR *keyBufPtr;
230 TCHAR **ppPaths = NULL;
Guido van Rossum271f9771997-09-29 23:39:31 +0000231
Guido van Rossum88716bb2000-03-30 19:45:39 +0000232 /* Tried to use sysget("winver") but here is too early :-( */
233 versionLen = _tcslen(PyWin_DLLVersionString);
234 /* Space for all the chars, plus one \0 */
235 keyBuf = keyBufPtr = malloc(sizeof(keyPrefix) +
236 sizeof(TCHAR)*(versionLen-1) +
237 sizeof(keySuffix));
238 if (keyBuf==NULL) goto done;
Guido van Rossum271f9771997-09-29 23:39:31 +0000239
Guido van Rossum88716bb2000-03-30 19:45:39 +0000240 memcpy(keyBufPtr, keyPrefix, sizeof(keyPrefix)-sizeof(TCHAR));
241 keyBufPtr += sizeof(keyPrefix)/sizeof(TCHAR) - 1;
242 memcpy(keyBufPtr, PyWin_DLLVersionString, versionLen * sizeof(TCHAR));
243 keyBufPtr += versionLen;
244 /* NULL comes with this one! */
245 memcpy(keyBufPtr, keySuffix, sizeof(keySuffix));
246 /* Open the root Python key */
247 rc=RegOpenKeyEx(keyBase,
248 keyBuf, /* subkey */
249 0, /* reserved */
250 KEY_READ,
251 &newKey);
252 if (rc!=ERROR_SUCCESS) goto done;
253 /* Find out how big our core buffer is, and how many subkeys we have */
254 rc = RegQueryInfoKey(newKey, NULL, NULL, NULL, &numKeys, NULL, NULL,
255 NULL, NULL, &dataSize, NULL, NULL);
256 if (rc!=ERROR_SUCCESS) goto done;
257 if (skipcore) dataSize = 0; /* Only count core ones if we want them! */
258 /* Allocate a temp array of char buffers, so we only need to loop
259 reading the registry once
260 */
261 ppPaths = malloc( sizeof(TCHAR *) * numKeys );
262 if (ppPaths==NULL) goto done;
263 memset(ppPaths, 0, sizeof(TCHAR *) * numKeys);
264 /* Loop over all subkeys, allocating a temp sub-buffer. */
265 for(index=0;index<numKeys;index++) {
266 TCHAR keyBuf[MAX_PATH+1];
267 HKEY subKey = 0;
268 DWORD reqdSize = MAX_PATH+1;
269 /* Get the sub-key name */
270 DWORD rc = RegEnumKeyEx(newKey, index, keyBuf, &reqdSize,
271 NULL, NULL, NULL, NULL );
272 if (rc!=ERROR_SUCCESS) goto done;
273 /* Open the sub-key */
274 rc=RegOpenKeyEx(newKey,
275 keyBuf, /* subkey */
276 0, /* reserved */
277 KEY_READ,
278 &subKey);
279 if (rc!=ERROR_SUCCESS) goto done;
280 /* Find the value of the buffer size, malloc, then read it */
281 RegQueryValueEx(subKey, NULL, 0, NULL, NULL, &reqdSize);
282 if (reqdSize) {
283 ppPaths[index] = malloc(reqdSize);
284 if (ppPaths[index]) {
Mark Hammonde61aca72000-09-10 09:14:53 +0000285 RegQueryValueEx(subKey, NULL, 0, NULL,
286 (LPBYTE)ppPaths[index],
287 &reqdSize);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000288 dataSize += reqdSize + 1; /* 1 for the ";" */
Guido van Rossumeea14491997-08-13 21:30:44 +0000289 }
290 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000291 RegCloseKey(subKey);
Guido van Rossumeea14491997-08-13 21:30:44 +0000292 }
Mark Hammond5edc6272001-02-23 11:38:38 +0000293 /* original datasize from RegQueryInfo doesn't include the \0 */
Guido van Rossum88716bb2000-03-30 19:45:39 +0000294 dataBuf = malloc((dataSize+1) * sizeof(TCHAR));
295 if (dataBuf) {
296 TCHAR *szCur = dataBuf;
297 DWORD reqdSize = dataSize;
298 /* Copy our collected strings */
299 for (index=0;index<numKeys;index++) {
Guido van Rossum88716bb2000-03-30 19:45:39 +0000300 if (index > 0) {
301 *(szCur++) = _T(';');
302 dataSize--;
303 }
Mark Hammonde61aca72000-09-10 09:14:53 +0000304 if (ppPaths[index]) {
305 int len = _tcslen(ppPaths[index]);
306 _tcsncpy(szCur, ppPaths[index], len);
307 szCur += len;
308 dataSize -= len;
309 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000310 }
311 if (skipcore)
312 *szCur = '\0';
313 else {
Mark Hammond5edc6272001-02-23 11:38:38 +0000314 /* If we have no values, we dont need a ';' */
315 if (numKeys) {
316 *(szCur++) = _T(';');
317 dataSize--;
318 }
Mark Hammonde61aca72000-09-10 09:14:53 +0000319 /* Now append the core path entries -
320 this will include the NULL
321 */
322 rc = RegQueryValueEx(newKey, NULL, 0, NULL,
323 (LPBYTE)szCur, &dataSize);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000324 }
325 /* And set the result - caller must free
326 If MBCS, it is fine as is. If Unicode, allocate new
327 buffer and convert.
328 */
329#ifdef UNICODE
330 retval = (char *)malloc(reqdSize+1);
331 if (retval)
332 WideCharToMultiByte(CP_ACP, 0,
333 dataBuf, -1, /* source */
Mark Hammond61bb35f2003-01-29 22:38:29 +0000334 retval, reqdSize+1, /* dest */
Guido van Rossum88716bb2000-03-30 19:45:39 +0000335 NULL, NULL);
336 free(dataBuf);
337#else
338 retval = dataBuf;
339#endif
340 }
341done:
342 /* Loop freeing my temp buffers */
343 if (ppPaths) {
344 for(index=0;index<numKeys;index++)
345 if (ppPaths[index]) free(ppPaths[index]);
346 free(ppPaths);
347 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000348 if (newKey)
349 RegCloseKey(newKey);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000350 if (keyBuf)
351 free(keyBuf);
Guido van Rossumeea14491997-08-13 21:30:44 +0000352 return retval;
353}
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000354#endif /* MS_WINDOWS */
Guido van Rossumeea14491997-08-13 21:30:44 +0000355
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000356static void
Thomas Wouters78890102000-07-22 19:25:51 +0000357get_progpath(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000358{
Thomas Woutersa5345942000-07-22 23:59:33 +0000359 extern char *Py_GetProgramName(void);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000360 char *path = getenv("PATH");
361 char *prog = Py_GetProgramName();
362
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000363#ifdef MS_WINDOWS
Just van Rossum52e14d62002-12-30 22:08:05 +0000364 extern HANDLE PyWin_DLLhModule;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000365#ifdef UNICODE
366 WCHAR wprogpath[MAXPATHLEN+1];
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000367 /* Windows documents that GetModuleFileName() will "truncate",
368 but makes no mention of the null terminator. Play it safe.
369 PLUS Windows itself defines MAX_PATH as the same, but anyway...
370 */
Mark Hammond2795dae2002-07-22 13:28:21 +0000371 wprogpath[MAXPATHLEN]=_T('\0');
Just van Rossum52e14d62002-12-30 22:08:05 +0000372 if (PyWin_DLLhModule &&
373 GetModuleFileName(PyWin_DLLhModule, wprogpath, MAXPATHLEN)) {
374 WideCharToMultiByte(CP_ACP, 0,
375 wprogpath, -1,
376 dllpath, MAXPATHLEN+1,
377 NULL, NULL);
378 }
Thomas Heller6019f9a2003-08-18 17:53:33 +0000379 wprogpath[MAXPATHLEN]=_T('\0');
Guido van Rossum88716bb2000-03-30 19:45:39 +0000380 if (GetModuleFileName(NULL, wprogpath, MAXPATHLEN)) {
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000381 WideCharToMultiByte(CP_ACP, 0,
382 wprogpath, -1,
383 progpath, MAXPATHLEN+1,
384 NULL, NULL);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000385 return;
386 }
387#else
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000388 /* static init of progpath ensures final char remains \0 */
Just van Rossum52e14d62002-12-30 22:08:05 +0000389 if (PyWin_DLLhModule)
390 if (!GetModuleFileName(PyWin_DLLhModule, dllpath, MAXPATHLEN))
391 dllpath[0] = 0;
Guido van Rossumeea14491997-08-13 21:30:44 +0000392 if (GetModuleFileName(NULL, progpath, MAXPATHLEN))
393 return;
394#endif
Guido van Rossum88716bb2000-03-30 19:45:39 +0000395#endif
Guido van Rossumeea14491997-08-13 21:30:44 +0000396 if (prog == NULL || *prog == '\0')
397 prog = "python";
398
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000399 /* If there is no slash in the argv0 path, then we have to
400 * assume python is on the user's $PATH, since there's no
401 * other way to find a directory to start the search from. If
402 * $PATH isn't exported, you lose.
403 */
404#ifdef ALTSEP
405 if (strchr(prog, SEP) || strchr(prog, ALTSEP))
406#else
407 if (strchr(prog, SEP))
408#endif
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000409 strncpy(progpath, prog, MAXPATHLEN);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000410 else if (path) {
411 while (1) {
412 char *delim = strchr(path, DELIM);
413
414 if (delim) {
Guido van Rossum1c44e282000-06-28 22:20:06 +0000415 size_t len = delim - path;
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000416 /* ensure we can't overwrite buffer */
417 len = min(MAXPATHLEN,len);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000418 strncpy(progpath, path, len);
419 *(progpath + len) = '\0';
420 }
421 else
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000422 strncpy(progpath, path, MAXPATHLEN);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000423
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000424 /* join() is safe for MAXPATHLEN+1 size buffer */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000425 join(progpath, prog);
426 if (exists(progpath))
427 break;
428
429 if (!delim) {
430 progpath[0] = '\0';
431 break;
432 }
433 path = delim + 1;
434 }
435 }
436 else
437 progpath[0] = '\0';
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000438}
439
440static void
Thomas Wouters78890102000-07-22 19:25:51 +0000441calculate_path(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000442{
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000443 char argv0_path[MAXPATHLEN+1];
444 char *buf;
Guido van Rossum1c44e282000-06-28 22:20:06 +0000445 size_t bufsz;
Guido van Rossum8b2b3ce1998-07-27 13:48:07 +0000446 char *pythonhome = Py_GetPythonHome();
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000447 char *envpath = Py_GETENV("PYTHONPATH");
Guido van Rossumeea14491997-08-13 21:30:44 +0000448
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000449#ifdef MS_WINDOWS
Guido van Rossum88716bb2000-03-30 19:45:39 +0000450 int skiphome, skipdefault;
Guido van Rossum43ff1141998-08-08 23:40:40 +0000451 char *machinepath = NULL;
452 char *userpath = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +0000453 char zip_path[MAXPATHLEN+1];
454 size_t len;
Guido van Rossumeea14491997-08-13 21:30:44 +0000455#endif
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000456
457 get_progpath();
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000458 /* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000459 strcpy(argv0_path, progpath);
460 reduce(argv0_path);
Guido van Rossumeea14491997-08-13 21:30:44 +0000461 if (pythonhome == NULL || *pythonhome == '\0') {
462 if (search_for_prefix(argv0_path, LANDMARK))
463 pythonhome = prefix;
Guido van Rossum43ff1141998-08-08 23:40:40 +0000464 else
465 pythonhome = NULL;
Guido van Rossumeea14491997-08-13 21:30:44 +0000466 }
467 else
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000468 strncpy(prefix, pythonhome, MAXPATHLEN);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000469
Guido van Rossumeea14491997-08-13 21:30:44 +0000470 if (envpath && *envpath == '\0')
471 envpath = NULL;
472
Guido van Rossume02e48b2000-03-29 01:49:47 +0000473
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000474#ifdef MS_WINDOWS
Just van Rossum52e14d62002-12-30 22:08:05 +0000475 /* Calculate zip archive path */
476 if (dllpath[0]) /* use name of python DLL */
477 strncpy(zip_path, dllpath, MAXPATHLEN);
478 else /* use name of executable program */
479 strncpy(zip_path, progpath, MAXPATHLEN);
Neal Norwitza8aed022002-12-31 12:35:41 +0000480 zip_path[MAXPATHLEN] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +0000481 len = strlen(zip_path);
482 if (len > 4) {
483 zip_path[len-3] = 'z'; /* change ending to "zip" */
484 zip_path[len-2] = 'i';
485 zip_path[len-1] = 'p';
486 }
487 else {
488 zip_path[0] = 0;
489 }
490
Guido van Rossum88716bb2000-03-30 19:45:39 +0000491 skiphome = pythonhome==NULL ? 0 : 1;
492 machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome);
493 userpath = getpythonregpath(HKEY_CURRENT_USER, skiphome);
494 /* We only use the default relative PYTHONPATH if we havent
495 anything better to use! */
496 skipdefault = envpath!=NULL || pythonhome!=NULL || \
497 machinepath!=NULL || userpath!=NULL;
Guido van Rossum43ff1141998-08-08 23:40:40 +0000498#endif
499
500 /* We need to construct a path from the following parts.
Guido van Rossumeea14491997-08-13 21:30:44 +0000501 (1) the PYTHONPATH environment variable, if set;
Just van Rossum52e14d62002-12-30 22:08:05 +0000502 (2) for Win32, the zip archive file path;
503 (3) for Win32, the machinepath and userpath, if set;
504 (4) the PYTHONPATH config macro, with the leading "."
Guido van Rossumeea14491997-08-13 21:30:44 +0000505 of each component replaced with pythonhome, if set;
Just van Rossum52e14d62002-12-30 22:08:05 +0000506 (5) the directory containing the executable (argv0_path).
507 The length calculation calculates #4 first.
Guido van Rossum43ff1141998-08-08 23:40:40 +0000508 Extra rules:
Just van Rossum52e14d62002-12-30 22:08:05 +0000509 - If PYTHONHOME is set (in any way) item (3) is ignored.
510 - If registry values are used, (4) and (5) are ignored.
Guido van Rossumeea14491997-08-13 21:30:44 +0000511 */
512
513 /* Calculate size of return buffer */
514 if (pythonhome != NULL) {
515 char *p;
516 bufsz = 1;
517 for (p = PYTHONPATH; *p; p++) {
518 if (*p == DELIM)
519 bufsz++; /* number of DELIM plus one */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000520 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000521 bufsz *= strlen(pythonhome);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000522 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000523 else
524 bufsz = 0;
Guido van Rossum691d2ad1997-12-11 02:32:43 +0000525 bufsz += strlen(PYTHONPATH) + 1;
Guido van Rossum8f1b6511997-08-13 19:55:43 +0000526 bufsz += strlen(argv0_path) + 1;
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000527#ifdef MS_WINDOWS
Guido van Rossumeea14491997-08-13 21:30:44 +0000528 if (userpath)
529 bufsz += strlen(userpath) + 1;
Guido van Rossum67ab6721998-08-08 19:58:59 +0000530 if (machinepath)
531 bufsz += strlen(machinepath) + 1;
Just van Rossum52e14d62002-12-30 22:08:05 +0000532 bufsz += strlen(zip_path) + 1;
Guido van Rossumeea14491997-08-13 21:30:44 +0000533#endif
Guido van Rossum67ab6721998-08-08 19:58:59 +0000534 if (envpath != NULL)
535 bufsz += strlen(envpath) + 1;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000536
537 module_search_path = buf = malloc(bufsz);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000538 if (buf == NULL) {
539 /* We can't exit, so print a warning and limp along */
Guido van Rossumeea14491997-08-13 21:30:44 +0000540 fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n");
541 if (envpath) {
Guido van Rossume02e48b2000-03-29 01:49:47 +0000542 fprintf(stderr, "Using environment $PYTHONPATH.\n");
Guido van Rossumeea14491997-08-13 21:30:44 +0000543 module_search_path = envpath;
544 }
545 else {
Guido van Rossume02e48b2000-03-29 01:49:47 +0000546 fprintf(stderr, "Using default static path.\n");
Guido van Rossumeea14491997-08-13 21:30:44 +0000547 module_search_path = PYTHONPATH;
548 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000549#ifdef MS_WINDOWS
Guido van Rossum42a97441998-02-19 21:00:45 +0000550 if (machinepath)
551 free(machinepath);
552 if (userpath)
553 free(userpath);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000554#endif /* MS_WINDOWS */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000555 return;
556 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000557
558 if (envpath) {
559 strcpy(buf, envpath);
560 buf = strchr(buf, '\0');
561 *buf++ = DELIM;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000562 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000563#ifdef MS_WINDOWS
Just van Rossum52e14d62002-12-30 22:08:05 +0000564 if (zip_path[0]) {
565 strcpy(buf, zip_path);
566 buf = strchr(buf, '\0');
567 *buf++ = DELIM;
568 }
Guido van Rossum67ab6721998-08-08 19:58:59 +0000569 if (userpath) {
570 strcpy(buf, userpath);
571 buf = strchr(buf, '\0');
572 *buf++ = DELIM;
573 free(userpath);
574 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000575 if (machinepath) {
576 strcpy(buf, machinepath);
577 buf = strchr(buf, '\0');
578 *buf++ = DELIM;
Guido van Rossum42a97441998-02-19 21:00:45 +0000579 free(machinepath);
Guido van Rossume02e48b2000-03-29 01:49:47 +0000580 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000581 if (pythonhome == NULL) {
582 if (!skipdefault) {
583 strcpy(buf, PYTHONPATH);
584 buf = strchr(buf, '\0');
585 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000586 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000587#else
Guido van Rossumeea14491997-08-13 21:30:44 +0000588 if (pythonhome == NULL) {
589 strcpy(buf, PYTHONPATH);
590 buf = strchr(buf, '\0');
591 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000592#endif /* MS_WINDOWS */
Guido van Rossumeea14491997-08-13 21:30:44 +0000593 else {
594 char *p = PYTHONPATH;
595 char *q;
Guido van Rossum1c44e282000-06-28 22:20:06 +0000596 size_t n;
Guido van Rossumeea14491997-08-13 21:30:44 +0000597 for (;;) {
598 q = strchr(p, DELIM);
599 if (q == NULL)
600 n = strlen(p);
601 else
602 n = q-p;
603 if (p[0] == '.' && is_sep(p[1])) {
604 strcpy(buf, pythonhome);
605 buf = strchr(buf, '\0');
606 p++;
607 n--;
608 }
609 strncpy(buf, p, n);
610 buf += n;
611 if (q == NULL)
612 break;
613 *buf++ = DELIM;
614 p = q+1;
615 }
616 }
617 if (argv0_path) {
618 *buf++ = DELIM;
619 strcpy(buf, argv0_path);
620 buf = strchr(buf, '\0');
621 }
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000622 *buf = '\0';
Mark Hammond19fdbfb2001-09-07 14:08:01 +0000623 /* Now to pull one last hack/trick. If sys.prefix is
624 empty, then try and find it somewhere on the paths
625 we calculated. We scan backwards, as our general policy
626 is that Python core directories are at the *end* of
627 sys.path. We assume that our "lib" directory is
628 on the path, and that our 'prefix' directory is
629 the parent of that.
630 */
631 if (*prefix=='\0') {
632 char lookBuf[MAXPATHLEN+1];
633 char *look = buf - 1; /* 'buf' is at the end of the buffer */
634 while (1) {
635 int nchars;
636 char *lookEnd = look;
637 /* 'look' will end up one character before the
638 start of the path in question - even if this
639 is one character before the start of the buffer
640 */
641 while (*look != DELIM && look >= module_search_path)
642 look--;
643 nchars = lookEnd-look;
644 strncpy(lookBuf, look+1, nchars);
645 lookBuf[nchars] = '\0';
646 /* Up one level to the parent */
647 reduce(lookBuf);
648 if (search_for_prefix(lookBuf, LANDMARK)) {
649 break;
650 }
651 /* If we are out of paths to search - give up */
652 if (look < module_search_path)
653 break;
654 look--;
655 }
656 }
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000657}
658
659
660/* External interface */
661
662char *
Thomas Wouters78890102000-07-22 19:25:51 +0000663Py_GetPath(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000664{
665 if (!module_search_path)
666 calculate_path();
667 return module_search_path;
668}
669
670char *
Thomas Wouters78890102000-07-22 19:25:51 +0000671Py_GetPrefix(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000672{
Guido van Rossumeea14491997-08-13 21:30:44 +0000673 if (!module_search_path)
674 calculate_path();
675 return prefix;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000676}
677
678char *
Thomas Wouters78890102000-07-22 19:25:51 +0000679Py_GetExecPrefix(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000680{
Guido van Rossumeea14491997-08-13 21:30:44 +0000681 return Py_GetPrefix();
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000682}
683
684char *
Thomas Wouters78890102000-07-22 19:25:51 +0000685Py_GetProgramFullPath(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000686{
687 if (!module_search_path)
688 calculate_path();
689 return progpath;
690}