我想在我的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
我做错了什么?
答案 0 :(得分:1)
matplotlib
是Google-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。
也许这有助于处理此问题的人。