Impossible d’importer _winreg dans l’environnement virtuel Python 2.7.9

J’exécute une application de moteur d’application dans un environnement virtuel sous Windows 7 64 bits, python 2.7.9 x64.

Voici la stacktrace:

p_system = platform.system() File "C:\Python27\lib\platform.py", line 1310, in system return uname()[0] File "C:\Python27\lib\platform.py", line 1206, in uname release,version,csd,ptype = win32_ver() File "C:\Python27\lib\platform.py", line 597, in win32_ver import _winreg File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py", line 945, in load_module raise ImportError('No module named %s' % fullname) ImportError: No module named _winreg 

Cependant, cela fonctionne très bien avec cli (en dehors de venv):

 Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Users\Admin>python Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win 32 Type "help", "copyright", "credits" or "license" for more information. >>> import _winreg >>> import platform >>> platform.system() 'Windows' >>> 

Pourquoi cela arrive-t-il? Que puis-je faire pour résoudre ce problème?

Le module _winreg , comme disent les documents , existe pour “exposer l’API de registre Windows à Python”.

App Engine ne fournit pas une “API de registre Windows” (ni aucune autre API spécifique à Windows). Par conséquent, son sandbox bloque les tentatives d’ import du module – notez qu’à la fin de votre trace de stack, l’exception est délibérément sandbox.py dans le module sandbox.py du SDK App Engine.

“Virtual env” de Python ne joue aucun rôle ici – il s’agit d’App Engine.

Veuillez préciser quelle tâche vous essayez d’accomplir avec _winreg une fois que votre application GAE est déployée – supposons qu’elle est déployée sur des serveurs Linux (bien que l’environnement d’exécution GAE ne fournisse pas non plus d’API spécifique à Linux 🙂 API partout dans le quartier …

La solution de contournement fournie par Google, jusqu’à ce qu’un correctif soit implémenté, est la suivante:

  • Accédez à: \google\appengine\tools\devappserver2\python\sandbox.py
  • Trouvez la définition de _WHITE_LIST_C_MODULES = [xxx]
  • Ajoutez les deux lignes suivantes à la liste:

'_winreg',

'_ctypes',

Si cela ne réussit pas, exécutez python -m pip install google-cloud

Je pense que le problème est que GAE ne sait pas que vous êtes en mode de développement, je suppose parce que la variable SERVER_SOFTWARE est définie sur quelque chose qui ne commence pas par “Dev”.

Si vous exécutez le code suivant (avant d’appeler une bibliothèque GAE), il doit résoudre le problème:

 import os os.environ['SERVER_SOFTWARE'] = 'Dev' 

Remarque: Assurez-vous que ce code est supprimé avant de passer en production.

J’ai eu ce problème il y a quelques jours.

Comme indiqué plus haut, le sandbox GAE de Windows bloque certaines routines ou bibliothèques, même intégrées, car il est développé sur une plate-forme de type Unix.

J’ai ouvert un problème à Google Team et ils ont réussi une solution de contournement:

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

Cette solution de contournement a bien fonctionné.