我有一个带有不幸命名模块的包:(dev) go|c:\srv\tmp\absimp> tree myappmyapp|-- __init__.py|-- calendar.py`-- tst.py有内容__init__.py: 空的。myapp\calendar.py:from __future__ import print_functionprint("imported:", __file__)myapp\tst.py(第二行打印当前工作目录(cwd)和 cwd 下所有在 python 模块搜索路径上的目录:from __future__ import print_function, absolute_importimport sys,os; cwd=os.getcwd(); print("CWD:", cwd, "PATH:", [p for p in sys.path if p.startswith(cwd)])import calendarprint("CALENDAR from myapp/tst:", calendar.__file__)myapp\tst.py想要导入 Python 的全局calendar模块,所以我启用absolute_import了它,但没有将其导入为from . import calendar.站在 myapp 目录之外,我仍然得到本地calendar.py(Pythons 2.7.16 和 3.8.0 - 输出相同):(dev) go|c:\srv\tmp\absimp> python myapp\tst.pyCWD: c:\srv\tmp\absimp PATH: ['c:\\srv\\tmp\\absimp\\myapp']imported: c:\srv\tmp\absimp\myapp\calendar.pyCALENDAR from myapp/tst: c:\srv\tmp\absimp\myapp\calendar.py从第一行输出我看到 Python 已将tst.py's 目录添加到sys.path.如果我编辑我的sitecustomize.py文件,添加import _strptime并重新运行上面的命令,我现在得到了全局calendar...:(dev) go|c:\srv\tmp\absimp> python myapp\tst.pyCWD: c:\srv\tmp\absimp PATH: ['c:\\srv\\tmp\\absimp\\myapp']CALENDAR from myapp/tst: c:\python27\Lib\calendar.pyc到底是怎么回事?
1 回答
森林海
TA贡献2011条经验 获得超2个赞
这是因为_strptime导入calendar本身,甚至在主脚本的路径放在 上之前PATH,因为您指定导入sitecustomize.py(这些导入是预先完成的)。现在calendar已经在模块缓存中,因此不会再次导入,但缓存中的那个将被重用:
>>> import sys
>>> 'calendar' in sys.modules
False
>>> import _strptime
>>> 'calendar' in sys.modules
True
事实上,无论存储什么类型的对象,sys.modules它都会以模块名称作为键来匹配。例如:
>>> import sys
>>> sys.modules['calendar'] = 'foo'
>>> import calendar
>>> print(calendar)
foo
添加回答
举报
0/150
提交
取消