Eclipse + PyDev + GAE内存缓存“来自导入的未定义变量:get”

时间:2009-09-24 05:12:29

标签: python eclipse google-app-engine pydev

我已经开始使用Eclipe + PyDev作为开发我的第一个Google App Engine应用程序的环境。 Eclipse是根据this tutorial配置的。

一切正常,直到我开始使用memcache。 PyDev报告错误,我不知道如何解决它:

alt text

错误:导入的未定义变量:get

如何解决这个问题? 当然,这只是PyDev检查器的问题。代码是正确的,并在GAE上运行。

更新:

  1. 我正在使用PyDev 1.5.0,但经历了相同的1.4.8。
  2. 我的PYTHONPATH包含(在Project Properties / PyDev中设置 - PYTHONPATH):
    • C:\Program Files\Google\google_appengine
    • C:\Program Files\Google\google_appengine\lib\django
    • C:\Program Files\Google\google_appengine\lib\webob
    • C:\Program Files\Google\google_appengine\lib\yaml\lib
  3. 更新2:

    我查看了C:\Program Files\Google\google_appengine\google\appengine\api\memcache\__init__.py,发现get()未被声明为memcache模块函数。他们使用以下技巧(我没有听说过这种可能性):

    _CLIENT = None
    
    
    def setup_client(client_obj):
      """Sets the Client object instance to use for all module-level methods.
    
      Use this method if you want to have customer persistent_id() or
      persistent_load() functions associated with your client.
    
      Args:
        client_obj: Instance of the memcache.Client object.
      """
      global _CLIENT
      var_dict = globals()
    
      _CLIENT = client_obj
      var_dict['set_servers'] = _CLIENT.set_servers
      var_dict['disconnect_all'] = _CLIENT.disconnect_all
      var_dict['forget_dead_hosts'] = _CLIENT.forget_dead_hosts
      var_dict['debuglog'] = _CLIENT.debuglog
      var_dict['get'] = _CLIENT.get
      var_dict['get_multi'] = _CLIENT.get_multi
      var_dict['set'] = _CLIENT.set
      var_dict['set_multi'] = _CLIENT.set_multi
      var_dict['add'] = _CLIENT.add
      var_dict['add_multi'] = _CLIENT.add_multi
      var_dict['replace'] = _CLIENT.replace
      var_dict['replace_multi'] = _CLIENT.replace_multi
      var_dict['delete'] = _CLIENT.delete
      var_dict['delete_multi'] = _CLIENT.delete_multi
      var_dict['incr'] = _CLIENT.incr
      var_dict['decr'] = _CLIENT.decr
      var_dict['flush_all'] = _CLIENT.flush_all
      var_dict['get_stats'] = _CLIENT.get_stats
    
    
    setup_client(Client())
    

    嗯......知道如何强迫PyDev识别出来吗?

6 个答案:

答案 0 :(得分:25)

有一个更清洁的解决方案:尝试将GAE的memcache添加到强制内置组件中。

在PyDev-> Interpreter-Python-> ForcedBuiltins窗口中,添加“google.appengine.api.memcache”条目并应用。

双击内存缓存错误以检查它们,它们会消失!

请确保系统pythonpath包含google APE安装目录。

答案 1 :(得分:4)

我参加派对有点晚了,但您可以在所有使用memcache的文件中添加以下注释,以便有选择地关闭pydev分析:

#@PydevCodeAnalysisIgnore

答案 2 :(得分:4)

如果您不想关闭项目/模块的所有代码分析,则只需为该行关闭它。 This answer解释说您可以按Ctrl + 1进行快速修复,并在该行的末尾插入#@UndefinedVariable

答案 3 :(得分:3)

您使用的是什么版本的PyDev?最近的一个(1.5)或谷歌教程引用的旧的? 请参阅this thread

有类似的issue with PyROOT

  

由于PyDEV插件无法读取$HOME/.pystartup,因此触摸函数/类不是解决方案。因为它分析了要导入的python模块的语法和结构,但是当我从Eclipse的首选项面板设置PYTHONPATH时。

您的PYTHONPATH也参考了Google图书馆吗?


它们可能是1.5中代码完成的问题,这可能会迫使您禁用代码分析:Pydev 1.5.0 code anlaysis breaks code pyqt4 code completion - ID: 2855598

  

安装了pyqt 4.5.4   最初我安装了pydev 1.4.8开源版本,代码完成工作正常   更新到pydev 1.5.0后,pyqt代码完成停止运行   在 "eclipse preferences -> pydev -> editor -> code analysis -> do code analysis?" 中禁用Pydev代码分析后,代码完成再次开始为PyQt工作   课等。

答案 4 :(得分:3)

这对我有用,它与上述解决方案不同。 非常直截了当: http://blog.kicaj.com/fixing-pydev-memcache-unresolved-import/

只是说将google_appengine文件夹添加到pydev python解释程序库。

答案 5 :(得分:0)

我通过将这几行添加到我文件顶部的代码中来解决这个问题:

from google.appengine.api import memcache
# work-around for Eclipse+PyDev+GAE memcache error
if not hasattr(memcache, 'set'):
    Client=None
    memcache.setup_client(Client)
    memcache = Client

您可以在生产版本中将其转出。

只是让eclipse高兴并让代码完成工作。