为了账号安全,请及时绑定邮箱和手机立即绑定

绝对导入如何与 sitecustomize.py 中的不相关导入一起使用?

绝对导入如何与 sitecustomize.py 中的不相关导入一起使用?

蛊毒传说 2022-07-26 09:22:35
我有一个带有不幸命名模块的包:(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


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信