我不明白为什么 Python 在这种情况下会抛出异常。我尝试从全局安装的包中导入,同时有一个与包名具有相同前缀的文件。我错过了什么?
$ touch fabric.py
$ python2
...
>>> from fabric.api import run
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named api
Python 有一个查找模块的位置路径:sys.path
['', ..., '/usr/lib/python2.7/site-packages/rsa-3.1.1-py2.7.egg', ...,
'/usr/lib/python2.7/site-packages', ...]
它从左到右搜索匹配的模块。
所以它首先找到本地模块。这没有属性api
。
如果本地模块被导入并且 site-packages 子模块作为其子模块被导入,这并不明显。
来自 Python 文档:
此名称将用于导入搜索的各个阶段,它可能是子模块的虚线路径,例如 foo.bar.baz。在这种情况下,Python 首先尝试导入 foo,然后是 foo.bar,最后是 foo.bar.baz。如果任何中间导入失败,则会引发 ModuleNotFoundError。
所以,import fabric.api
尝试加载你的fabric.py
第一个并成功,因为它找到了你的fabric.py
文件。接下来它会尝试加载api
它刚刚加载的内容,但这不起作用。
所以你fabric.py
正在影响fabric
全局包。