我有一个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
(这里的包名不同;我在上面对它们进行了简化以使示例更加通用)
答案 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
可能感兴趣: