ImportError:无法导入名称cygrpc

时间:2019-06-02 18:32:55

标签: python-2.7 google-app-engine google-cloud-firestore

我正在尝试在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

推荐吗?

3 个答案:

答案 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(因为它是内置库而无需显式添加)。使这项工作起作用的三件事:

  1. google-cloud-firestore添加到您的requirements.txt文件中,并使用pip install -U -t lib -r requirements.txt安装。
  2. 将这些行添加到libraries文件的app.yaml部分:
libraries:
- name: grpcio
  version: 1.0.0
- name: setuptools
  version: 36.6.0
  1. 确保这些行在您的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)