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

141

我有一个使用PyDev在Eclipse中的Python项目,PyDev会为我的代码生成错误报告。我有一个名为settings的模块,用于定义一个settings对象。我在b模块中导入该模块,并使用以下命令分配一个属性:

from settings import settings
settings.main = object()

在我的一些代码中——但并非全部代码,存在这样的语句:

from settings import settings
print settings.main 

即使代码可以正常运行,但在Eclipse代码错误面板中会生成“从导入中未定义的变量:main”的消息。 我该如何纠正这些错误?


我在这些答案中没有看到与pylint相关的内容:\ 我认为这就是这个通知的来源,我希望找到如何告诉pylint那不是变量,而是一个导入的方法。 - ThorSummoner
13个回答

158

在您的项目中,唯一的方式是添加一个声明,说明您期望这个 -- 可能受到if False保护以使其不执行(静态代码分析只看您所看到的内容,不会运行时信息 -- 如果您自己打开了该模块,您将没有任何关于main被期望的指示)。

为了解决这个问题,有以下几种选择:

  1. 如果是某些外部模块,则可以将其添加到强制内置中,以便PyDev生成一个shell来获取运行时信息(详见http://pydev.org/manual_101_interpreter.html),即:大多数情况下,PyDev将在shell中导入模块,并在模块中发现类时对其进行dir(module)dir处理,以提供完成和代码分析。

  2. 您可以在出错的行上使用Ctrl + 1(Mac为Cmd + 1),PyDev将向您呈现一个选项,以添加一个注释来忽略该错误。

  3. 可以创建一个存根模块,并将其添加到预定义完成项中(http://pydev.org/manual_101_interpreter.html也有关于此的详细信息)。


1
有时将模块添加到强制内置中并不能解决问题(例如,请参见此错误 http://sourceforge.net/tracker/?func=detail&atid=577329&aid=3090346&group_id=85796) - Boris Gorelik
9
我尝试了Ctrl-1,它给我返回了'@UndefinedVariable',然后添加了一个注释,这样就可以了。谢谢。 - RichMeister
我在最新的Eclipse和PyDev中遇到了同样的问题。我可以在所有模块之间导航,那么为什么代码分析不能做到相同的事情呢? - Adam
嗨,亚当,这可能取决于您特定的用例...如果您认为它应该找到它,请在https://sw-brainwy.rhcloud.com/tracker/PyDev/上创建一个问题。 - Fabio Zadrozny
4
在采取极端措施之前,请确保目录在PYTHONPATH中,然后退出/重新启动Eclipse,执行 Project>Pydev>Remove error markers,此时numpy应该出现在强制内置中。 - smci
显示剩余7条评论

50

我正在使用依赖于二进制文件等的opencv,因此我的脚本中每隔一行就会出现这种愚蠢的错误。Python是一种动态语言,所以不应该将这种情况视为错误。

我通过前往以下位置从而完全删除了这些错误:

Window -> Preferences -> PyDev -> Editor -> Code Analysis -> Undefined -> Undefined Variable From Import -> Ignore

就这样。

还有可能是: Window -> Preferences -> PyDev -> Editor -> Code Analysis -> Imports -> Import not found -> Ignore


9
谢谢您。这很简单易懂。不过,我把“未找到导入”设置改为了“警告”,现在什么都没显示出来。 :) 希望如果真的有导入问题,我能够收到警告提示。 - Love and peace - Joe Codeswell
1
必须重新启动Eclipse才能使更改生效。 - spettekaka

28

被标记为答案的帖子给出了一种解决方法,而非解决方案。

这个解决方案对我有用:

  • 转到Window - Preferences - PyDev - Interpreters - Python Interpreter
  • 转到强制内置选项卡
  • 点击New...
  • 输入模块名称(例如我的情况下是multiprocessing),然后点击OK

这不仅会使错误消息消失,还将识别模块成员。


1
考虑到“标记为答案的帖子”是由PyDev的开发人员编写的,您应该再次查看它。他在帖子本身中没有给出明确的说明,因为他链接到了您指定的说明。 - coredumperror
5
@CoreDumpError 我不关心是谁写的帖子。我尝试了帖子描述的方法,它可以用,但只是一种解决办法,而不是真正的解决方案。我所描述的可能对其他电脑无效,但对我有效且是正确的解决方案。如果其他帖子链接到解决方案而不是描述它,那么它就不遵循准则。我通过描述对我有效的好解决方案来遵循准则,希望这能帮助其他人。 - stenci
3
现在它可以,我在编辑之前发布了我的答案。 - stenci
是的,这是一个更好、更干净的解决方案!它不是简单地掩盖或隐藏问题,而是提供了真正的修复方法。我必须添加 re,但一旦添加了,就不会再出现像 re.M 这样的错误了。 - Bostone

10

我在使用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添加到其中。

只是想提供验证,确实可以完美地运行。 - Amndeep7
是的,我只是去了主菜单 Project/Properties/PyDev - PYTHONPATH,并添加了应用程序所需的所有路径,这解决了问题! - Kostyantyn

7
这对我很有帮助:
步骤1)删除解释器,重新自动配置 步骤2)窗口 - 首选项 - PyDev - 解释器 - Python解释器 转到强制内置选项卡 点击新建... 输入模块的名称(在我的情况下是curses),然后点击确定 步骤3)在项目浏览器中右键单击导致错误的任何模块。转到PyDev->代码分析。

对我也起作用了,感谢您比当前被接受的答案更明确地阐述每个步骤。 - sc28

3
我曾遇到同样的问题。我在Windows上使用Python和Eclipse,代码运行得很好,但是Eclipse却到处显示错误。之后,当我将文件夹“Lib”改名为“lib”(C:\Python27\lib)时,问题得以解决。如果字母大小写与配置文件中的不匹配,则有时会导致此类问题(但并非总是如此,因为长时间没有问题,在没有明显原因的情况下,问题突然出现了)。

5
这是Eclipse最喜欢的消遣方式,让错误标志突然无缘无故地出现。它会让人们觉得自己已经把整个世界搞崩了,但实际上这只是Eclipse为了好玩或者什么神秘利益而随意决定引入的一些无意义的错误标志。 - R Thiede
1
我尝试过这个方法,觉得它可以用,但事实证明只是一个诡计,而且花费了超过5分钟的时间,所以我无法撤销。不过@Fabio Zadrozny的ctrl-1@UndefinedVariable方法却完美地运作了,即使在5分钟后也能持续工作! - Mark Mikofski

1

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

import module.submodule

class MyClass:
    constant = submodule.constant

对此,pylint说:

E: 4,15: 未定义变量'submodule' (undefined-variable)

我通过更改导入方式解决了这个问题:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

注意:我还将导入的变量重命名为大写名称,以反映其常量属性。


0

在偏好设置中 --> PyDev --> PyLint 中,在 传递给 PyLint 的参数 栏目中添加此行:

--generated-members=objects

你需要为每个生成的文件都这样做。我通过谷歌搜索找到了这个方法,但是我忘记了参考资料。


0

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->Preferences->PyDev->Interpreters->Python Interpreter下,我选择了'Forced Builtins'选项卡,并将'gtk.gdk'添加到列表中。
现在错误信息不再显示了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接