Python 突如其来的恐怖
我不明白Python为什么在这种情况下抛出异常。我尝试从全局安装的包中导入,同时存在一个前缀与包名相同的文件。我错过了什么Python 突如其来的恐怖,python,import,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 ap
$ 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
$touch fabric.py
$python2
...
>>>从fabric.api导入运行
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为api的模块
来自Python文档:
该名称将在导入搜索的各个阶段使用,它可能是子模块的虚线路径,例如foo.bar.baz。在本例中,Python首先尝试导入foo,然后是foo.bar,最后是foo.bar.baz。如果任何中间导入失败,将引发ModuleNotFoundError。
因此,import fabric.api
首先尝试加载您的fabric.py
并成功,因为它找到了您的fabric.py
文件。接下来,它尝试在刚刚加载的内容中加载api
,但这不起作用
因此,您的fabric.py
正在跟踪fabric
全局包
此处有更多详细信息:Python有一个查找模块的位置路径:
sys.path
['', ..., '/usr/lib/python2.7/site-packages/rsa-3.1.1-py2.7.egg', ...,
'/usr/lib/python2.7/site-packages', ...]
它从左到右搜索匹配的模块
所以它首先找到本地模块。
它没有属性api
如果本地模块被导入,而站点包子模块作为其子模块被导入,则不明显。它不是“导入结构”,而是“导入结构.api”,这意味着hierarchy@planetp我编辑了我的答案,试图让它更完整一点:)我想我开始明白了。最困难的部分是忘记我的Perl背景:)那么
module.submodule
可以是带有属性的模块,也可以是包?