我的e
目录中的a.b.c.d
个包中有模块site-packages
:
/usr/lib/python2.7/site-packages/a/b/c/__init__.py
/usr/lib/python2.7/site-packages/a/b/c/d/__init__.py
/usr/lib/python2.7/site-packages/a/b/c/d/e.py
在这两种情况下, __init__.py
都是空的。我在当前目录中镜像了这个目录结构:
a/b/c/__init__.py
a/b/c/d/__init__.py
a/b/c/d/e.py
我运行python 2.7并输入:
from a.b.c.d.e import foo
导入site-packages
版本而不是本地版本。 sys.path[0]
是空字符串。我希望并在文档/ Google中找到当前目录优先于此。我还尝试在当前目录的__init__.py
和a/b
目录中添加a
,以及当前目录本身。
如果我将第一个目录重命名为z
,那么本地导入就会起作用(__init__.py
和z
以及适当更改的import语句的额外b
就位了
site-packages
包含a.b.c-VERSION-nspkg.pth
:
import sys,types,os; p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('a',)); ie = os.path.exists(os.path.join(p,'__init__.py')); m = not ie and sys.modules.setdefault('a',types.ModuleType('a')); mp = (m or []) and m.__dict__.setdefault('__path__',[]); (p not in mp) and mp.append(p)
import sys,types,os; p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('a', 'b')); ie = os.path.exists(os.path.join(p,'__init__.py')); m = not ie and sys.modules.setdefault('a.b',types.ModuleType('a.b')); mp = (m or []) and m.__dict__.setdefault('__path__',[]); (p not in mp) and mp.append(p); m and setattr(sys.modules['a'], 'b', m)
为什么我不能像这样覆盖模块?是因为sys.modules
已经包含模块了吗?我能以某种方式强迫它被覆盖吗?