GAE导入错误; sys.path显示appengine库的错误路径

时间:2016-06-20 23:19:24

标签: python python-2.7 google-app-engine google-cloud-storage jinja2

我正在Windows 10上用Python开发一个用于Google App Engine的Web应用程序。当我的main.py只提供模板时,一切正常。

import os
import urllib
from google.appengine.api import users
import jinja2
import webapp2

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True)

但后来我尝试添加云存储,无论我尝试过哪个库,都会遇到导入错误。所以我从main.py中删除了那些引用,现在我得到了jinja2的错误,它一直工作正常!

ImportError: No module named jinja2

我不记得我尝试过的一切,但这就是我所知道的:

  • jinja2已安装;尝试点击安装/升级说它已经安装并且是最新的,我在c:\python27\lib\site-packages中看到了它。
  • 系统和用户
  • PYTHONPATH=C:\python27;c:\python27\lib;C:\Python27\DLLS
  • 我曾经根据this将带有PIP的GoogleAppEngineCloudStorageClient安装到我的应用程序的lib目录中。它不起作用(模块无法导入),所以我也尝试添加sys.path.append(os.path.join(os.path.dirname(__file__), "lib")),但它没有帮助。 我认为这是我开始收到jinja2导入错误的时候。所以我从main.py中删除了该语句。仍然得到jinja2导入错误。我试过pip uninstall GoogleAppEngineCloudStorageClient但它说它没有安装,所以我尝试删除lib目录。仍然得到jinja2导入错误。
  • 尝试重新启动服务并重新启动计算机。

编辑:

我将main.py一直剥离到新项目模板

import webapp2

class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.write('Hello world!')

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

现在我收到了webapp2的导入错误:

ImportError: No module named webapp2

编辑2:

将其插入main.py的顶部,

import sys
print sys.path

我可以看到所有Google软件包的错误路径:

'C:\\Program Files (x86)\\Google\\lib\\webapp2-2.5.2', 
'C:\\Program Files (x86)\\Google\\lib\\pycrypto-2.6', 
'C:\\Program Files (x86)\\Google\\lib\\jinja2-2.6', 
'C:\\Program Files (x86)\\Google\\lib\\markupsafe-0.15', 
'C:\\Program Files (x86)\\Google\\lib\\setuptools-0.6c11', 
'C:\\Program Files (x86)\\Google\\lib\\protorpc-1.0', 
'C:\\Program Files (x86)\\Google\\lib\\webob-1.1.1', 
'C:\\Program Files (x86)\\Google\\lib\\yaml-3.10'

他们实际上在C:\Program Files (x86)\Google\google_appengine\lib

在我尝试安装这个软件包之前,我不知道为什么我没有遇到此问题,但这可能与a reported google issue有关。

2 个答案:

答案 0 :(得分:2)

更新:此问题已在SDK版本1.9.40中修复。

a GAE issue导致SDK版本1.9.37中引入此行为,请参阅"ImportError: No module named webapp2" after Linux SDK upgrade (1.9.35 -> 1.9.38)

如果您的SDK版本是1.9.37或1.9.38降级到1.9.36,您可以找到here。至少在解决方案发布之前。

答案 1 :(得分:0)

要点:

webapp2和jinja2导入错误是由sys.path损坏引起的,这是版本1.9.37或1.9.38中存在GAE缺陷的结果。它只影响发展;部署版本应该工作。它可以在升级后或尝试安装其他项目后立即发生。

解决方案:

  • 将AppEngineSDK降级为1.9.36 为我工作
  • GAE缺陷将在1.9.38之后的某个时间点修复。检查Issue 12963状态。
  • Google issue 13084,另一种解决方法是在appengine_config.py中手动修补sys.path。 Docs here