我有一個(gè)帶有不幸命名模塊的包:(dev) go|c:\srv\tmp\absimp> tree myappmyapp|-- __init__.py|-- calendar.py`-- tst.py有內(nèi)容__init__.py: 空的。myapp\calendar.py:from __future__ import print_functionprint("imported:", __file__)myapp\tst.py(第二行打印當(dāng)前工作目錄(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想要導(dǎo)入 Python 的全局calendar模塊,所以我啟用absolute_import了它,但沒有將其導(dǎo)入為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并重新運(yùn)行上面的命令,我現(xiàn)在得到了全局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貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是因?yàn)開strptime導(dǎo)入calendar本身,甚至在主腳本的路徑放在 上之前PATH,因?yàn)槟付▽?dǎo)入sitecustomize.py(這些導(dǎo)入是預(yù)先完成的)。現(xiàn)在calendar已經(jīng)在模塊緩存中,因此不會(huì)再次導(dǎo)入,但緩存中的那個(gè)將被重用:
>>> import sys
>>> 'calendar' in sys.modules
False
>>> import _strptime
>>> 'calendar' in sys.modules
True
事實(shí)上,無論存儲(chǔ)什么類型的對(duì)象,sys.modules它都會(huì)以模塊名稱作為鍵來匹配。例如:
>>> import sys
>>> sys.modules['calendar'] = 'foo'
>>> import calendar
>>> print(calendar)
foo
添加回答
舉報(bào)
0/150
提交
取消