我在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'
>>>
为什么会这样?我该怎么做才能解决这个问题?
答案 0 :(得分:6)
模块_winreg
,如the docs所说,存在于"将Windows注册表API暴露给Python"。
App Engine不提供" Windows注册表API" (也不是任何其他Windows特定的API)。因此, sandbox 会阻止尝试import
模块 - 请注意,在堆栈跟踪结束时,App Engine的模块sandbox.py
中会故意引发异常SDK。
Python"虚拟环境"在这里不起作用 - 它完全与App Engine有关。
请说明一旦部署GAE应用程序后,您尝试使用_winreg
完成的任务 - 假设它已部署到Linux服务器(尽管GAE运行时无法提供)特定于Linux的API :-),所以附近的任何地方都没有Windows注册表API ......
答案 1 :(得分:4)
在实施修复程序之前,Google提供的解决方法如下:
<sdk_root>\google\appengine\tools\devappserver2\python\sandbox.py
_WHITE_LIST_C_MODULES = [xxx]
'_winreg',
'_ctypes',
如果不成功,请运行python -m pip install google-cloud
答案 2 :(得分:1)
我认为问题是GAE不知道你处于开发模式,我想因为SERVER_SOFTWARE变量设置为不以“Dev”开头的东西。
如果您执行以下代码(在调用任何GAE库之前),它应该解决问题:
import os
os.environ['SERVER_SOFTWARE'] = 'Dev'
注意:确保在投入生产之前删除此代码。
答案 3 :(得分:1)
几天前我遇到了这个问题。
如上所述,Windows上的GAE沙箱阻止了一些例程或库,甚至是内置的例程,因为它是开发到类Unix平台的。
我向Google小组开了一个问题,他们通过了一个解决方法:
https://issuetracker.google.com/issues/38290292
这种解决方法效果很好。