0

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

2 回答 2

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 子模块作为其子模块被导入,这并不明显。

于 2013-06-28T09:52:40.317 回答
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

于 2013-06-28T09:21:24.547 回答