web-dev-qa-db-fra.com

ImportError: Aucun module nommé _ctypes. Google app engine avec l'intrigue de bokeh

  • Python 2.7.13
  • Windows 10 64 bits

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:

  • Bokeh et Numpy installés via pip
  • Numpy inclus dans app.yaml

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

  • SDK Google Cloud 139.0.1 
  • app-engine-python 1.9.49 
  • bq 2.0.24 
  • bq-win 2.0.24 
  • bundled-python 2.7.10 
  • noyau 2017.01.12 
  • core-win 2016.11.07 
  • gcloud 
  • gsutil 4.22 
  • gsutil-win 4.20 
  • powershell 1.0.0.1 
  • windows-ssh-tools 2016.05.13

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)
7
joga

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).

2
bigreddot

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 

8
simo

contourner publié de google ici:

https://issuetracker.google.com/issues/38290292

  • goto <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',
    
  • essayez à nouveau votre application.

a travaillé pour moi.

5
Thomas Korrison

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
2
jmunsch

Vous pouvez ajouter le paquet six dans votre fichier Requirements.txt Ce correctif pour moi

pip install -t lib/ six
0
Kirill Muchow