回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<ul>
<li>Python2.7.13</li>
<li>Windows 10 64位</li>
</ul>
<p>我一直在研究这个<a href="https://www.udacity.com/course/web-development--cs253" rel="nofollow noreferrer">Udacity web dev course</a>,并想尝试使用<a href="http://docs.bokeh.org/en/latest/docs/user_guide/embed.html#components" rel="nofollow noreferrer">this example</a>将一个简单的bokeh图嵌入到网页中。运行<code>dev_appserver.py</code>会产生错误:<code>ImportError: No module named _ctypes</code></p>
<p>我有:</p>
<ul>
<li>通过pip安装Bokeh和Numpy</li>
<li>app.yaml中包含Numpy</li>
</ul>
<p><a href="https://stackoverflow.com/questions/41525223/importerror-no-module-named-ctypes-running-python-flask-tutorial-for-google-ap">This answer</a>声明Google应用程序引擎不允许导入ctypes。但是我不确定如何确认博克的情况。这个错误是由Bokeh导入ctypes引起的吗?如果是这样的话,有工作吗?</p>
<pre><code>ERROR 2017-01-21 19:14:53,799 wsgi.py:263]
Traceback (most recent call last):
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle
handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler
handler, path, err = LoadObject(self._handler)
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject
obj = __import__(path[0])
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\main.py", line 2, in <module>
from bokeh.plotting import figure
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\lib\bokeh\plotting\__init__.py", line 2, in <module
>
from ..document import Document; Document
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\lib\bokeh\document.py", line 45, in <module>
from .core.json_encoder import serialize_json
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\lib\bokeh\core\json_encoder.py", line 43, in <modul
e>
import numpy as np
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py", line
706, in load_module
module = self._find_and_load_module(fullname, fullname, [module_path])
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py", line
447, in _find_and_load_module
return imp.load_module(fullname, source_file, path_name, description)
File "D:\Python27\lib\numpy\__init__.py", line 142, in <module>
from . import add_newdocs
INFO 2017-01-21 19:14:53,859 module.py:806] default: "GET / HTTP/1.1" 500 -
File "D:\Python27\lib\numpy\add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "D:\Python27\lib\numpy\lib\__init__.py", line 8, in <module>
from .type_check import *
File "D:\Python27\lib\numpy\lib\type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "D:\Python27\lib\numpy\core\__init__.py", line 33, in <module>
from . import _internal # for freeze programs
File "D:\Python27\lib\numpy\core\_internal.py", line 14, in <module>
import ctypes
File "D:\Python27\lib\ctypes\__init__.py", line 7, in <module>
from _ctypes import Union, Structure, Array
File "C:\Users\AppData\Local\Google\Cloud SDK\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 _ctypes
</code></pre>
<p>应用程序yaml:</p>
<pre><code>runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
script: main.app
libraries:
- name: jinja2
version: latest
- name: numpy
version: latest
</code></pre>
<p>主.py</p>
<pre><code>import os, webapp2, jinja2
from bokeh.plotting import figure
from bokeh.embed import components
plot = figure()
plot.circle([1,2], [3,4])
script, div = components(plot)
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),
autoescape = True)
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.write(*a, **kw)
def render_str(self, template, **kw):
t = jinja_env.get_template(template)
return t.render(kw)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
class MainPage(Handler):
def get(self):
self.render("chart.html", script = script, div = div)
app = webapp2.WSGIApplication([
('/', MainPage),
], debug=True)
</code></pre>
<p>查特.html</p>
<pre><code>{% extends "base.html" %}
{% block content %}
<!-- Load BokehJS -->
<link
href="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.0.min.css"
rel="stylesheet" type="text/css">
<link
href="http://cdn.bokeh.org/bokeh/release/bokeh-widgets-0.12.0.min.css"
rel="stylesheet" type="text/css">
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.0.min.js"></script>
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-widgets-0.12.0.min.js"></script>
{{ script }}
{{ div }}
{% endblock %}
</code></pre>
<p>基.html</p>
<pre><code><!DOCTYPE html>
<html>
<head>
<title>Udacity Templates!</title>
</head>
<body style="margin: 0">
<h1 style="background-color: #ddd; color: #888; margin: 0; height: 50px">Udacity Templates</h1>
{% block content %}
{% endblock %}
</body>
</html>
</code></pre>
<p>gcloud版本</p>
<ul>
<li>谷歌云SDK 139.0.1</li>
<li>应用引擎Python1.9.49</li>
<li>bq 2.0.24标准</li>
<li>bq赢2.0.24</li>
<li>捆绑的Python2.7.10</li>
<li>核心2017.01.12</li>
<li>核心胜利2016.11.07</li>
<li>云</li>
<li>gsutil 4.22标准</li>
<li>gsutil win 4.20版</li>
<li>powershell 1.0.0.1版</li>
<li>windows ssh工具2016.05.13</li>
</ul>
<p><strong>更新1:</strong>
我已经卸载了numpy 1.12.0并安装了numpy1.6.1。我现在得到这个错误:</p>
<pre><code>NP_MS_DELTA = np.timedelta64(1, 'ms')
TypeError: function takes at most 1 argument (2 given)
</code></pre>
<p><a href="https://docs.scipy.org/doc/numpy/reference/arrays.datetime.html" rel="nofollow noreferrer">This</a>状态numpy 1.6.1不能在标量构造函数中指定单位。这是否意味着Bokeh依赖于numpy>;1.6.1?</p>
<pre><code>ERROR 2017-01-22 10:37:45,980 wsgi.py:263]
Traceback (most recent call last):
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle
handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler
handler, path, err = LoadObject(self._handler)
File "C:\Users\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject
obj = __import__(path[0])
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\main.py", line 2, in <module>
from bokeh.plotting import figure
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\lib\bokeh\plotting\__init__.py", line 2, in <module
>
from ..document import Document; Document
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\lib\bokeh\document.py", line 45, in <module>
from .core.json_encoder import serialize_json
File "C:\Users\Google Drive\Udacity web development 2017\udacit
y-cs253\bokeh\1_docs_example\lib\bokeh\core\json_encoder.py", line 53, in <modul
e>
NP_MS_DELTA = np.timedelta64(1, 'ms')
TypeError: function takes at most 1 argument (2 given)
INFO 2017-01-22 10:37:46,170 module.py:806] default: "GET / HTTP/1.1" 500 -
</code></pre>
<p><strong>更新2:</strong></p>
<p>这让我想起了我安装Bokeh的时候。下载依赖项numpy时,它似乎依赖于numpy>;=1.7.1:</p>
<pre><code>Collecting numpy>=1.7.1 (from Bokeh)
</code></pre>