Невозможно импортировать _winreg в виртуальной среде Python 2.7.9

Я запускаю приложение движка приложения в виртуальной среде на Windows 7 64bit, Python 2.7.9 x64.

Вот трассировка стека:

    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

Тем не менее, он отлично работает из Cli (за пределами 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'
>>>

Почему это происходит? Что я могу сделать, чтобы это исправить?

4 ответа

Решение

Модуль _winregкак говорят в документах, существует, чтобы "выставить API реестра Windows для Python".

App Engine не предоставляет "API реестра Windows" (или любой другой специфичный для Windows API). Поэтому его песочница блокирует попытки import модуль - обратите внимание, в конце вашей трассировки стека, что исключение преднамеренно вызывается в модуле sandbox.py SDK для App Engine.

"Виртуальная среда" Python здесь не играет никакой роли - все дело в App Engine.

Пожалуйста, уточните, с какой задачей вы пытаетесь выполнить _winreg как только ваше приложение GAE развернуто - предположим, что оно развернуто на серверах Linux (хотя среда исполнения GAE также не предоставляет специфичные для Linux API-интерфейсы:-), поэтому в любом месте поблизости нет API-интерфейса реестра Windows...

Обходной путь, предоставляемый Google до тех пор, пока не будет реализовано исправление, заключается в следующем:

  • Идти к: <sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py
  • Найти определение _WHITE_LIST_C_MODULES = [xxx]
  • Добавьте следующие две строки в список:

'_winreg',

'_ctypes',

Если это не удается, запустите python -m pip install google-cloud

Я думаю, что проблема в том, что GAE не знает, что вы находитесь в режиме разработки, я полагаю, потому что переменная SERVER_SOFTWARE установлена ​​на что-то, не начинающееся с "Dev".

Если вы выполняете следующий код (перед вызовом любой библиотеки GAE), это должно решить проблему:

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

Примечание: убедитесь, что этот код удален перед началом работы.

У меня была эта проблема несколько дней назад.

Как сказано выше, песочница GAE в Windows блокирует некоторые подпрограммы или библиотеки, даже встроенные, потому что она разработана для Unix-подобной платформы.

Я открыл вопрос для команды Google, и они прошли обходной путь:

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

Этот обходной путь работал хорошо.

Другие вопросы по тегам