尝试导入一个导入其他模块的模块,出现ImportError

0 投票
2 回答
583 浏览
提问于 2025-04-15 12:59

在ajax.py文件中,我有这样一个导入语句:

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中运行那个导入语句时,我遇到了这个错误:

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

我可以顺利运行components/db_init.py,没有任何异常……所以我不知道问题出在哪里。

有没有人能帮我解释一下这个问题?

2 个回答

1

你需要做以下其中一项:

  • 把 (...)/components/storm 加到 PYTHONPATH 里,
  • 在 components/storm/locals.py 文件中使用相对导入,或者
  • 导入 properties,而不是 storm.properties。
2

我猜 storm.locals 对它的包名的理解和你想的不太一样(很可能它认为自己在 components.storm.locals 里面)。你可以通过在 storm.locals 的顶部打印 __name__ 来检查这一点。我认为如果你使用的导入不是相对于当前包的,那么包名必须要一致。

在这里使用相对导入可能会有效。因为 localsproperties 在同一个包里,所以在 storm.locals 里面,你应该可以直接这样做:

from properties import Bool

然后继续。

撰写回答