我试图在我的Windows机器上运行的Google App Engine开发服务器上将Django升级到1.7版。
尝试加载应用时,我从doango\core\files\locks.py
获得以下异常:
ImportError: No module named msvcrt
相关的代码行是:
if os.name == 'nt':
import msvcrt
我想引发异常是因为App Engine的开发服务器没有提供msvcrt版本,但由于我的开发机器是Windows,os.name仍然是'nt'
。
是否有解决方案或解决方法?
相关的堆栈跟踪:
File "...\django\core\files\locks.py", line 30, in <module>
import msvcrt
File "D:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py", line 852, in load_module
raise ImportError('No module named %s' % fullname)
答案 0 :(得分:7)
刚刚找到了解决方法。在appengine_config.py
中添加以下行:
import os
on_appengine = os.environ.get('SERVER_SOFTWARE','').startswith('Development')
if on_appengine and os.name == 'nt':
os.name = None
我仍然在寻找一种不太讨厌的解决方案。
答案 1 :(得分:2)
我在使用PyCharm时发现了这个问题。我创建了一个新的Python GAE项目并表示我想要包含Flask。我在启动和运行时遇到了一些小问题,这是最后一个问题:正如@Tzach指出的那样,在运行其中一个GAE / Flask / JetBrains样板时,最终会遇到ImportError: No module named msvcrt
。然而,Tzach的黑客并没有为我工作 - 他们必须更改Click库以不同的方式检测主机操作系统。我的解决方案最终成为appengine_config.py
中的以下代码:
on_appengine = os.environ.get('SERVER_SOFTWARE','').startswith('Development')
if on_appengine and os.name == 'nt':
sys.platform = "Not Windows"
它改变的原因是因为看来Click现在正在使用以下代码来检测操作系统:
WIN = sys.platform.startswith('win')
希望有帮助!
答案 2 :(得分:0)
Devserver无法访问系统上的模块。它只查看项目中的模块。这是为了确保如果它在devserver上运行,它将在部署时运行。要么在你的devserver上使用修补版本的Django,要知道操作系统永远不会是&#39; nt&#39;在App Engine上,或者将msvcrt导入到您的项目中,以便在部署时找到并在app.yaml中放置skip_files行,因为在部署到App Engine的非Windows环境时永远不需要它。