意外的ImportError

时间:2013-06-28 09:17:41

标签: python import

我不明白为什么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

2 个答案:

答案 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全局包。

此处有更多详情:http://docs.python.org/dev/reference/import.html

答案 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子模块作为其子模块是不明显的。