ImportError: No module named _ctypes. Google app engine with bokeh plot
ImportError: No module named _ctypes. Google app engine with bokeh plot
- Python 2.7.13
- Windows 10 64 位
我一直在努力解决这个问题 Udacity web dev course and wanted to try embedding a simple bokeh plot into a web page using this example。 运行 dev_appserver.py
给出错误:ImportError: No module named _ctypes
我有:
- 通过 pip 安装了 Bokeh 和 Numpy
- 在 app.yaml
中包含 Numpy
声明 Google App Engine 不允许导入 ctype。但是我不确定如何确认 Bokeh 是否属于这种情况。这个错误是Bokeh导入ctypes导致的吗?如果是这样,有解决办法吗?
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_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_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_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_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
app.yaml:
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
script: main.app
libraries:
- name: jinja2
version: latest
- name: numpy
version: latest
main.py
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)
chart.html
{% 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 %}
base.html
<!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>
gcloud 版本
- Google 云 SDK 139.0.1
- 应用引擎-python 1.9.49
- bq 2.0.24
- bq-win 2.0.24
- 捆绑-python 2.7.10
- 核心 2017.01.12
- 芯赢 2016.11.07
- gcloud
- gsutil 4.22
- gsutil-win 4.20
- powershell 1.0.0.1
- windows-ssh-工具 2016.05.13
更新 1:
我已经卸载了 numpy 1.12.0 并安装了 numpy 1.6.1。我现在收到此错误:
NP_MS_DELTA = np.timedelta64(1, 'ms')
TypeError: function takes at most 1 argument (2 given)
This 声明 numpy 1.6.1 无法在标量构造函数中指定单位。这是否意味着 Bokeh 依赖于 numpy>1.6.1?
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_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_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_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_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 -
更新 2:
这让我想起了我 pip 安装 Bokeh 的时候。下载它的依赖 numpy 时,它似乎依赖于 numpy>=1.7.1:
Collecting numpy>=1.7.1 (from Bokeh)
编辑:请参阅下面的答案,了解来自 Google 的新解决方法。
我可以明确地说,Bokeh 本身不直接使用 ctypes
,在库中的任何地方。但它确实使用了 NumPy,而且似乎至少某些版本的 NumPy 确实使用了 ctypes
?这个link:
http://kawahara.ca/using-numpy-on-google-app-engine-with-the-anaconda-python-distribution/
似乎表明 只有 NumPy 1.6 版在 GAE 上受支持。我可能会认为这是因为该版本 不 使用 ctypes,或者因为 Google 以某种方式特别将该版本列入可接受的白名单。
所以建议专门安装 NumPy 1.6,而不是最新版本(使用 pip 或 conda 或其他)。
我使用 2 个 hack
设法获得了开发服务器 运行
ImportError: No module named _ctypes
这其实是flask造成的
New Flask 使用名为 click 的库,它使用 ctypes
Gae 不允许 ctypes
解决方案:
使用
安装和点击旧版本
pip install --target lib --upgrade click==5.1
这修复了 ctypes 但会导致另一个错误
ImportError: No module named msvcrt
可以通过将此行添加到 appengine_config.py(与 app.yaml 位于同一文件夹中)轻松解决此问题
import os, sys
on_appengine = os.environ.get('SERVER_SOFTWARE','').startswith('Development')
if on_appengine and os.name == 'nt':
sys.platform = "Not Windows"
此开发服务器启动并运行后
google 此处发布的解决方法:
https://issuetracker.google.com/issues/38290292
- 转到
<sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py
找到_WHITE_LIST_C_MODULES = [xxx]
的定义
将以下两行添加到列表中:
'_winreg',
'_ctypes',
- 再次尝试您的应用程序。
对我有用。
您可以将包 six 添加到您的 requirements.txt
为我修复
pip install -t lib/ six
这对我来说在 14.04LTS 和基本内核 4.1+ 上运行良好...安装 python3.7:
sudo apt-get install libffi-dev
- Python 2.7.13
- Windows 10 64 位
我一直在努力解决这个问题 Udacity web dev course and wanted to try embedding a simple bokeh plot into a web page using this example。 运行 dev_appserver.py
给出错误:ImportError: No module named _ctypes
我有:
- 通过 pip 安装了 Bokeh 和 Numpy
- 在 app.yaml 中包含 Numpy
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_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_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_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_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
app.yaml:
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
script: main.app
libraries:
- name: jinja2
version: latest
- name: numpy
version: latest
main.py
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)
chart.html
{% 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 %}
base.html
<!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>
gcloud 版本
- Google 云 SDK 139.0.1
- 应用引擎-python 1.9.49
- bq 2.0.24
- bq-win 2.0.24
- 捆绑-python 2.7.10
- 核心 2017.01.12
- 芯赢 2016.11.07
- gcloud
- gsutil 4.22
- gsutil-win 4.20
- powershell 1.0.0.1
- windows-ssh-工具 2016.05.13
更新 1: 我已经卸载了 numpy 1.12.0 并安装了 numpy 1.6.1。我现在收到此错误:
NP_MS_DELTA = np.timedelta64(1, 'ms')
TypeError: function takes at most 1 argument (2 given)
This 声明 numpy 1.6.1 无法在标量构造函数中指定单位。这是否意味着 Bokeh 依赖于 numpy>1.6.1?
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_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_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_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_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 -
更新 2:
这让我想起了我 pip 安装 Bokeh 的时候。下载它的依赖 numpy 时,它似乎依赖于 numpy>=1.7.1:
Collecting numpy>=1.7.1 (from Bokeh)
编辑:请参阅下面的答案,了解来自 Google 的新解决方法。
我可以明确地说,Bokeh 本身不直接使用 ctypes
,在库中的任何地方。但它确实使用了 NumPy,而且似乎至少某些版本的 NumPy 确实使用了 ctypes
?这个link:
http://kawahara.ca/using-numpy-on-google-app-engine-with-the-anaconda-python-distribution/
似乎表明 只有 NumPy 1.6 版在 GAE 上受支持。我可能会认为这是因为该版本 不 使用 ctypes,或者因为 Google 以某种方式特别将该版本列入可接受的白名单。
所以建议专门安装 NumPy 1.6,而不是最新版本(使用 pip 或 conda 或其他)。
我使用 2 个 hack
设法获得了开发服务器 运行ImportError: No module named _ctypes
这其实是flask造成的 New Flask 使用名为 click 的库,它使用 ctypes Gae 不允许 ctypes 解决方案: 使用
安装和点击旧版本pip install --target lib --upgrade click==5.1
这修复了 ctypes 但会导致另一个错误
ImportError: No module named msvcrt
可以通过将此行添加到 appengine_config.py(与 app.yaml 位于同一文件夹中)轻松解决此问题
import os, sys
on_appengine = os.environ.get('SERVER_SOFTWARE','').startswith('Development')
if on_appengine and os.name == 'nt':
sys.platform = "Not Windows"
此开发服务器启动并运行后
google 此处发布的解决方法:
https://issuetracker.google.com/issues/38290292
- 转到
<sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py
找到
_WHITE_LIST_C_MODULES = [xxx]
的定义 将以下两行添加到列表中:'_winreg', '_ctypes',
- 再次尝试您的应用程序。
对我有用。
您可以将包 six 添加到您的 requirements.txt 为我修复
pip install -t lib/ six
这对我来说在 14.04LTS 和基本内核 4.1+ 上运行良好...安装 python3.7:
sudo apt-get install libffi-dev