Matplotlib与Google App Engine本地开发服务器

时间:2016-08-11 16:36:51

标签: python google-app-engine matplotlib

我想在我的Google App Engine项目中使用matplotlib。我按照官方文档中的here描述了这些步骤。我做了什么:

1)在我的应用程序根目录中创建了一个名为lib的目录。

2)在我的应用程序根目录中创建了一个文件appengine_config.py,并添加了以下行:

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

3)由于文档说,matplotlib的唯一版本是1.2.0,我在终端中执行了以下命令:

pip install -t lib matplotlib==1.2.0

文档中还有第0步,即

  

使用pip安装库和供应商模块以启用从第三方库目录导入包。

但我不明白它的实际含义。如果这是必不可少的,请向我解释这里的含义。我在stackoverflow上找到this回答,似乎与我所做的没什么不同。

另外,我添加了

libraries:
- name: matplotlib
  version: "1.2.0"

到app.yaml。

因此,在完成所有这些步骤后,我添加了一行

import matplotlib

到main.py并使用

启动本地服务器
python ~/path/google_appengine/dev_appserver.py app.yaml

但是当我尝试访问http://localhost:8080/时,会出现错误:

raise ImportError('No module named %s' % fullname)
ImportError: No module named _ctypes

如果需要,整个输出如下:

ERROR    2016-08-11 16:26:51,621 wsgi.py:263] 
Traceback (most recent call last):
  File "/home/magnitofon/Загрузки/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  File "/home/magnitofon/Загрузки/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
  File "/home/magnitofon/Загрузки/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0])
  File "/home/magnitofon/realec-inspector/main.py", line 20, in <module>
    import matplotlib
  File "/home/magnitofon/realec-inspector/lib/matplotlib/__init__.py", line 151, in <module>
    from matplotlib.rcsetup import (defaultParams,
  File "/home/magnitofon/realec-inspector/lib/matplotlib/rcsetup.py", line 20, in <module>
    from matplotlib.colors import is_color_like
  File "/home/magnitofon/realec-inspector/lib/matplotlib/colors.py", line 52, in <module>
    import numpy as np
  File "/home/magnitofon/Загрузки/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 705, in load_module
    module = self._find_and_load_module(fullname, fullname, [module_path])
  File "/home/magnitofon/Загрузки/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 446, in _find_and_load_module
    return imp.load_module(fullname, source_file, path_name, description)
  File "/usr/local/lib/python2.7/dist-packages/numpy/__init__.py", line 180, in <module>
    from . import add_newdocs
  File "/usr/local/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 8, in <module>
    from .type_check import *
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/__init__.py", line 22, in <module>
    from . import _internal  # for freeze programs
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/_internal.py", line 14, in <module>
    import ctypes
  File "/usr/lib/python2.7/ctypes/__init__.py", line 10, in <module>
    from _ctypes import Union, Structure, Array
  File "/home/magnitofon/Загрузки/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py", line 963, in load_module
    raise ImportError('No module named %s' % fullname)
ImportError: No module named _ctypes

我做错了什么?

2 个答案:

答案 0 :(得分:1)

matplotlibGoogle-provided 3rd party libs之一,因此您应该只遵循Requesting a library说明并且 Installing a library个。

可悲的是,他们现在都在同一个文档页面上,名为Using Built-in Libraries in Python 2.7 - 对于不知情的人来说非常困惑,因为对于 GAE构建的库,应该使用出售技术-in /提供。提起Issue 13202

注意:请注意Using libraries with the local development server部分,它适用于matplotlib。您可能需要在系统上安装一些软件包,但在应用程序本身中(这可能会对GAE上的部署产生负面影响) - 它们需要开发服务器可访问,而不是由应用程序直接访问

Duh,我刚刚在同一页上注意到Using matplotlib部分:)

提到:

  

注意:开发服务器不支持matplotlib的实验版本。你仍然可以添加matplotlib   库列表,但它会引发ImportError异常   导入。

答案 1 :(得分:0)

有些人正在寻找这个(旧的)食谱:

http://code.activestate.com/recipes/578393-gae-matplotlib-demo/

请务必阅读评论。

但是我尝试过,我无法使它发挥作用。这种方法不再适用于当前版本的app引擎沙箱,或者我只是无法正确遵循配方中的所有步骤。

或许更好的阅读是Matt Giuca(一位谷歌工程师将matplotlib移植到GAE制作环境中)以及他在github中的拉取请求的评论。

https://github.com/matplotlib/matplotlib/issues/1823/

他对2013年4月17日的评论提供了一个匹配dev_appserver(版本1.77)的配方,以便在本地使用matplotlib。

也许这有助于处理此问题的人。