Python 在dev_appserver上使用google云数据存储模拟器

Python 在dev_appserver上使用google云数据存储模拟器,python,google-app-engine,google-cloud-platform,google-cloud-datastore,Python,Google App Engine,Google Cloud Platform,Google Cloud Datastore,我一直在读字里行间的文章,并试图将dev_appserver.py与新的“非遗留”google云数据存储模拟器进行接口 我的主要动机是在本地机器上开发时,将appengine项目与google云数据流管道集成 据我所知,这是设置集成的过程: 使用pip安装googledatastore库(您可能需要使用easy\u Install强制升级six,尤其是在使用system python El Capitan时) 使用google cloud sdk工具运行google cloud数据存储模拟器:

我一直在读字里行间的文章,并试图将dev_appserver.py与新的“非遗留”google云数据存储模拟器进行接口

我的主要动机是在本地机器上开发时,将appengine项目与google云数据流管道集成

据我所知,这是设置集成的过程:

  • 使用pip安装
    googledatastore
    库(您可能需要使用easy\u Install强制升级
    six
    ,尤其是在使用system python El Capitan时)
  • 使用google cloud sdk工具运行google cloud数据存储模拟器:

    gcloud beta emulators datastore start --no-legacy
    
  • 在终端中,dev_appserver将运行以下命令来设置数据存储环境变量:

    $(gcloud beta emulators datastore env-init --no-legacy)
    
  • 如果app.yaml中的项目id与gcloud工具中当前选择的项目id不匹配,请在同一shell中设置以下环境变量:

    export DATASTORE_USE_PROJECT_ID_AS_APP_ID=true
    
  • 运行dev_appserver.py并导航到哪个应该允许您导航模拟器的数据存储数据
但是,当我导航到我获得的url时,这并不顺利:

BadArgumentError: Could not import googledatastore.
This library must be installed with version >= 4.0.0.b1 to use the Cloud Datastore 
API.
这很奇怪,因为如果我打开一个pythonshell并运行
importgoogledatastore
不会发生错误

如果我再深入一点,在dev_appserver中插入导入代码并记录错误,我会得到以下回溯:

Traceback (most recent call last):
  File "/usr/local/google-cloud-sdk/platform/google_appengine/google/appengine/datastore/datastore_pbs.py", line 52, in <module>
    import googledatastore
  File "/Library/Python/2.7/site-packages/googledatastore/__init__.py", line 21, in <module>
    from . import helper
  File "/Library/Python/2.7/site-packages/googledatastore/helper.py", line 25, in <module>
    from google.datastore.v1beta3 import entity_pb2
ImportError: No module named datastore.v1beta3 
回溯(最近一次呼叫最后一次):
文件“/usr/local/google cloud sdk/platform/google_appengine/google/appengine/datastore/datastore_pbs.py”,第52行,在
导入谷歌数据存储
文件“/Library/Python/2.7/site-packages/googledatastore/_-init__;u.py”,第21行,在
从…起导入助手
文件“/Library/Python/2.7/site packages/googledatastore/helper.py”,第25行,在
从google.datastore.v1beta3导入实体\u pb2
ImportError:没有名为datastore.v1beta3的模块
在常规python shell中导入
google.datastore.v1beta3
也没有问题

更奇怪的是,如果我运行
PYTHONINSPECT=x dev_appserver.py app.yaml
并跳入shell,执行这些导入运行时不会出错。也许在dev_appserver.py启动时python路径出现了一些奇怪的情况

有人能告诉我如何让这个功能正常工作吗


更新:我在ubuntu 14.04(系统python 2.7.6,pip 8.1.2,通过easy_安装,gcloud sdk 118.0.0,app engine python 1.9.38)和OS X(gcloud sdk 114.0.0,app engine python 1.9.38,system python 2.7.10)上重现了这个问题。

实际上,gcloud datastore emulator和dev_appserver指向两个不同的端点。localhost:8000是默认的dev_appserver管理控制台,而datastore仿真器有一个不同的控制台url,启动时可以在打印输出中找到该url

我假设您正在访问的管理控制台属于dev_appserver,那么问题应该在dev_appserver中。能否使用dev_appserver中的数据存储api附加代码段(如果有)?顺便说一句,它应该是
gcloud.datastore
而不是
appengine.ext.(n)db
与gcloud数据存储模拟器对话


另外,我很好奇,如果您不使用“--no legacy”启动datastore emulator,或者甚至不启动datastore emulator而只是启动dev_appserver,会发生什么情况?

我们最近遇到了同样的问题。需要注意的一点是命令的输出:

(gcloud beta emulators datastore env-init --no-legacy)
我们遇到的问题是,当我们运行仿真器时,仿真器选择了端口8607,但是env init方法返回了另一个端口8328

因此,我建议启动emulator并查看它在哪个端口上运行:

[datastore] Aug 04, 2016 3:50:50 PM com.google.appengine.tools.development.AbstractModule startup
[datastore] INFO: Module instance default is running at http://localhost:8607/
[datastore] Aug 04, 2016 3:50:50 PM com.google.appengine.tools.development.AbstractModule startup
[datastore] INFO: The admin console is running at http://localhost:8607/_ah/admin
在本例中是8607,然后触发env init方法以获取语法,但验证端口。在我们的例子中,上面运行env init的服务器返回8328

$ (gcloud beta emulators datastore env-init)
export DATASTORE_DATASET=my-app
export DATASTORE_EMULATOR_HOST_PATH=localhost:8328/datastore
export DATASTORE_EMULATOR_HOST=localhost:8328
export DATASTORE_HOST=http://localhost:8328
export DATASTORE_PROJECT_ID=my-app
因此,请将其更改为正确的端口:

export DATASTORE_DATASET=my-app
export DATASTORE_EMULATOR_HOST_PATH=localhost:8607/datastore
export DATASTORE_EMULATOR_HOST=localhost:8607
export DATASTORE_HOST=http://localhost:8607
export DATASTORE_PROJECT_ID=my-app
然后在你的项目正在运行的地方使用它,你应该可以很好地去做。这就是为我们所做的。希望有帮助

提醒大家

将google云数据存储模拟器与dev_appserver一起使用现在可用!()

更新Google Cloud SDK,然后使用'----support\u datastore\u emulator'运行dev\u appserver


此功能正在测试中,欢迎试用!我们正在积极收集反馈。

>应该是gcloud.datastore,而不是appengine.ext.(n)db与gcloud datastore emulator对话。不幸的是,将appengine.ext.ndb与独立数据存储模拟器一起使用正是我想要做的,以避免在与较新的应用程序进行集成测试时重写代码。它以为我发现了允许dev_appserver使用外部数据存储模拟器的功能,但结果表明它似乎还不起作用。
目前不支持将appengine.ext.ndb与独立数据存储模拟器一起使用。目前,gcloud.datastore是唯一的选项,如本页所述。数据存储模拟器除了显示“Ok”外,不会显示任何内容当我访问运行它时唯一可见的localhost:output时。@KaiWang:关于
BadArgumentError:无法导入googledatastore
问题的任何更新?此BadArgumentError可能是由于shell中名为“DATASTORE\u PROJECT\u ID”的环境变量引起的,请尝试删除它。一般来说,要将dev_appserver连接到云数据存储模拟器,请查看以下文档:FWIW,GAE SDK 1.9.38受到导致导入错误的错误的影响,与您的类似,请参阅。我建议尝试使用1.9.40(现在最新版本),它有修复功能。@zenlambda你曾经使用过它吗?这在本文中仍然存在,人们可以跟随他们寻找解决方案,我也会遇到同样的错误。您找到解决方案了吗?有一点相关,我在本地导入“java.lang.OutOfMemoryError:GC开销限制超出”时遇到了错误,您有没有想过如何修复?您是否有任何地方积极收集反馈?