New policy for package imports: only a directory containing

__init__.py (or __init__.pyc/.pyo, whichever applies) is considered a
package.  All other subdirectories are left alone.  Should make Konrad
Hinsen happy!
This commit is contained in:
Guido van Rossum 1997-10-31 18:38:52 +00:00
parent 771c6c8f7a
commit 197346fafe

View file

@ -636,6 +636,8 @@ is_builtin(name)
extern FILE *PyWin_FindRegisteredModule(); extern FILE *PyWin_FindRegisteredModule();
#endif #endif
static int find_init_module Py_PROTO((char *)); /* Forward */
static struct filedescr * static struct filedescr *
find_module(name, path, buf, buflen, p_fp) find_module(name, path, buf, buflen, p_fp)
char *name; char *name;
@ -733,8 +735,10 @@ find_module(name, path, buf, buflen, p_fp)
#ifdef HAVE_STAT #ifdef HAVE_STAT
if (stat(buf, &statbuf) == 0) { if (stat(buf, &statbuf) == 0) {
static struct filedescr fd = {"", "", PKG_DIRECTORY}; static struct filedescr fd = {"", "", PKG_DIRECTORY};
if (S_ISDIR(statbuf.st_mode)) if (S_ISDIR(statbuf.st_mode)) {
return &fd; if (find_init_module(buf))
return &fd;
}
} }
#else #else
/* XXX How are you going to test for directories? */ /* XXX How are you going to test for directories? */
@ -766,6 +770,38 @@ find_module(name, path, buf, buflen, p_fp)
return fdp; return fdp;
} }
#ifdef HAVE_STAT
/* Helper to look for __init__.py or __init__.py[co] in potential package */
static int
find_init_module(buf)
char *buf;
{
int save_len = strlen(buf);
int i = save_len;
struct stat statbuf;
if (save_len + 13 >= MAXPATHLEN)
return 0;
buf[i++] = SEP;
strcpy(buf+i, "__init__.py");
if (stat(buf, &statbuf) == 0) {
buf[save_len] = '\0';
return 1;
}
i += strlen(buf+i);
if (Py_OptimizeFlag)
strcpy(buf+i, "o");
else
strcpy(buf+i, "c");
if (stat(buf, &statbuf) == 0) {
buf[save_len] = '\0';
return 1;
}
buf[save_len] = '\0';
return 0;
}
#endif /* HAVE_STAT */
static int init_builtin Py_PROTO((char *)); /* Forward */ static int init_builtin Py_PROTO((char *)); /* Forward */