【问题标题】:Trying to import a module that imports another module, getting ImportError尝试导入另一个模块的模块,得到 ImportError
【发布时间】:2010-11-11 20:39:17
【问题描述】:

在 ajax.py 中,我有这个 import 语句:

import components.db_init as db

在 components/db_init.py 中,我有这个导入语句:

# import locals from ORM (Storm)
from storm.locals import *

在 components/storm/locals.py 中,它有这个:

from storm.properties import Bool, Int, Float, RawStr, Chars, Unicode, Pickle
from storm.properties import List, Decimal, DateTime, Date, Time, Enum
from storm.properties import TimeDelta
from storm.references import Reference, ReferenceSet, Proxy
from storm.database import create_database
from storm.exceptions import StormError
from storm.store import Store, AutoReload
from storm.expr import Select, Insert, Update, Delete, Join, SQL
from storm.expr import Like, In, Asc, Desc, And, Or, Min, Max, Count, Not
from storm.info import ClassAlias
from storm.base import Storm

所以,当我在 ajax.py 中运行 import 语句时,我得到了这个错误:

<type 'exceptions.ImportError'>: No module named storm.properties

我可以正常运行 components/db_init.py 没有任何异常...所以我不知道发生了什么。

有人能解释一下这个问题吗?

【问题讨论】:

    标签: python import packages relative-path


    【解决方案1】:

    你要么需要

    • 添加 (...)/components/storm 到 PYTHONPATH,
    • 使用相对导入 在 components/storm/locals.py 或
    • 导入属性而不是storm.properties

    【讨论】:

      【解决方案2】:

      我猜storm.locals' 对它的包名的想法与你想象的不同(很可能它认为它在components.storm.locals 中)。您可以通过在storm.locals 的顶部打印__name__ 来检查这一点,我相信。如果您使用与当前包无关的导入,则包名称必须匹配。

      在这里使用相对导入可能会起作用。由于localsproperties 在同一个包中,所以在storm.locals 中你应该可以这样做

      from properties import Bool
      

      等等。

      【讨论】:

      • 这确实解决了我的问题,但它发现了另一个问题。出于某种原因,Storm 的所有内部模块都使用“importstorm.{module_name}”。我认为这意味着 Storm 不能被祖父模块使用!
      • 我说得太早了。 Wuub 在下面列出了一些解决此问题的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多