Python和冲突的模块名称

Max*_*axB 5 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
Run Code Online (Sandbox Code Playgroud)

这是一个错误SciPy,还是我使用Python错了?

更新:我认为如果import mod2在已mod1解决的路径中相对于mod1导入而不是相对于导入的路径,则会出现不太令人惊讶的行为mod1.

wim*_*wim 5

简单的解决方法是避免命名您的 module io,因为它与核心库模块名称冲突。

这实际上不是 numpy 中的错误,而是用户错误:正如我们不应该将其list用作变量名,因为它遮蔽了内置list名称,我们不应该将其io用作模块名称,因为它遮蔽了核心库io模块名称。

看这部分:

  File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 141, in <module>
    import io
Run Code Online (Sandbox Code Playgroud)

这里numpy尝试导入io模块io由于绝对导入,这是为了找到 stdlib - 一个 numpy 子模块将加载相对导入,就像您在回溯中看到的那样,那里有另一行开始from .npyio import *

当然你自己的io.py模块是最先找到的,因为在当前工作目录中一般是sys.path. 哎呀!


o11*_*11c 1

你使用Python是错误的。

在创建任何顶级 python 模块或包之前,应确保尚不存在同名的模块或包。

这里最好的解决方案是不使用顶级模块,而是将所有内容放在__init__.py以项目命名的单个顶级包中(即带有文件的目录)。

要检查顶级模块或包是否存在,您可以尝试import在解释器中对其进行 ing,或者pydoc name从 shell 运行。


值得注意的是,如果包使用绝对样式导入语法来执行相对导入,则可能会发生一个非常相似的错误,但这不是您的错。这个“特性”在Python3中被删除了。