【问题标题】:Absolute Import Not Working, But Relative Import Does绝对导入不起作用,但相对导入可以
【发布时间】:2016-08-21 20:06:25
【问题描述】:

这是我的应用结构:

foodo/
    setup.py
    foodo/
        __init__.py
        foodo.py
        models.py

foodo/foodo/foodo.pymodels.py 模块导入类:

from foodo.models import User

抛出一个ImportError:

ImportError: No module named models

但是,如果我使用相对导入,它确实有效:

from models import User

如果我在导入之前放置一个 pdb 断点并继续,它也可以工作。

我应该可以同时使用绝对和相对导入,对吧?

【问题讨论】:

  • foodo/foodo/foodo.py 的运行情况如何?如果您已将目录更改为foodo/foodo/ 并运行python foodo.py,您将得到您所描述的行为。相反,cd 进入foodo/ 并运行python -m foodo.foodo,一切都应该按预期工作。 (您可能还需要from __future__ import absolute_imports,因为包和内部模块名称相同。)
  • 您好,谢谢,是的,future 有效。所以我的选择是使用这个或相对的进口?
  • 是的,您也正确的是,重命名内部 foodo 模块可以解决问题,我可以使用绝对导入。谢谢

标签: python python-2.7 python-import importerror


【解决方案1】:

您在foodoo 包内有一个本地 模块foodoo。 Python 2 中的导入总是首先在当前包中查找名称,然后再查找顶级名称。

要么重命名foodoo 包内的foodoo 模块(消除首先找到本地foodoo 的可能性)或使用:

from __future__ import absolute_import

在包中模块的顶部以启用 Python-3 样式导入,其中顶级模块是唯一搜索的模块,除非您在名称前加上 . 以使名称相对。详情请见PEP 328 -- Imports: Multi-Line and Absolute/Relative

【讨论】:

  • 您好,谢谢,我将 foodo/foodo/foodo.py 重命名为 foodo/foodo/main.py 但无济于事。我还通过创建一个包含所有唯一包/模块名称的虚拟目录进行了测试,但也得到了错误
  • @LaSmell:你确定 a) 你清除了所有陈旧的 .pyc 文件或 b) 使用了全新的名称,你保证没有 .pyc 文件吗?我可以准确地重现您的问题,并在需要能够从包中导入的包中的 每个模块 中使用 from __future__ import absolute_imports 来修复它。
  • 是的,(a)和(b)我都做了。我肯定在这里做错了什么。 . . future 在我的测试包/模块上也不起作用只是为了澄清一下,顶级 foodo 目录没有 init,而 foodo 包有 (/foodo /foodo/__init__.py)
  • @LaSmell:是的,这很清楚。您是否有机会尝试将包中的模块作为脚本运行?你不能这样做,因为这意味着文件被“导入”为__main__ 并且没有包的上下文。
  • 不,我没有将包中的模块作为脚本运行。我正在通过 setup.py distutils (packages=['foodo']) 安装“foodo”包,它将 foodo 包(带有所有模块)安装到虚拟 envs python site-packages 目录并将可执行文件“foodo”在 /usr/bin 中导入和执行包的脚本。
猜你喜欢
  • 2018-01-08
  • 2015-04-30
  • 2014-10-31
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多