看起来,如果一个名为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
中的一个bug,还是我用错了Python?
更新:我认为如果mod1
中的import mod2
解析相对于mod1
的路径,而不是相对于导入mod1
的人的路径,那么这种行为就不那么令人惊讶了。
发布于 2015-06-17 09:25:07
您错误地使用了python。
在创建任何顶级python模块或包之前,应该确保没有同名的模块或包。
这里最好的解决方案是不使用顶层模块,而是将所有内容放在以项目命名的单个顶层包(即包含__init__.py
文件的目录)中。
要检查顶级模块或包是否存在,可以尝试在解释器中对其执行import
命令,或者从外壳运行pydoc name
。
值得注意的是,如果包使用绝对风格的导入语法来执行相对导入,则可能会发生一个非常类似的错误,这不是您的错。这个“特性”在Python3中被删除了。
发布于 2015-06-17 09:24:07
简单的解决方法是避免将模块命名为io
,因为它与核心库模块名称冲突。
这不是list
中真正的错误,而是用户错误:正如我们不应该使用list
作为变量名,因为它遮蔽了内置的list
名称一样,我们也不应该使用io
作为模块名称,因为它遮蔽了核心库io
模块名称。
请参阅此部分:
File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module>
import io
在这里,numpy
尝试导入io
module。这是为了在绝对导入的情况下找到stdlibnumpy子模块-一个io
子模块将通过相对导入加载,就像您在回溯中看到的那样,其中有另一行以from .npyio import *
开头。
当然,首先会找到您自己的io.py
模块,因为在当前工作目录中通常是sys.path
中的第一个条目。哇哦!
https://stackoverflow.com/questions/30880770
复制相似问题