首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python和冲突的模块名称

Python和冲突的模块名称
EN

Stack Overflow用户
提问于 2015-06-17 09:11:36
回答 2查看 2.4K关注 0票数 6

看起来,如果一个名为io.py的文件导入了scipy.ndimage,那么后者最终会以某种方式找不到自己的子模块,也称为io

代码语言:javascript
复制
$ 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的人的路径,那么这种行为就不那么令人惊讶了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-17 09:25:07

您错误地使用了python。

在创建任何顶级python模块或包之前,应该确保没有同名的模块或包。

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

要检查顶级模块或包是否存在,可以尝试在解释器中对其执行import命令,或者从外壳运行pydoc name

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-17 09:24:07

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

这不是list中真正的错误,而是用户错误:正如我们不应该使用list作为变量名,因为它遮蔽了内置的list名称一样,我们也不应该使用io作为模块名称,因为它遮蔽了核心库io模块名称。

请参阅此部分:

代码语言:javascript
复制
  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中的第一个条目。哇哦!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30880770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档