无法在Python 2.7.9虚拟环境中导入_winreg

时间:2015-02-21 01:27:53

标签: python windows google-app-engine python-2.7 winreg

我在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 个答案:

答案 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

这种解决方法效果很好。