导入Google App Engine中的模块

时间:2016-07-24 14:48:58

标签: python google-app-engine python-import google-app-engine-python

我有一个Python Google App Engine项目,结构如下:

app/
    handlers/
        register_user.py
    models/
        user.py

user.py文件包含一个类User(ndb.Model)

我试图从User访问register_user.py类,以便在数据库中创建并添加新用户。通常,我只是这样导入它:

from ..models.user import User

但是这个错误是因为我试图从我的根包上面导入一些东西 - 所以我猜测模型是我的根包,我不能回到{{1包裹?

现在,我可以通过以下方式导入来解决这个问题:

app
但是,我认为这有点混乱。那么"对"是什么?导入我的User类的方法?

编辑:完整的堆栈跟踪:

import importlib
User = importlib.import_module('models.user').User

(这里的包名不同;我在上面对它们进行了简化以使示例更加通用)

2 个答案:

答案 0 :(得分:1)

我认为Dan走在正确的轨道上,但是没有必要提供自己的代码。销售系统是使用pip管理第三方依赖项,对于您的用例应该是完全没有必要的,并且销售您自己的代码会违反约定。

根据您告诉我们的内容,您应该可以使用

导入代码

from models import user

如果这不起作用,你应该找出原因,但你绝对不需要供应商扩展或importlib来解决它。

您的基本模块是您的基本WSGI应用程序所在的位置,它将由您的app.yaml路由到哪里定义。通常,您的app.yaml将包含以下内容:

- url: .*  # This regex directs all routes to main.app
  script: main.app

在这种情况下,在与app.yaml相同的目录中,有一个main.py,其中包含app WSGI应用程序。在其他一些情况下,script可能是application.main.app,在这种情况下,app变量位于application/main.py中,然后应用程序目录将成为基本目录。

每个包含模块的Python包都应在其目录中包含一个__init__.py文件,如Dan所述。作为旁注,如果您对第三方代码使用lib目录,则它不会包含__init__.py,因为它不是Python包(只是包含Python的目录)包)。事实上,它不是一个包,这就是为什么你使用供应商扩展Dan描述的原因,以确保它包含的包在导入路径上。

根据我的经验,很少需要相对进口,可以让你遇到这些问题所以我会避免它们。

如果您仍然卡住了,请列出应用程序的整个文件结构,包括app.yaml内容和每个子目录,包括它们是否包含__init__.py

答案 1 :(得分:0)

我接触这个的方式是使用the GAE 3rd party lib vendoring technique

  • 已创建appengine_config.py

含量:

from google.appengine.ext import vendor

# Add any libraries installed in the "lib" folder.
vendor.add('lib')
  • 创建了/app/lib目录
  • __init__.py目录中添加了一个空的models文件,使其成为一个包
  • models dir
  • 内放置/移动/符号链接/app/lib目录

有了这个,可以使用以下方式引用模型:

from models.user import User

可能感兴趣: