当它与site-packages冲突时,从当前目录中的子包导入模块

时间:2015-05-01 10:30:30

标签: python python-2.7 python-import python-module

我的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__.pya/b目录中添加a,以及当前目录本身。

如果我将第一个目录重命名为z,那么本地导入就会起作用(__init__.pyz以及适当更改的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已经包含模块了吗?我能以某种方式强迫它被覆盖吗?

0 个答案:

没有答案