无法在 Python 2.7.9 虚拟环境中导入 _winreg
Unable to import _winreg in Python 2.7.9 virtual environment
我是 运行 windows 7 64 位、python 2.7.9 x64 虚拟环境中的 App Engine 应用程序。
这是堆栈跟踪:
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'
>>>
为什么会这样?我该怎么做才能解决这个问题?
模块 _winreg
,如 the docs 所说,存在于 "expose the Windows registry API to Python"。
App Engine 不提供 "Windows registry API"(也不提供任何其他 Windows 特定的 API)。因此,它的 sandbox 阻止了对 import
模块的尝试——请注意,在堆栈跟踪的末尾,异常是在模块 sandbox.py
中故意引发的App Engine SDK。
Python 的 "virtual env" 在这里没有任何作用 -- 都是关于 App Engine 的。
一旦部署了 GAE 应用程序,请说明您要使用 _winreg
完成什么任务——假设它已部署到 Linux 服务器(尽管 GAE 运行时不提供 Linux-特定的 APIs 要么:-),因此附近的任何地方都没有 Windows 注册表 API...
我认为问题在于 GAE 不知道您处于开发模式,我想是因为 SERVER_SOFTWARE 变量设置为不以 "Dev" 开头的内容。
如果您执行以下代码(在调用任何 GAE 库之前)它应该可以解决问题:
import os
os.environ['SERVER_SOFTWARE'] = 'Dev'
注意:确保在投入生产之前删除此代码。
我几天前遇到过这个问题。
如上所述,Windows 上的 GAE 沙箱阻止了一些例程或库,甚至是内置的,因为它是针对类 Unix 平台开发的。
我向 Google 团队提出了一个问题,他们通过了解决方法:
https://issuetracker.google.com/issues/38290292
该解决方法效果很好。
Google 提供的解决方法,直到实施修复,如下所示:
- 转到:
<sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py
- 找到
_WHITE_LIST_C_MODULES = [xxx]
的定义
- 将以下两行添加到列表中:
'_winreg',
'_ctypes',
如果不成功,运行 python -m pip install google-cloud
我是 运行 windows 7 64 位、python 2.7.9 x64 虚拟环境中的 App Engine 应用程序。
这是堆栈跟踪:
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'
>>>
为什么会这样?我该怎么做才能解决这个问题?
模块 _winreg
,如 the docs 所说,存在于 "expose the Windows registry API to Python"。
App Engine 不提供 "Windows registry API"(也不提供任何其他 Windows 特定的 API)。因此,它的 sandbox 阻止了对 import
模块的尝试——请注意,在堆栈跟踪的末尾,异常是在模块 sandbox.py
中故意引发的App Engine SDK。
Python 的 "virtual env" 在这里没有任何作用 -- 都是关于 App Engine 的。
一旦部署了 GAE 应用程序,请说明您要使用 _winreg
完成什么任务——假设它已部署到 Linux 服务器(尽管 GAE 运行时不提供 Linux-特定的 APIs 要么:-),因此附近的任何地方都没有 Windows 注册表 API...
我认为问题在于 GAE 不知道您处于开发模式,我想是因为 SERVER_SOFTWARE 变量设置为不以 "Dev" 开头的内容。
如果您执行以下代码(在调用任何 GAE 库之前)它应该可以解决问题:
import os
os.environ['SERVER_SOFTWARE'] = 'Dev'
注意:确保在投入生产之前删除此代码。
我几天前遇到过这个问题。
如上所述,Windows 上的 GAE 沙箱阻止了一些例程或库,甚至是内置的,因为它是针对类 Unix 平台开发的。
我向 Google 团队提出了一个问题,他们通过了解决方法:
https://issuetracker.google.com/issues/38290292
该解决方法效果很好。
Google 提供的解决方法,直到实施修复,如下所示:
- 转到:
<sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py
- 找到
_WHITE_LIST_C_MODULES = [xxx]
的定义
- 将以下两行添加到列表中:
'_winreg',
'_ctypes',
如果不成功,运行 python -m pip install google-cloud