【问题标题】:Google Appengine external cassandra ImportError: No module named cassandra.clusterGoogle Appengine 外部 cassandra ImportError:没有名为 cassandra.cluster 的模块
【发布时间】:2017-09-23 01:28:05
【问题描述】:

尝试使用标准环境 appengine(开发环境)中的外部托管 Cassandra 服务器。我看到了这个错误:

  "..main.py", line 5, in <module>
    import cassandra.cluster
  "..google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 964, in load_module
    raise ImportError('No module named %s' % fullname)
ImportError: No module named cassandra.cluster

ma​​in.py

import cassandra

# this works ... prints 3.9.0
print cassandra.__version__

# all these variations fail with import error
import cassandra.cluster               
# from cassandra.cluster import Cluster 
# from cassandra import cluster

# this works
import cassandra.metrics

app.yaml

runtime: python27
api_version: 1
threadsafe: true

- url: /.*
  script: main.app

appengine_config.py

from google.appengine.ext import vendor
vendor.add('lib')

文件夹结构

app.yaml
appengine_config.py
main.py
lib
  |-cassandra
       |-cluster.py
       |-.....
  |-concurrent
  |-six
  • 使用pip install -t lib/ cassandra-driver 安装的所有模块
  • 导入 cassandra.metrics 工作表明路径似乎没问题

任何帮助表示赞赏。

【问题讨论】:

  • 发布appengine_config.py的内容
  • 试试from cassandra import cluster
  • print cassandra.__path__ 的输出是什么?而且您无法运行具有 c 扩展名的模块..
  • 好的,然后尝试import cassandra 并在代码中使用cassandra.cluster

标签: python-2.7 google-app-engine cassandra datastax google-app-engine-python


【解决方案1】:

您在sandbox.py, line 964 上遇到的错误表明它是从实现 C 模块的导入挂钩中抛出的。 Avinash Raj 已经指出您“无法运行具有 c 扩展名的模块”,这显然是 documented

解释器无法使用 C 代码加载 Python 模块;它是一个“纯”的 Python 环境。

即使是cassandra驱动,也支持no-cython installation

pip install -t lib/ --install-option="--no-cython" cassandra-driver

... 走这条路会让我们遇到Python Standard Library's fcntl module 的第二个问题:

Traceback (most recent call last):
  File "/home/mroman/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/home/mroman/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/home/mroman/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "/home/mroman/tmp/cassandra_importError/main.py", line 7, in <module>
    import asyncore
  File "/usr/lib/python2.7/asyncore.py", line 608, in <module>
    import fcntl
  File "/home/mroman/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 964, in load_module
    raise ImportError('No module named %s' % fullname)
ImportError: No module named fcntl

这个模块似乎没有被列入白名单,因为它对文件描述符执行文件控制和 I/O 控制,而且 AppEngine 的受限“沙盒”不允许应用写入文件系统。

我检查了其他 Cassandra 驱动程序,例如:

鉴于以上所有情况,我相信您唯一的选择是:

干杯

【讨论】:

  • 感谢您进行研究。所以基本死在水里。关于 PHP 驱动程序的任何想法?如果可行,那么至少我可以将它作为一个模块运行并在 appengine 标准环境中构建一个 api。
  • Datastax 用于 Cassandra 的 PHP 驱动程序也具有 C 扩展,因此没有解决方法。我建议使用 GAE Flexible。
  • Flex 目前不是一个选项。必须检查剩余的两种可能性 - java 或 Go
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2021-10-12
  • 2015-05-20
  • 1970-01-01
  • 2016-07-11
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多