blob: 78f446599a26a9ff5df95b9ba73ff51ff197e622 [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
Georg Brandl7eb4b7d2005-07-22 21:49:32 +000014 * If the PYTHONPATH env. var. exists, its entries are added next.
Guido van Rossum88716bb2000-03-30 19:45:39 +000015
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
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000065#ifdef HAVE_SYS_TYPES_H
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000066#include <sys/types.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000067#endif /* HAVE_SYS_TYPES_H */
68
69#ifdef HAVE_SYS_STAT_H
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000070#include <sys/stat.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000071#endif /* HAVE_SYS_STAT_H */
72
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000073#include <string.h>
74
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000075/* Search in some common locations for the associated Python libraries.
76 *
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000077 * Py_GetPath() tries to return a sensible Python module search path.
78 *
Guido van Rossum42a97441998-02-19 21:00:45 +000079 * The approach is an adaptation for Windows of the strategy used in
80 * ../Modules/getpath.c; it uses the Windows Registry as one of its
81 * information sources.
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000082 */
83
84#ifndef LANDMARK
Jeremy Hylton847a9962000-05-26 21:49:07 +000085#define LANDMARK "lib\\os.py"
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000086#endif
87
88static char prefix[MAXPATHLEN+1];
89static char progpath[MAXPATHLEN+1];
Just van Rossum52e14d62002-12-30 22:08:05 +000090static char dllpath[MAXPATHLEN+1];
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000091static char *module_search_path = NULL;
92
Guido van Rossumeea14491997-08-13 21:30:44 +000093
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000094static int
Thomas Wouters78890102000-07-22 19:25:51 +000095is_sep(char ch) /* determine if "ch" is a separator character */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +000096{
97#ifdef ALTSEP
98 return ch == SEP || ch == ALTSEP;
99#else
100 return ch == SEP;
101#endif
102}
103
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000104/* assumes 'dir' null terminated in bounds. Never writes
105 beyond existing terminator.
106*/
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000107static void
Thomas Wouters78890102000-07-22 19:25:51 +0000108reduce(char *dir)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000109{
Guido van Rossum1c44e282000-06-28 22:20:06 +0000110 size_t i = strlen(dir);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000111 while (i > 0 && !is_sep(dir[i]))
112 --i;
113 dir[i] = '\0';
114}
115
116
117static int
Thomas Wouters78890102000-07-22 19:25:51 +0000118exists(char *filename)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000119{
120 struct stat buf;
121 return stat(filename, &buf) == 0;
122}
123
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000124/* Assumes 'filename' MAXPATHLEN+1 bytes long -
125 may extend 'filename' by one character.
126*/
Guido van Rossum43ff1141998-08-08 23:40:40 +0000127static int
Thomas Wouters78890102000-07-22 19:25:51 +0000128ismodule(char *filename) /* Is module -- check for .pyc/.pyo too */
Guido van Rossum43ff1141998-08-08 23:40:40 +0000129{
130 if (exists(filename))
131 return 1;
132
133 /* Check for the compiled version of prefix. */
134 if (strlen(filename) < MAXPATHLEN) {
135 strcat(filename, Py_OptimizeFlag ? "o" : "c");
136 if (exists(filename))
137 return 1;
138 }
139 return 0;
140}
141
Tim Peters8484fbf2004-08-07 19:12:27 +0000142/* Add a path component, by appending stuff to buffer.
143 buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a
144 NUL-terminated string with no more than MAXPATHLEN characters (not counting
145 the trailing NUL). It's a fatal error if it contains a string longer than
146 that (callers must be careful!). If these requirements are met, it's
147 guaranteed that buffer will still be a NUL-terminated string with no more
148 than MAXPATHLEN characters at exit. If stuff is too long, only as much of
149 stuff as fits will be appended.
150*/
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000151static void
Thomas Wouters78890102000-07-22 19:25:51 +0000152join(char *buffer, char *stuff)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000153{
Guido van Rossum1c44e282000-06-28 22:20:06 +0000154 size_t n, k;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000155 if (is_sep(stuff[0]))
156 n = 0;
157 else {
158 n = strlen(buffer);
159 if (n > 0 && !is_sep(buffer[n-1]) && n < MAXPATHLEN)
160 buffer[n++] = SEP;
161 }
Tim Peters8484fbf2004-08-07 19:12:27 +0000162 if (n > MAXPATHLEN)
163 Py_FatalError("buffer overflow in getpathp.c's joinpath()");
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000164 k = strlen(stuff);
165 if (n + k > MAXPATHLEN)
166 k = MAXPATHLEN - n;
167 strncpy(buffer+n, stuff, k);
168 buffer[n+k] = '\0';
169}
170
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000171/* gotlandmark only called by search_for_prefix, which ensures
172 'prefix' is null terminated in bounds. join() ensures
173 'landmark' can not overflow prefix if too long.
174*/
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000175static int
Thomas Wouters78890102000-07-22 19:25:51 +0000176gotlandmark(char *landmark)
Guido van Rossume02e48b2000-03-29 01:49:47 +0000177{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000178 int ok;
179 Py_ssize_t n;
Guido van Rossume02e48b2000-03-29 01:49:47 +0000180
181 n = strlen(prefix);
182 join(prefix, landmark);
183 ok = ismodule(prefix);
184 prefix[n] = '\0';
185 return ok;
186}
187
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000188/* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd.
189 assumption provided by only caller, calculate_path() */
Guido van Rossume02e48b2000-03-29 01:49:47 +0000190static int
Thomas Wouters78890102000-07-22 19:25:51 +0000191search_for_prefix(char *argv0_path, char *landmark)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000192{
Guido van Rossume02e48b2000-03-29 01:49:47 +0000193 /* Search from argv0_path, until landmark is found */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000194 strcpy(prefix, argv0_path);
195 do {
Guido van Rossume02e48b2000-03-29 01:49:47 +0000196 if (gotlandmark(landmark))
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000197 return 1;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000198 reduce(prefix);
199 } while (prefix[0]);
200 return 0;
201}
202
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000203#ifdef MS_WINDOWS
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000204#ifdef Py_ENABLE_SHARED
Guido van Rossum43ff1141998-08-08 23:40:40 +0000205
Guido van Rossum88716bb2000-03-30 19:45:39 +0000206/* a string loaded from the DLL at startup.*/
207extern const char *PyWin_DLLVersionString;
Guido van Rossum271f9771997-09-29 23:39:31 +0000208
Guido van Rossumeea14491997-08-13 21:30:44 +0000209
210/* Load a PYTHONPATH value from the registry.
211 Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER.
212
Guido van Rossum88716bb2000-03-30 19:45:39 +0000213 Works in both Unicode and 8bit environments. Only uses the
214 Ex family of functions so it also works with Windows CE.
215
Guido van Rossumeea14491997-08-13 21:30:44 +0000216 Returns NULL, or a pointer that should be freed.
Mark Hammond5edc6272001-02-23 11:38:38 +0000217
218 XXX - this code is pretty strange, as it used to also
219 work on Win16, where the buffer sizes werent available
220 in advance. It could be simplied now Win16/Win32s is dead!
Guido van Rossumeea14491997-08-13 21:30:44 +0000221*/
222
223static char *
Guido van Rossum88716bb2000-03-30 19:45:39 +0000224getpythonregpath(HKEY keyBase, int skipcore)
Guido van Rossumeea14491997-08-13 21:30:44 +0000225{
226 HKEY newKey = 0;
Guido van Rossumeea14491997-08-13 21:30:44 +0000227 DWORD dataSize = 0;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000228 DWORD numKeys = 0;
Guido van Rossumeea14491997-08-13 21:30:44 +0000229 LONG rc;
230 char *retval = NULL;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000231 TCHAR *dataBuf = NULL;
232 static const TCHAR keyPrefix[] = _T("Software\\Python\\PythonCore\\");
233 static const TCHAR keySuffix[] = _T("\\PythonPath");
Guido van Rossum1c44e282000-06-28 22:20:06 +0000234 size_t versionLen;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000235 DWORD index;
236 TCHAR *keyBuf = NULL;
237 TCHAR *keyBufPtr;
238 TCHAR **ppPaths = NULL;
Guido van Rossum271f9771997-09-29 23:39:31 +0000239
Guido van Rossum88716bb2000-03-30 19:45:39 +0000240 /* Tried to use sysget("winver") but here is too early :-( */
241 versionLen = _tcslen(PyWin_DLLVersionString);
242 /* Space for all the chars, plus one \0 */
243 keyBuf = keyBufPtr = malloc(sizeof(keyPrefix) +
244 sizeof(TCHAR)*(versionLen-1) +
245 sizeof(keySuffix));
246 if (keyBuf==NULL) goto done;
Guido van Rossum271f9771997-09-29 23:39:31 +0000247
Guido van Rossum88716bb2000-03-30 19:45:39 +0000248 memcpy(keyBufPtr, keyPrefix, sizeof(keyPrefix)-sizeof(TCHAR));
249 keyBufPtr += sizeof(keyPrefix)/sizeof(TCHAR) - 1;
250 memcpy(keyBufPtr, PyWin_DLLVersionString, versionLen * sizeof(TCHAR));
251 keyBufPtr += versionLen;
252 /* NULL comes with this one! */
253 memcpy(keyBufPtr, keySuffix, sizeof(keySuffix));
254 /* Open the root Python key */
255 rc=RegOpenKeyEx(keyBase,
256 keyBuf, /* subkey */
257 0, /* reserved */
258 KEY_READ,
259 &newKey);
260 if (rc!=ERROR_SUCCESS) goto done;
261 /* Find out how big our core buffer is, and how many subkeys we have */
262 rc = RegQueryInfoKey(newKey, NULL, NULL, NULL, &numKeys, NULL, NULL,
263 NULL, NULL, &dataSize, NULL, NULL);
264 if (rc!=ERROR_SUCCESS) goto done;
265 if (skipcore) dataSize = 0; /* Only count core ones if we want them! */
266 /* Allocate a temp array of char buffers, so we only need to loop
267 reading the registry once
268 */
269 ppPaths = malloc( sizeof(TCHAR *) * numKeys );
270 if (ppPaths==NULL) goto done;
271 memset(ppPaths, 0, sizeof(TCHAR *) * numKeys);
272 /* Loop over all subkeys, allocating a temp sub-buffer. */
273 for(index=0;index<numKeys;index++) {
274 TCHAR keyBuf[MAX_PATH+1];
275 HKEY subKey = 0;
276 DWORD reqdSize = MAX_PATH+1;
277 /* Get the sub-key name */
278 DWORD rc = RegEnumKeyEx(newKey, index, keyBuf, &reqdSize,
279 NULL, NULL, NULL, NULL );
280 if (rc!=ERROR_SUCCESS) goto done;
281 /* Open the sub-key */
282 rc=RegOpenKeyEx(newKey,
283 keyBuf, /* subkey */
284 0, /* reserved */
285 KEY_READ,
286 &subKey);
287 if (rc!=ERROR_SUCCESS) goto done;
288 /* Find the value of the buffer size, malloc, then read it */
289 RegQueryValueEx(subKey, NULL, 0, NULL, NULL, &reqdSize);
290 if (reqdSize) {
291 ppPaths[index] = malloc(reqdSize);
292 if (ppPaths[index]) {
Mark Hammonde61aca72000-09-10 09:14:53 +0000293 RegQueryValueEx(subKey, NULL, 0, NULL,
294 (LPBYTE)ppPaths[index],
295 &reqdSize);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000296 dataSize += reqdSize + 1; /* 1 for the ";" */
Guido van Rossumeea14491997-08-13 21:30:44 +0000297 }
298 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000299 RegCloseKey(subKey);
Guido van Rossumeea14491997-08-13 21:30:44 +0000300 }
Martin v. Löwisd22968a2006-07-24 11:54:53 +0000301
302 /* return null if no path to return */
303 if (dataSize == 0) goto done;
304
Mark Hammond5edc6272001-02-23 11:38:38 +0000305 /* original datasize from RegQueryInfo doesn't include the \0 */
Guido van Rossum88716bb2000-03-30 19:45:39 +0000306 dataBuf = malloc((dataSize+1) * sizeof(TCHAR));
307 if (dataBuf) {
308 TCHAR *szCur = dataBuf;
309 DWORD reqdSize = dataSize;
310 /* Copy our collected strings */
311 for (index=0;index<numKeys;index++) {
Guido van Rossum88716bb2000-03-30 19:45:39 +0000312 if (index > 0) {
313 *(szCur++) = _T(';');
314 dataSize--;
315 }
Mark Hammonde61aca72000-09-10 09:14:53 +0000316 if (ppPaths[index]) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000317 Py_ssize_t len = _tcslen(ppPaths[index]);
Mark Hammonde61aca72000-09-10 09:14:53 +0000318 _tcsncpy(szCur, ppPaths[index], len);
319 szCur += len;
Tim Petersc7f6cf62006-02-16 00:35:06 +0000320 assert(dataSize > (DWORD)len);
321 dataSize -= (DWORD)len;
Mark Hammonde61aca72000-09-10 09:14:53 +0000322 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000323 }
324 if (skipcore)
325 *szCur = '\0';
326 else {
Mark Hammond5edc6272001-02-23 11:38:38 +0000327 /* If we have no values, we dont need a ';' */
328 if (numKeys) {
329 *(szCur++) = _T(';');
330 dataSize--;
331 }
Mark Hammonde61aca72000-09-10 09:14:53 +0000332 /* Now append the core path entries -
333 this will include the NULL
334 */
335 rc = RegQueryValueEx(newKey, NULL, 0, NULL,
336 (LPBYTE)szCur, &dataSize);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000337 }
338 /* And set the result - caller must free
339 If MBCS, it is fine as is. If Unicode, allocate new
340 buffer and convert.
341 */
342#ifdef UNICODE
343 retval = (char *)malloc(reqdSize+1);
344 if (retval)
345 WideCharToMultiByte(CP_ACP, 0,
346 dataBuf, -1, /* source */
Mark Hammond61bb35f2003-01-29 22:38:29 +0000347 retval, reqdSize+1, /* dest */
Guido van Rossum88716bb2000-03-30 19:45:39 +0000348 NULL, NULL);
349 free(dataBuf);
350#else
351 retval = dataBuf;
352#endif
353 }
354done:
355 /* Loop freeing my temp buffers */
356 if (ppPaths) {
357 for(index=0;index<numKeys;index++)
358 if (ppPaths[index]) free(ppPaths[index]);
359 free(ppPaths);
360 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000361 if (newKey)
362 RegCloseKey(newKey);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000363 if (keyBuf)
364 free(keyBuf);
Guido van Rossumeea14491997-08-13 21:30:44 +0000365 return retval;
366}
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000367#endif /* Py_ENABLE_SHARED */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000368#endif /* MS_WINDOWS */
Guido van Rossumeea14491997-08-13 21:30:44 +0000369
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000370static void
Thomas Wouters78890102000-07-22 19:25:51 +0000371get_progpath(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000372{
Thomas Woutersa5345942000-07-22 23:59:33 +0000373 extern char *Py_GetProgramName(void);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000374 char *path = getenv("PATH");
375 char *prog = Py_GetProgramName();
376
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000377#ifdef MS_WINDOWS
Just van Rossum52e14d62002-12-30 22:08:05 +0000378 extern HANDLE PyWin_DLLhModule;
Guido van Rossum88716bb2000-03-30 19:45:39 +0000379#ifdef UNICODE
380 WCHAR wprogpath[MAXPATHLEN+1];
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000381 /* Windows documents that GetModuleFileName() will "truncate",
382 but makes no mention of the null terminator. Play it safe.
383 PLUS Windows itself defines MAX_PATH as the same, but anyway...
384 */
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000385#ifdef Py_ENABLE_SHARED
Mark Hammond2795dae2002-07-22 13:28:21 +0000386 wprogpath[MAXPATHLEN]=_T('\0');
Just van Rossum52e14d62002-12-30 22:08:05 +0000387 if (PyWin_DLLhModule &&
388 GetModuleFileName(PyWin_DLLhModule, wprogpath, MAXPATHLEN)) {
389 WideCharToMultiByte(CP_ACP, 0,
390 wprogpath, -1,
391 dllpath, MAXPATHLEN+1,
392 NULL, NULL);
393 }
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000394#else
395 dllpath[0] = 0;
396#endif
Thomas Heller6019f9a2003-08-18 17:53:33 +0000397 wprogpath[MAXPATHLEN]=_T('\0');
Guido van Rossum88716bb2000-03-30 19:45:39 +0000398 if (GetModuleFileName(NULL, wprogpath, MAXPATHLEN)) {
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000399 WideCharToMultiByte(CP_ACP, 0,
400 wprogpath, -1,
401 progpath, MAXPATHLEN+1,
402 NULL, NULL);
Guido van Rossum88716bb2000-03-30 19:45:39 +0000403 return;
404 }
405#else
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000406 /* static init of progpath ensures final char remains \0 */
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000407#ifdef Py_ENABLE_SHARED
Just van Rossum52e14d62002-12-30 22:08:05 +0000408 if (PyWin_DLLhModule)
409 if (!GetModuleFileName(PyWin_DLLhModule, dllpath, MAXPATHLEN))
410 dllpath[0] = 0;
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000411#else
412 dllpath[0] = 0;
413#endif
Guido van Rossumeea14491997-08-13 21:30:44 +0000414 if (GetModuleFileName(NULL, progpath, MAXPATHLEN))
415 return;
416#endif
Guido van Rossum88716bb2000-03-30 19:45:39 +0000417#endif
Guido van Rossumeea14491997-08-13 21:30:44 +0000418 if (prog == NULL || *prog == '\0')
419 prog = "python";
420
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000421 /* If there is no slash in the argv0 path, then we have to
422 * assume python is on the user's $PATH, since there's no
423 * other way to find a directory to start the search from. If
424 * $PATH isn't exported, you lose.
425 */
426#ifdef ALTSEP
427 if (strchr(prog, SEP) || strchr(prog, ALTSEP))
428#else
429 if (strchr(prog, SEP))
430#endif
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000431 strncpy(progpath, prog, MAXPATHLEN);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000432 else if (path) {
433 while (1) {
434 char *delim = strchr(path, DELIM);
435
436 if (delim) {
Guido van Rossum1c44e282000-06-28 22:20:06 +0000437 size_t len = delim - path;
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000438 /* ensure we can't overwrite buffer */
439 len = min(MAXPATHLEN,len);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000440 strncpy(progpath, path, len);
441 *(progpath + len) = '\0';
442 }
443 else
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000444 strncpy(progpath, path, MAXPATHLEN);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000445
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000446 /* join() is safe for MAXPATHLEN+1 size buffer */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000447 join(progpath, prog);
448 if (exists(progpath))
449 break;
450
451 if (!delim) {
452 progpath[0] = '\0';
453 break;
454 }
455 path = delim + 1;
456 }
457 }
458 else
459 progpath[0] = '\0';
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000460}
461
462static void
Thomas Wouters78890102000-07-22 19:25:51 +0000463calculate_path(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000464{
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000465 char argv0_path[MAXPATHLEN+1];
466 char *buf;
Guido van Rossum1c44e282000-06-28 22:20:06 +0000467 size_t bufsz;
Guido van Rossum8b2b3ce1998-07-27 13:48:07 +0000468 char *pythonhome = Py_GetPythonHome();
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000469 char *envpath = Py_GETENV("PYTHONPATH");
Guido van Rossumeea14491997-08-13 21:30:44 +0000470
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000471#ifdef MS_WINDOWS
Guido van Rossum88716bb2000-03-30 19:45:39 +0000472 int skiphome, skipdefault;
Guido van Rossum43ff1141998-08-08 23:40:40 +0000473 char *machinepath = NULL;
474 char *userpath = NULL;
Just van Rossum52e14d62002-12-30 22:08:05 +0000475 char zip_path[MAXPATHLEN+1];
476 size_t len;
Guido van Rossumeea14491997-08-13 21:30:44 +0000477#endif
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000478
479 get_progpath();
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000480 /* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000481 strcpy(argv0_path, progpath);
482 reduce(argv0_path);
Guido van Rossumeea14491997-08-13 21:30:44 +0000483 if (pythonhome == NULL || *pythonhome == '\0') {
484 if (search_for_prefix(argv0_path, LANDMARK))
485 pythonhome = prefix;
Guido van Rossum43ff1141998-08-08 23:40:40 +0000486 else
487 pythonhome = NULL;
Guido van Rossumeea14491997-08-13 21:30:44 +0000488 }
489 else
Mark Hammond8bf9e3b2000-10-07 11:10:50 +0000490 strncpy(prefix, pythonhome, MAXPATHLEN);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000491
Guido van Rossumeea14491997-08-13 21:30:44 +0000492 if (envpath && *envpath == '\0')
493 envpath = NULL;
494
Guido van Rossume02e48b2000-03-29 01:49:47 +0000495
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000496#ifdef MS_WINDOWS
Just van Rossum52e14d62002-12-30 22:08:05 +0000497 /* Calculate zip archive path */
498 if (dllpath[0]) /* use name of python DLL */
499 strncpy(zip_path, dllpath, MAXPATHLEN);
500 else /* use name of executable program */
501 strncpy(zip_path, progpath, MAXPATHLEN);
Neal Norwitza8aed022002-12-31 12:35:41 +0000502 zip_path[MAXPATHLEN] = '\0';
Just van Rossum52e14d62002-12-30 22:08:05 +0000503 len = strlen(zip_path);
504 if (len > 4) {
505 zip_path[len-3] = 'z'; /* change ending to "zip" */
506 zip_path[len-2] = 'i';
507 zip_path[len-1] = 'p';
508 }
509 else {
510 zip_path[0] = 0;
511 }
512
Guido van Rossum88716bb2000-03-30 19:45:39 +0000513 skiphome = pythonhome==NULL ? 0 : 1;
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000514#ifdef Py_ENABLE_SHARED
Guido van Rossum88716bb2000-03-30 19:45:39 +0000515 machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome);
516 userpath = getpythonregpath(HKEY_CURRENT_USER, skiphome);
Martin v. Löwisfee1c7f2009-02-02 14:23:16 +0000517#endif
Guido van Rossum88716bb2000-03-30 19:45:39 +0000518 /* We only use the default relative PYTHONPATH if we havent
519 anything better to use! */
520 skipdefault = envpath!=NULL || pythonhome!=NULL || \
521 machinepath!=NULL || userpath!=NULL;
Guido van Rossum43ff1141998-08-08 23:40:40 +0000522#endif
523
524 /* We need to construct a path from the following parts.
Guido van Rossumeea14491997-08-13 21:30:44 +0000525 (1) the PYTHONPATH environment variable, if set;
Just van Rossum52e14d62002-12-30 22:08:05 +0000526 (2) for Win32, the zip archive file path;
527 (3) for Win32, the machinepath and userpath, if set;
528 (4) the PYTHONPATH config macro, with the leading "."
Guido van Rossumeea14491997-08-13 21:30:44 +0000529 of each component replaced with pythonhome, if set;
Just van Rossum52e14d62002-12-30 22:08:05 +0000530 (5) the directory containing the executable (argv0_path).
531 The length calculation calculates #4 first.
Guido van Rossum43ff1141998-08-08 23:40:40 +0000532 Extra rules:
Just van Rossum52e14d62002-12-30 22:08:05 +0000533 - If PYTHONHOME is set (in any way) item (3) is ignored.
534 - If registry values are used, (4) and (5) are ignored.
Guido van Rossumeea14491997-08-13 21:30:44 +0000535 */
536
537 /* Calculate size of return buffer */
538 if (pythonhome != NULL) {
539 char *p;
540 bufsz = 1;
541 for (p = PYTHONPATH; *p; p++) {
542 if (*p == DELIM)
543 bufsz++; /* number of DELIM plus one */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000544 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000545 bufsz *= strlen(pythonhome);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000546 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000547 else
548 bufsz = 0;
Guido van Rossum691d2ad1997-12-11 02:32:43 +0000549 bufsz += strlen(PYTHONPATH) + 1;
Guido van Rossum8f1b6511997-08-13 19:55:43 +0000550 bufsz += strlen(argv0_path) + 1;
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000551#ifdef MS_WINDOWS
Guido van Rossumeea14491997-08-13 21:30:44 +0000552 if (userpath)
553 bufsz += strlen(userpath) + 1;
Guido van Rossum67ab6721998-08-08 19:58:59 +0000554 if (machinepath)
555 bufsz += strlen(machinepath) + 1;
Just van Rossum52e14d62002-12-30 22:08:05 +0000556 bufsz += strlen(zip_path) + 1;
Guido van Rossumeea14491997-08-13 21:30:44 +0000557#endif
Guido van Rossum67ab6721998-08-08 19:58:59 +0000558 if (envpath != NULL)
559 bufsz += strlen(envpath) + 1;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000560
561 module_search_path = buf = malloc(bufsz);
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000562 if (buf == NULL) {
563 /* We can't exit, so print a warning and limp along */
Guido van Rossumeea14491997-08-13 21:30:44 +0000564 fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n");
565 if (envpath) {
Guido van Rossume02e48b2000-03-29 01:49:47 +0000566 fprintf(stderr, "Using environment $PYTHONPATH.\n");
Guido van Rossumeea14491997-08-13 21:30:44 +0000567 module_search_path = envpath;
568 }
569 else {
Guido van Rossume02e48b2000-03-29 01:49:47 +0000570 fprintf(stderr, "Using default static path.\n");
Guido van Rossumeea14491997-08-13 21:30:44 +0000571 module_search_path = PYTHONPATH;
572 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000573#ifdef MS_WINDOWS
Guido van Rossum42a97441998-02-19 21:00:45 +0000574 if (machinepath)
575 free(machinepath);
576 if (userpath)
577 free(userpath);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000578#endif /* MS_WINDOWS */
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000579 return;
580 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000581
582 if (envpath) {
583 strcpy(buf, envpath);
584 buf = strchr(buf, '\0');
585 *buf++ = DELIM;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000586 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000587#ifdef MS_WINDOWS
Just van Rossum52e14d62002-12-30 22:08:05 +0000588 if (zip_path[0]) {
589 strcpy(buf, zip_path);
590 buf = strchr(buf, '\0');
591 *buf++ = DELIM;
592 }
Guido van Rossum67ab6721998-08-08 19:58:59 +0000593 if (userpath) {
594 strcpy(buf, userpath);
595 buf = strchr(buf, '\0');
596 *buf++ = DELIM;
597 free(userpath);
598 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000599 if (machinepath) {
600 strcpy(buf, machinepath);
601 buf = strchr(buf, '\0');
602 *buf++ = DELIM;
Guido van Rossum42a97441998-02-19 21:00:45 +0000603 free(machinepath);
Guido van Rossume02e48b2000-03-29 01:49:47 +0000604 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000605 if (pythonhome == NULL) {
606 if (!skipdefault) {
607 strcpy(buf, PYTHONPATH);
608 buf = strchr(buf, '\0');
609 }
Guido van Rossumeea14491997-08-13 21:30:44 +0000610 }
Guido van Rossum88716bb2000-03-30 19:45:39 +0000611#else
Guido van Rossumeea14491997-08-13 21:30:44 +0000612 if (pythonhome == NULL) {
613 strcpy(buf, PYTHONPATH);
614 buf = strchr(buf, '\0');
615 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000616#endif /* MS_WINDOWS */
Guido van Rossumeea14491997-08-13 21:30:44 +0000617 else {
618 char *p = PYTHONPATH;
619 char *q;
Guido van Rossum1c44e282000-06-28 22:20:06 +0000620 size_t n;
Guido van Rossumeea14491997-08-13 21:30:44 +0000621 for (;;) {
622 q = strchr(p, DELIM);
623 if (q == NULL)
624 n = strlen(p);
625 else
626 n = q-p;
627 if (p[0] == '.' && is_sep(p[1])) {
628 strcpy(buf, pythonhome);
629 buf = strchr(buf, '\0');
630 p++;
631 n--;
632 }
633 strncpy(buf, p, n);
634 buf += n;
635 if (q == NULL)
636 break;
637 *buf++ = DELIM;
638 p = q+1;
639 }
640 }
641 if (argv0_path) {
642 *buf++ = DELIM;
643 strcpy(buf, argv0_path);
644 buf = strchr(buf, '\0');
645 }
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000646 *buf = '\0';
Mark Hammond19fdbfb2001-09-07 14:08:01 +0000647 /* Now to pull one last hack/trick. If sys.prefix is
648 empty, then try and find it somewhere on the paths
649 we calculated. We scan backwards, as our general policy
650 is that Python core directories are at the *end* of
651 sys.path. We assume that our "lib" directory is
652 on the path, and that our 'prefix' directory is
653 the parent of that.
654 */
655 if (*prefix=='\0') {
656 char lookBuf[MAXPATHLEN+1];
657 char *look = buf - 1; /* 'buf' is at the end of the buffer */
658 while (1) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000659 Py_ssize_t nchars;
Mark Hammond19fdbfb2001-09-07 14:08:01 +0000660 char *lookEnd = look;
661 /* 'look' will end up one character before the
662 start of the path in question - even if this
663 is one character before the start of the buffer
664 */
Kristján Valur Jónsson019fcbc2007-04-13 22:20:13 +0000665 while (look >= module_search_path && *look != DELIM)
Mark Hammond19fdbfb2001-09-07 14:08:01 +0000666 look--;
667 nchars = lookEnd-look;
668 strncpy(lookBuf, look+1, nchars);
669 lookBuf[nchars] = '\0';
670 /* Up one level to the parent */
671 reduce(lookBuf);
672 if (search_for_prefix(lookBuf, LANDMARK)) {
673 break;
674 }
675 /* If we are out of paths to search - give up */
676 if (look < module_search_path)
677 break;
678 look--;
679 }
680 }
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000681}
682
683
684/* External interface */
685
686char *
Thomas Wouters78890102000-07-22 19:25:51 +0000687Py_GetPath(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000688{
689 if (!module_search_path)
690 calculate_path();
691 return module_search_path;
692}
693
694char *
Thomas Wouters78890102000-07-22 19:25:51 +0000695Py_GetPrefix(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000696{
Guido van Rossumeea14491997-08-13 21:30:44 +0000697 if (!module_search_path)
698 calculate_path();
699 return prefix;
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000700}
701
702char *
Thomas Wouters78890102000-07-22 19:25:51 +0000703Py_GetExecPrefix(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000704{
Guido van Rossumeea14491997-08-13 21:30:44 +0000705 return Py_GetPrefix();
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000706}
707
708char *
Thomas Wouters78890102000-07-22 19:25:51 +0000709Py_GetProgramFullPath(void)
Guido van Rossum1aa7e3a1997-05-19 14:16:21 +0000710{
711 if (!module_search_path)
712 calculate_path();
713 return progpath;
714}