2015-02-21 7 views
2

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

Вот 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 

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

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

+0

вы имеете в виду приложение 'virtualenv'? вам, вероятно, нужно установить winreg? или win32api –

+1

_winreg является частью python, поэтому он не находится на pypi, и я не могу найти его нигде. –

+5

@JoranBeasley, '_winreg' обычно встроен в файл python27.dll (см.' sys.builtin_module_names'). Эта среда, очевидно, исключает ее, поскольку она изолирована. – eryksun

ответ

6

Модуль _winreg, так как the docs говорят, существует, чтобы «открыть API реестра Windows для Python».

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

«виртуальный env» от Python не играет здесь никакой роли - все дело в App Engine.

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

+0

OP пытается 'platform.system()', который действительно должен обработать этот сценарий более изящно. – eryksun

+0

Он вызывает 'platform.uname()' и в Windows, который вызывает 'platform.win32_ver()'. Это утечка 'ImportError' вместо обработки, как это делает' AttributeError' для 'sys.getwindowsversion'. Без доступа к реестру он должен отказаться от анализа переменных среды и вывода команды 'ver'. Для последнего в 2.x 'platform._syscmd_ver' может все еще не получиться, если' RuntimeError' поднят 'popen', например, когда'% COMSPEC% 'не определено. '_PyPopenCreateProcess' должен поднять' OSError' для этого; «RuntimeError» является излишним. – eryksun

+0

Пожалуйста, откройте проблему на https://code.google.com/p/googleappengine/issues/list - в идеале, просто объясните задачу, требующую вызова 'platform.whatever' в первую очередь, перед лицом установленного App Engine , архивированные попытки скрыть, на какой платформе работают серверы, сосредоточиться на независимости 100% -ной платформы :-). По крайней мере, более резкие, более ранние исключения в вашем лице могут быть подняты для диагностики таких попыток пробить песочницу ... –

1

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

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

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

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

1

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

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

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

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

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

4

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

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

'_winreg',

'_ctypes',

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

+0

Теперь я получаю« NameError: global name » Ошибка _dlopen 'не определена ". Есть ли у вас какие-либо идеи по этому поводу? – KinoP