似乎如果一个文件被调用io.py
并且它导入scipy.ndimage
,那么后者在某种程度上最终无法找到自己的子模块,也称为io
:
$ echo "import scipy.ndimage" > io.py
$ python io.py
Traceback (most recent call last):
File "io.py", line 1, in <module>
import scipy.ndimage
File "/usr/lib/python2.7/dist-packages/scipy/__init__.py", line 70, in <module>
from numpy import show_config as show_numpy_config
File "/usr/lib/python2.7/dist-packages/numpy/__init__.py", line 153, in <module>
from . import add_newdocs
File "/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "/usr/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 22, in <module>
from .npyio import *
File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 4, in <module>
from . import format
File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module>
import io
File "/tmp/rm_me/io.py", line 1, in <module>
import scipy.ndimage
File "/usr/lib/python2.7/dist-packages/scipy/ndimage/__init__.py", line 172, in <module>
from .filters import *
File "/usr/lib/python2.7/dist-packages/scipy/ndimage/filters.py", line 37, in <module>
from scipy.misc import doccer
File "/usr/lib/python2.7/dist-packages/scipy/misc/__init__.py", line 45, in <module>
from .common import *
File "/usr/lib/python2.7/dist-packages/scipy/misc/common.py", line 10, in <module>
from numpy import exp, log, asarray, arange, newaxis, hstack, product, array, \
ImportError: cannot import name exp
这是SciPy
中的错误,还是我错误地使用Python?
更新:我认为如果import mod2
mod1
解析路径相对于mod1
而不是相对于导入{{1}的任何人}。
答案 0 :(得分:4)
简单的解决方法是避免命名模块io
,因为它与核心库模块名称冲突。
它不是真正的numpy中的错误,而是用户错误:正如我们不应该使用list
作为变量名,因为它会影响内置{{1} } name,我们不应该使用list
作为模块名称,因为它会影响核心库io
模块名称。
见这部分:
io
此处 File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module>
import io
尝试导入io
module。这是为了找到stdlib numpy
,因为它是绝对导入的 - 一个numpy子模块已经加载了 relative import,就像你可以在traceback中看到的那样,有另一行开始{{ 1}}。
当然首先找到你自己的io
模块,因为在当前工作目录中通常是from .npyio import *
中的第一个条目。糟糕!
答案 1 :(得分:3)
您正在使用python错误。
在创建任何顶级python模块或包之前,您应该确保该名称已经没有模块或包。
这里最好的解决方案是不使用顶级模块,而是将所有内容放在以项目命名的单个顶级包(即带有__init__.py
文件的目录)中。
要检查是否存在顶级模块或软件包,您可以在解释器中尝试import
,或从shell运行pydoc name
。
值得注意的是,如果包使用绝对样式的导入语法来执行相对导入,则会发生非常类似的错误,这可能不是您的错。这个&#34;功能&#34;在Python3中删除。