Python和冲突的模块名称

时间:2015-06-17 01:11:36

标签: python numpy scipy

似乎如果一个文件被调用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}的任何人}。

2 个答案:

答案 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中删除。

相关问题