【问题标题】:Split models into multiple files Python import package/subpackage将模型拆分为多个文件 Python 导入包/子包
【发布时间】:2013-02-11 00:19:57
【问题描述】:

我收到以下错误:

Error: ImportError: No module named models.account

我正在尝试拆分我的模型。

这是我的项目结构:

site
  | site
  |  | models
  |  |  | __init__.py
  |  |  | account.py
  |  | views
  |     | __init__.py
  |     | site.py
  | __init__.py
  | resources.py
  | routes.py
  | security.py

站点/站点/视图/site.py

from pyramid.view import view_config
from pyramid.httpexceptions import HTTPFound
from site.models.account import User


@view_config(context='pyramid.httpexceptions.HTTPForbidden',
         renderer='generic/login.mako')
@view_config(route_name='generic_login', renderer='generic/login.mako')
def login(request):
  if request.scheme == 'http':
    request.scheme = 'https'
    #return HTTPFound(location=request.url)

  if 'form.submitted' in request.params:
    uemail = request.params['email']
    pw = request.params['pass']

    user = User.objects(email=uemail).first()

  return {}

路径

/Volumes/workspace/py/website/site/bin
/Volumes/workspace/py/website/site/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
/Volumes/workspace/py/website/site/lib/python2.7/site-packages/pip-1.2.1-py2.7.egg
/Volumes/workspace/py/website/site/lib/python2.7/site-packages/WebError-0.10.3-py2.7.egg
/Volumes/workspace/py/website/site/lib/python2.7/site-packages/Pygments-1.6-py2.7.egg
/Volumes/workspace/py/website/site/lib/python2.7/site-packages/Tempita-0.5.1-py2.7.egg
/Volumes/workspace/py/website/site/site
/Volumes/workspace/py/website/site/lib/python2.7/site-packages/WebHelpers-1.3-py2.7.egg
/Volumes/workspace/py/website/site/lib/python27.zip
/Volumes/workspace/py/website/site/lib/python2.7
/Volumes/workspace/py/website/site/lib/python2.7/plat-darwin
/Volumes/workspace/py/website/site/lib/python2.7/plat-mac
/Volumes/workspace/py/website/site/lib/python2.7/plat-mac/lib-scriptpackages
/Volumes/workspace/py/website/site/lib/python2.7/lib-tk
/Volumes/workspace/py/website/site/lib/python2.7/lib-old
/Volumes/workspace/py/website/site/lib/python2.7/lib-dynload
/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7
/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
/Volumes/workspace/py/website/site/lib/python2.7/site-packages

我是 python 新手,所以想弄清楚这一点。

【问题讨论】:

  • 触发异常的代码似乎不在您的示例代码中。
  • 实际的导入语句在哪里?另外,附上import sys; print(sys.path) 的输出将有助于弄清楚这一点。
  • 抱歉,漏掉了最重要的代码!

标签: python pyramid mako


【解决方案1】:

siteone of standard Python modules 的名称,更糟糕的是,它是一种特殊情况,会在解释器初始化期间自动导入。如果系统 site 模块覆盖了您的模块,这很可能是导致问题的原因。

您可以尝试使用类似的方法来解决此问题

from ..models.account import User

但最终还是值得重命名您的项目。

另一个在 Python 中混淆导入错误的常见问题是循环模块依赖 - 比如说,如果你有

from site.views import blah

在您的site.models 模块中的某个位置,同时尝试从site.views 执行from site.models.account import User,这将导致循环依赖,这基本上体现在未定义的有问题的导入语句下方的任何内容中。如果您在查找循环导入时遇到问题,请更新您的问题,列出导入 site.modelssite.views 的所有位置。

【讨论】:

  • 我厌倦了重命名项目,但问题仍然存在。但从 ..models.account 导入用户作品。这是我唯一的选择吗?可以做 project.models.account 导入用户吗?
  • @slik:这绝对是可能的,大多数大型项目都这样做。我已经更新了我的答案。
  • @slik:顺便说一句,在尝试重命名项目时,您是否也更改了导入语句?
  • 目前我只在views/site.py 中导入模型。是的,我改变了我所有的进口。奇怪的是我创建了一个新的模型文件,我可以从 site.views.site 导入登录。
  • @slik:请检查您导入 site.models 和 site.views 的所有位置,以及所有 site.models 和 site.views 导入的位置。我的猜测是,您可能正在从 site.models.account 导入一些东西,而该模块又会导入 site.views,可能是间接的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2011-12-09
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多