Har*_*nam 0 python python-import python-2.7
我正在构建numpy,并想知道为什么他们在这里使用了相对导入.为什么他们使用相对进口而不是直接进口,如import fft(比方说).
我认为直接导入会起作用,所以克隆它并将源代码行197更改为
import fft
Run Code Online (Sandbox Code Playgroud)
,但它没有用.它把错误扔了
ImportError:没有名为fft的模块
为什么它找不到fft模块,即使它与numpy __init__.py位于同一个文件夹中 .
所以我模拟了一个类似的环境,看看为什么它不起作用.我在其中创建了模块(mod1)和另一个(mod2).从mod1 __init__.py我导入mod2,最后将包含模块mod1的文件夹添加到python路径.然后编写一个python脚本作为sample.py包含
import mod1
Run Code Online (Sandbox Code Playgroud)
一切正常,无需相对导入.
但为什么它不在numpy里面工作呢?
注意:我在virtual-env中有numpy.这会造成麻烦吗?
调试更新:
import numpy.fft
Run Code Online (Sandbox Code Playgroud)
工作.我检查了"__name__",它很笨拙.但为什么"numpy".是必要的,因为它已经在numpy模块??? 更重要的是,因为__name__被设置为numpy,它应该能够找出其中的fft模块.为什么它不起作用的概念...我以前用来模拟的例子是我刚刚使用导入的相同场景mod2尽管mod2在mod1内部,我没有必要导入mod1.mod2
这行是你的问题:
from __future__ import absolute_import
Run Code Online (Sandbox Code Playgroud)
当此future语句处于活动状态时,您无法使用隐式相对导入.您必须使用完全绝对导入(import numpy.fft)或显式相对导入(from . import fft).有关此问题的进一步讨论,请参见PEP 328.