Python 3.4.6和3.5.2之间的Python导入阴影似乎不同:
$ cat time.py
from time import time
$ pyenv global 3.4.6
$ python -V
Python 3.4.6
$ python time.py
Traceback (most recent call last):
File "time.py", line 1, in <module>
from time import time
File "/home/vagrant/tmp/time.py", line 1, in <module>
from time import time
ImportError: cannot import name 'time'
$ pyenv global 3.5.2
$ python -V
Python 3.5.2
$ python time.py
$ echo no error
no error
问题1:为什么......那些东西?
问题2:更新日志中有什么内容吗?我找不到任何东西......
答案 0 :(得分:6)
导入名为
spam
的模块时,解释程序首先搜索 对于具有该名称的内置模块。如果没有找到,则搜索 对于由。给出的目录列表中名为spam.py
的文件 变量sys.path
。
(强调我的)
time
并不是Python 3.4中的内置模块模块,但在Python 3.5中有所改变:
me@temp:~$ python3.4 -c 'import sys; print("time" in sys.builtin_module_names)'
False
me@temp:~$ python3.5 -c 'import sys; print("time" in sys.builtin_module_names)'
True
您可以看到引入更改here的补丁(与issue 5309相关)。考虑到更改日志mentions the issue 5309,但没有重新说明。在time
模块中,可以肯定地说这个变化是副作用,是CPython的实现细节。
由于time
不是CPython 3.4中的内置模块,而sys.path
中的第一个目录是当前脚本目录,from time import time
会尝试导入{{1}来自time
文件的属性,但失败并抛出time.py
。
在CPython 3.5中ImportError
是内置模块。根据上面的引用,运行time
成功导入内置模块,而不在from time import time
上搜索模块。
如果从标准库隐藏非内置模块,CPython版本都会引发相同的错误,例如sys.path
:
inspect