我在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' >>>
为什么会这样呢? 我能做些什么来解决这个问题?
正如文档所说,模块_winreg
存在于“将Windows注册表API提供给Python”。
App Engine不提供“Windows注册表API”(也不提供任何其他特定于Windows的API)。 因此,它的沙盒模块会尝试import
模块 – 请注意,在堆栈跟踪结束时,App Engine SDK的模块sandbox.py
中会故意引发异常。
Python的“虚拟环境”在这里没有任何作用 – 这一切都是关于App Engine的。
一旦你的GAE应用程序被部署,请澄清你想用_winreg
完成什么任务 – 假设它被部署到Linux服务器(尽管GAE运行时不提供Linux特定的API :-),所以没有Windows注册表API附近的任何地方…
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'
注意:在投入生产之前,确保删除了这段代码。
前几天我有这个问题。
如上所述,Windows上的GAE沙盒阻塞了一些例程或库,甚至是内置的,因为它是开发到类Unix平台的。
我向Google小组提出了一个问题,他们通过了一个解决方法:
https://issuetracker.google.com/issues/38290292
该解决方法运作良好。