我正在尝试在Google App Engine-Standard上使用Firebase本机模式。我的python语言是Python 2.7。当我尝试从google.cloud导入firestore时,出现错误ImportError:无法导入名称cygrpc
我已经部署了here文档中所述的virtualenv。
pip install virtualenv
virtualenv env
source env/bin/activate
我的appengine_config.py是
from google.appengine.ext import vendor
import os.path
# Add any libraries installed in the "lib" folder.
vendor.add('lib')
vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
my_app.py包含
from google.appengine.ext.webapp import template
from google.appengine.ext import ndb
from google.appengine.api import mail
import os
from google.cloud import firestore
(/base/alloc/tmpfs/dynamic_runtimes/python27g/43d5822312de17fd/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py:269)
Traceback (most recent call last):
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/43d5822312de17fd/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 240, in Handle
handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/43d5822312de17fd/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 311, in _LoadHandler
handler, path, err = LoadObject(self._handler)
File "/base/alloc/tmpfs/dynamic_runtimes/python27g/43d5822312de17fd/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 85, in LoadObject
obj = __import__(path[0])
File "/base/data/home/apps/s~openbarn-prod/20190602t102855.418624175446659791/main.py", line 4, in <module>
from controllers import server, common, header
File "/base/data/home/apps/s~openbarn-prod/20190602t102855.418624175446659791/controllers/server.py", line 10, in <module>
from google.cloud import firestore
File "/base/data/home/apps/s~openbarn-prod/20190602t102855.418624175446659791/lib/google/cloud/firestore.py", line 18, in <module>
from google.cloud.firestore_v1 import __version__
File "/base/data/home/apps/s~openbarn-prod/20190602t102855.418624175446659791/lib/google/cloud/firestore_v1/__init__.py", line 22, in <module>
from google.cloud.firestore_v1._helpers import GeoPoint
File "/base/data/home/apps/s~openbarn-prod/20190602t102855.418624175446659791/lib/google/cloud/firestore_v1/_helpers.py", line 21, in <module>
import grpc
File "/base/data/home/apps/s~openbarn-prod/20190602t102855.418624175446659791/lib/grpc/__init__.py", line 23, in <module>
from grpc._cython import cygrpc as _cygrpc
ImportError: cannot import name cygrpc
我有一个问题-您可以使用Python 2.7在Google App Engine标准上使用Firestore本机模式吗?我需要GAE-Standard,因为我们正在使用GAE-Flex不支持的Google端点。
文档here说,Python2.7 GAE Standard环境不支持App Engine客户端库集成。但是我没有尝试使用App Engine客户端库,而是尝试在GAE标准环境中使用App Engine服务器库。 如何解决cygrpc的导入错误?解决方案here,说-
python -m pip install grpcio --ignore-installed
推荐吗?
答案 0 :(得分:1)
前一段时间,GAE标准不支持GRPC,请参见GRPC and types import error in App Engine Datastore。从那以后我没有尝试过,但是在issue 149上没有看到更新的活动。
回溯中的cython
参考表明它可能包含编译后的代码,这将违反适用于您部署的代码的pure python标准环境沙箱限制。
答案 1 :(得分:1)
现在是2020年,您现在可以在带有Python 2.7的App Engine上使用带有Cloud Firestore的grpcio
(因为它是内置库而无需显式添加)。使这项工作起作用的三件事:
google-cloud-firestore
添加到您的requirements.txt
文件中,并使用pip install -U -t lib -r requirements.txt
安装。libraries
文件的app.yaml
部分:libraries:
- name: grpcio
version: 1.0.0
- name: setuptools
version: 36.6.0
appengine_config.py
文件中:import pkg_resources
from google.appengine.ext import vendor
# Set path to your libraries folder.
path = 'lib'
# Add libraries installed in the path folder.
vendor.add(path)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(path)
当然,我们确实建议您最终migrate to Python 3来利用下一代(尤其是Python 和 App Engine)所提供的更大的灵活性。利用其他GCP服务的能力。 但是,如果您的应用程序复杂且深深依赖于App Engine的第一代内置服务,那么对这样的端口进行说明并不是一件容易的事。上面的大多数建议均来自this section of the migration docs。
答案 2 :(得分:0)