如何修复PyDev“导入的未定义变量”错误?

时间:2010-01-21 20:40:49

标签: python code-analysis pydev

我在Eclipse中使用PyDev创建了一个Python项目,并且PyDev不断为我的代码生成错误错误。我有一个模块settings,它定义了一个settings对象。我在模块b中导入它并分配一个属性:

from settings import settings
settings.main = object()

在我的一些代码中 - 但不是全部代码,如:

from settings import settings
print settings.main 

...在Eclipse代码错误窗格中生成“来自import:main的未定义变量”消息,即使代码运行没有问题。我该如何纠正这些?

13 个答案:

答案 0 :(得分:151)

对于项目中的代码,唯一的方法是添加一个声明,表示您期望 - 可能受if False保护,以便它不会执行(静态代码分析只能看到您看到的内容) ,而不是运行时信息 - 如果您自己打开该模块,则没有迹象表明主要是预期的。)

要克服这个问题,有一些选择:

  1. 如果它是某个外部模块,则可以将其添加到forced builtins,以便PyDev为它生成一个shell以获取运行时信息(有关详细信息,请参阅http://pydev.org/manual_101_interpreter.html) - 即:大多数情况下,PyDev会在shell中导入模块,并对模块中的类进行dir(module)dir以显示完成并进行代码分析。

  2. 您可以在有错误的行中使用Ctrl + 1(Cmd + 1代表Mac),PyDev会为您提供添加注释以忽略该错误的选项。

  3. 可以创建一个stub模块并将其添加到predefined完成(http://pydev.org/manual_101_interpreter.html也有详细信息)。

答案 1 :(得分:47)

我正在使用opencv,它依赖于二进制文件等,所以我有脚本,其他所有行都有这个愚蠢的错误。 Python是一种动态语言,所以这种场合不应被视为错误。

我完全删除了这些错误:

窗口 - >偏好 - > PyDev - >编辑 - >代码分析 - >未定义 - >来自导入的未定义变量 - >忽略

就是这样。

它也可能是, 窗口 - >偏好 - > PyDev - >编辑 - >代码分析 - >进口 - >未找到导入 - >忽略

答案 2 :(得分:16)

标记为答案的帖子提供了一种解决方法,而非解决方案。

此解决方案适用于我:

  • 转到Window - Preferences - PyDev - Interpreters - Python Interpreter
  • 转到Forced builtins标签
  • 点击New...
  • 输入模块的名称(在我的情况下为multiprocessing),然后点击OK

错误消息不仅会消失,模块成员也会被识别。

答案 3 :(得分:9)

我在Eclipse / PyDev项目中遇到了类似的问题。在这个项目中,python代码的根目录是项目的子目录。

--> MyProject
 + --> src         Root of python code
   + --> module1     A module 
   + --> module2     Another module
 + --> docs
 + --> test

当项目被调试或运行时,一切都很好,因为工作目录设置在正确的位置。但是,PyDev代码分析无法从module1或module2中找到任何导入。

解决方案是编辑项目属性 - > PyDev - PYTHONPATH部分并从源文件夹选项卡中删除/ MyProject,并将/ MyProject / src添加到它。

答案 4 :(得分:6)

这对我有用:

步骤1)删除解释器,再次自动配置

步骤2)窗口 - 首选项 - PyDev - 解释器 - Python解释器         转到强制内置选项卡         点击新...         键入模块的名称(在我的情况下为curses),然后单击“确定”

步骤3)在项目资源管理器中右键单击任何给出错误的模块。转到PyDev->代码分析。

答案 5 :(得分:1)

我遇到了同样的问题。我在Windows上使用Python和Eclipse。代码运行得很好,但eclipse在各处显示错误。在我将文件夹'Lib'的名称更改为'lib'(C:\ Python27 \ lib)之后,问题就解决了。似乎如果字母的大写与配置文件中的大写不匹配,这有时会引起问题(但似乎并非总是如此,因为错误检查很长时间才能突然出现问题,因为没有明显的问题原因)。

答案 6 :(得分:1)

我正在做的事情的近似值:

import module.submodule

class MyClass:
    constant = submodule.constant

哪个pylint说: E: 4,15: Undefined variable 'submodule' (undefined-variable)

我通过更改导入来解决此问题,如:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

注意:我还通过导入变量重命名,使其具有大写名称以反映其常量性质。

答案 7 :(得分:0)

您可能只需要在Eclipse中重新配置python路径。请参阅我的answer以查找类似问题。

答案 8 :(得分:0)

偏好中的

- > PyDev - >传递给PyLint的参数下的PyLint 添加以下行:

--generated-members=objects

您需要为每个生成的内容执行此操作。我通过谷歌搜索找到了这个,但我丢失了参考。

答案 9 :(得分:0)

在项目资源管理器中右键单击任何给出错误的模块。转到PyDev->删除错误标记。

答案 10 :(得分:0)

我的回答并没有做出任何新的贡献,只是我遇到的一个具体例子。

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev显示错误消息"导入的未定义变量:get_default_root_window()"

在python shell中你可以看到这是一个内置的'上面的答案中提到的模块:

>>> import gtk.gdk
>>> gtk.gdk
<module 'gtk.gdk' (built-in)>

现在在Window-&gt; Preferences-&gt; PyDev-&gt; Interpreters-&gt; Python Interpreter下,我选择了标签&#39; Forced Builtins&#39;并添加了&gt; gtk.gdk&#39;列表。

现在错误信息已经显示了。

答案 11 :(得分:0)

我发现这两个步骤一直对我有用:

  1. 确认(否则)将模块的父文件夹添加到PYTHONPATH。
  2. 将模块的完整名称添加到强制内置。
  3. 这里需要注意的事项:

    • 某些常用模块会安装一些具有相同名称的父对子对。在这些情况下,您还必须将该父级添加到PYTHONPATH,以及祖父级文件夹,您已经确认/添加了其他所有内容。

    • 使用(例如)&#34; google.appengine.api.memcache&#34;当添加到强制内置时,NOT&#34; memcache&#34;只有,在哪里&#34; google&#34;在此示例中,是PYTHONPATH中定义的文件夹的直接子项。

答案 12 :(得分:0)

如果您确定脚本已运行并且是错误警报,请转至“首选项”>“ PyDev”>“编辑器”>“代码分析”。将错误降级为警告。

enter image description here

http://www.pydev.org/manual_adv_code_analysis.html