J'ai travaillé sur ce Udacity web dev course et je voulais essayer d'incorporer un complot bokeh simple dans une page Web en utilisant cet exemple . Lancer dev_appserver.py
donne l'erreur: ImportError: No module named _ctypes
J'ai:
Cette réponse indique que Google App Engine n'autorise pas l'importation de ctypes. Cependant, je ne sais pas comment confirmer si c'est le cas avec Bokeh. Cette erreur est-elle causée par l'importation de ctypes par Bokeh? Si oui, y a-t-il un travail autour?
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
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.pydata.org/bokeh/release/bokeh-0.12.0.min.css"
rel="stylesheet" type="text/css">
<link
href="http://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.0.min.css"
rel="stylesheet" type="text/css">
<script src="http://cdn.pydata.org/bokeh/release/bokeh-0.12.0.min.js"></script>
<script src="http://cdn.pydata.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>
version gcloud
UPDATE 1: J'ai désinstallé numpy 1.12.0 et installé numpy 1.6.1. J'ai maintenant cette erreur:
NP_MS_DELTA = np.timedelta64(1, 'ms')
TypeError: function takes at most 1 argument (2 given)
This states numpy 1.6.1 ne peut spécifier l'unité dans le constructeur scalaire. Est-ce que cela signifie que Bokeh s'appuie sur 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\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 -
UPDATE 2:
Cela me rappelle quand j'ai installé Bokeh. Lors du téléchargement, sa dépendance numpy semblait s'appuyer sur numpy> = 1.7.1:
Collecting numpy>=1.7.1 (from Bokeh)
Modifier: consultez la réponse ci-dessous pour une nouvelle solution de contournement de Google.
Je peux affirmer catégoriquement que Bokeh lui-même n'utilise pas ctypes
directement, nulle part dans la bibliothèque. Mais il utilise NumPy, et il semble qu'au moins certaines versions de NumPy utilisent ctypes
? Ce lien:
http://kawahara.ca/using-numpy-on-google-app-engine-with-the-anaconda-python-distribution/
semble suggérer que seulement version 1.6 de NumPy est pris en charge sur GAE. J'imagine que c'est soit parce que cette version n'est pas utilisée que les ctypes, soit parce que Google a spécifiquement ajouté cette version à la liste blanche comme acceptable.
La suggestion serait donc d’installer spécifiquement NumPy 1.6, et non la dernière version (en utilisant pip ou conda ou autre).
J'ai réussi à faire tourner le serveur dev en utilisant 2 hacks
ImportError: No module named _ctypes
Flask New. Flask utilise la bibliothèque nommée click qui utilise ctypes Gae n'autorise pas les ctypes Solution: Installez une version antérieure de click avec
pip install --target lib --upgrade click==5.1
Cela corrige les ctypes mais provoque une autre erreur
ImportError: No module named msvcrt
Cela peut être facilement résolu en ajoutant ces lignes à appengine_config.py (situé dans le même dossier que 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"
Après cela, les serveurs dev commencent et fonctionnent
contourner publié de google ici:
https://issuetracker.google.com/issues/38290292
<sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py
trouver la définition de _WHITE_LIST_C_MODULES = [xxx]
ajoute les deux lignes suivantes à la liste:
'_winreg',
'_ctypes',
a travaillé pour moi.
Cela a bien fonctionné pour moi sur 14.04LTS et le noyau de base 4.1+ ... lors de l'installation de python3.7:
Sudo apt-get install libffi-dev
Vous pouvez ajouter le paquet six dans votre fichier Requirements.txt Ce correctif pour moi
pip install -t lib/ six