我不明白为什么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
答案 0 :(得分:0)
来自Python文档:
此名称将用于导入搜索的各个阶段,它可能是子模块的虚线路径,例如foo.bar.baz。在这种情况下, Python首先尝试导入foo,然后导入foo.bar,最后导入foo.bar.baz。如果任何中间导入失败,则会引发ModuleNotFoundError。
因此,import fabric.api
尝试首先加载fabric.py
并成功,因为它找到了您的fabric.py
文件。接下来,它会尝试在刚加载的内容中加载api
,但这不起作用。
因此,fabric.py
正在影响fabric
全局包。
答案 1 :(得分:0)
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子模块作为其子模块是不明显的。