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

Posted

技术标签:

【中文标题】如何修复 PyDev“导入未定义变量”错误?【英文标题】:How do I fix PyDev "Undefined variable from import" errors? 【发布时间】:2011-01-07 22:27:34 【问题描述】:

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

from settings import settings
settings.main = object()

在我的一些代码(但不是全部)中,如下语句:

from settings import settings
print settings.main 

... 在 Eclipse 代码错误窗格中生成“Undefined variable from import: main”消息,即使代码运行没有问题。我该如何纠正这些?

【问题讨论】:

我在这些答案中没有看到任何与 pylint 相关的内容:\ 我认为这就是该通知的来源,我希望找到如何告诉 pylint 这不是变量,它是一个导入。 【参考方案1】:

对于您项目中的代码,唯一的方法是添加一个声明,说明您期望 - 可能受 if False 保护,因此它不会执行(静态代码分析只看到您看到的内容,而不是运行时信息——如果你自己打开了那个模块,你不会知道 main 是预期的)。

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

    1234563将在 shell 中导入模块并在模块中找到的类上执行dir(module)dir 以呈现完成并进行代码分析。

    您可以在出现错误的行中使用 Ctrl+1(对于 Mac 为 Cmd+1),PyDev 会为您提供一个选项来添加注释以忽略该错误。

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

【讨论】:

有时将模块添加到强制内置函数没有帮助(请参阅此错误,例如 sourceforge.net/tracker/…) @Fabio:predefined completions 可以在这里使用吗?如果您执行try: import a; except: a=mockModule 之类的操作,还有哪些选项可以在没有 cmets 的情况下抑制这些? 我试过 Ctrl-1 它给了我'@UndefinedVariable',它添加了一个注释并且有效。谢谢。 我在使用最新的 Eclipse 和 PyDev 时遇到了同样的问题。我可以在所有模块之间导航,为什么代码分析不能做同样的事情? 在你走极端之前,确保目录在 PYTHONPATH 中,然后退出/重启 Eclipse,执行 Project>Pydev>Remove error markers,numpy 现在应该出现在Forced 内置函数。【参考方案2】:

我使用的是依赖二进制文件等的 opencv,所以我有脚本,其中每隔一行都有这个愚蠢的错误。 Python 是一种动态语言,因此不应将此类情况视为错误。

我通过以下方式完全消除了这些错误:

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

就是这样。

也有可能, 窗口 -> 首选项 -> PyDev -> 编辑器 -> 代码分析 -> 导入 -> 未找到导入 -> 忽略

【讨论】:

谢谢。它简单易行。但是,我没有将“未找到导入”设置更改为“忽略”,而是将其更改为“警告”。现在什么都没有出现。 :) 希望如果我遇到真正的导入问题,我会收到警告。 必须重新启动 Eclipse 才能使更改生效。【参考方案3】:

标记为答案的帖子给出了解决方法,而不是解决方案。

这个解决方案对我有用:

转到Window - Preferences - PyDev - Interpreters - Python Interpreter 转到Forced builtins 标签 点击New... 输入模块名称(在我的例子中为multiprocessing)并点击OK

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

【讨论】:

考虑到“标记为答案的帖子”是由 PyDev 的开发人员编写的,您或许应该再看看它。他没有在帖子本身中给出明确的说明,因为他链接到您指定的说明。 @CoreDumpError 我不在乎是谁写的。我尝试了帖子描述的内容,它有效,但这是一种解决方法,而不是解决方案。我所描述的可能不适用于其他计算机,但适用于我并且是正确的解决方案。如果其他帖子链接到解决方案而不是描述它,那么它不遵循指南,我通过描述什么对我来说是一个好的解决方案来遵循指南,希望对其他人有所帮助。 @Isaac 现在是这样,我在编辑之前发布了我的答案。 是的,这是更好、更清洁的解决方案!它没有掩盖或隐藏它,而是提供了合法的修复。我不得不添加re,但是一旦我不再为re.M之类的东西做红墨水【参考方案4】:

我在 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 添加到它。

【讨论】:

只是想证明这实际上是完美的。 是的,只需进入主菜单 Project/Properties/PyDev - PYTHONPATH 并添加应用程序所需的所有路径,即可解决问题!【参考方案5】:

这对我有用:

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

步骤 2) 窗口 - 首选项 - PyDev - 解释器 - Python 解释器 转到强制内置选项卡 点击新建... 键入模块的名称(在我的例子中是诅咒),然后单击确定

步骤 3) 在项目资源管理器中右键单击出现错误的模块。进入 PyDev->代码分析。

【讨论】:

也为我工作,感谢您使每个步骤比当前接受的答案更明确。【参考方案6】:

我遇到了同样的问题。我在 Windows 上使用 Python 和 Eclipse。代码运行得很好,但是eclipse到处都显示错误。在我将文件夹 'Lib' 的名称更改为 'lib' (C:\Python27\lib) 后,问题就解决了。好像如果字母的大小写和配置文件中的不匹配的话,有时候会出问题(不过好像也不是一直这样,因为错误检查好久没问题突然出现了原因)。

【讨论】:

这是 Eclipse 最喜欢的消遣。使错误标志突然出现无缘无故。它让人们疯狂地认为他们打破了世界,除了它是 Eclipse 突然决定随机实现的一些无意义的错误标志以获取乐趣和利润(?) 我试过这个,认为它有效,但它只是一个ruse,但它花了> 5分钟,所以我无法撤消。但是@Fabio Zadrozny ctrl-1 @UndefinedVariable 工作得很好,即使在 5 分钟后它也能继续工作!【参考方案7】:

我正在做的近似:

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

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

【讨论】:

【参考方案8】:

您可能只需要在 Eclipse 中重新配置您的 python 路径。看到我的answer 来回答类似的问题。

【讨论】:

【参考方案9】:

在preferences --> PyDev --> PyLint 下arguments to pass to PyLint 添加这一行:

--generated-members=objects

您需要为每个生成的 .我通过谷歌搜索找到了这个,但我丢失了参考。

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

我的回答没有什么新意,只是我遇到的一个具体例子。

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”添加到列表中。

现在错误消息不再显示了。

【讨论】:

【参考方案12】:

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

    确认(或者添加)模块的父文件夹到 PYTHONPATH。 将模块的全名添加到强制内置函数中。

注意事项:

一些流行的模块安装了一些具有相同名称的父子对。在这些情况下,除了您已经为其他所有内容确认/添加的祖父文件夹之外,您还必须将该父文件夹添加到 PYTHONPATH。

在添加到强制内置时使用(例如)“google.appengine.api.memcache”,而不仅仅是“memcache”,在此示例中,“google”是 PYTHONPATH 中定义的文件夹的直接子级.

【讨论】:

我怎样才能将 lib.site-packages._pytest 添加到强制内置...它不接受'-'符号...我遇到配置导入问题模块并尝试进行补救,请帮助【参考方案13】:

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

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

【讨论】:

以上是关于如何修复 PyDev“导入未定义变量”错误?的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥 Pydev 会给出内置关键字的语法错误?

Pydev 显示用于 Jython 代码分析的“未定义变量”

如何修复“未处理的运行时错误类型错误:事件未定义”

如何修复 Typescript 错误“对象可能是‘未定义’”

如何修复此错误:未捕获(承诺)类型错误:无法读取未定义的属性(读取“长度”)