Eclipse+PyDev+GAE memcache “导入未定义变量:get”

19 投票
6 回答
4600 浏览
提问于 2025-04-15 14:33

我开始使用Eclipse和PyDev来开发我的第一个Google App Engine应用。Eclipse的设置是按照这个教程来的。

一切都运行得很好,直到我开始使用memcache。PyDev报告了一些错误,我不知道该怎么解决:

alt text

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

怎么解决这个问题呢?当然,这只是PyDev检查器的问题。代码是正确的,并且在GAE上可以运行。

更新:

  1. 我使用的是PyDev 1.5.0,但在1.4.8上也遇到过同样的问题。
  2. 我的PYTHONPATH包括(在项目属性/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

更新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 个回答

4

我来得有点晚,不过你可以在所有使用memcache的文件里加上下面这行注释,这样就可以选择性地关闭pydev的分析功能:

#@PydevCodeAnalysisIgnore

25

有一个更简单的解决办法:试着把GAE的内存缓存(memcache)添加到你的强制内置模块里。

在你的PyDev设置中,找到解释器(Interpreter)选项,然后进入Python的强制内置模块(ForcedBuiltins)窗口,添加“google.appengine.api.memcache”这个条目,然后点击应用。

双击那些内存缓存的错误,它们就会消失了!

请确保你的系统Python路径中包含了google APE的安装目录。

3

你在用哪个版本的PyDev?是最近的版本(1.5)还是谷歌教程里提到的旧版本?
可以看看 这个讨论帖

还有一个类似的 PyROOT的问题

因为PyDEV插件不读取 $HOME/.pystartup,所以简单地触碰一下函数或类并不能解决问题。它会分析要导入的Python模块的语法和结构,而不是实时分析,而是在我从Eclipse的设置面板中设置 PYTHONPATH 的时候。

那么你的 PYTHONPATH 有指向谷歌的库吗?


在1.5版本中,可能会有代码补全的问题,这可能会让你不得不禁用代码分析: Pydev 1.5.0的代码分析会破坏pyqt4的代码补全 - 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的代码补全又开始正常工作了。

撰写回答