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


138

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

from settings import settings
settings.main = object()

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

from settings import settings
print settings.main 

...即使在代码运行没有问题的情况下,也会在Eclipse代码错误窗格中生成“从import:main导入未定义的变量”消息。我该如何纠正?


在这些答案中,我没有看到任何与pylint相关的信息:\我认为这是该通知的来源,我希望找到如何告诉pylint这是没有变量的,它是一个导入。
ThorSummoner

Answers:


156

对于您项目中的代码,唯一的方法是添加一个声明,声明您希望-可能受到a的保护,if False从而使其无法执行(如果您执行了静态代码分析,则只能看到您看到的内容,而不能看到运行时信息)自己打开该模块,则不会显示预期为main。

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

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

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

  3. 可以创建一个stub模块并将其添加到补全中predefinedhttp://pydev.org/manual_101_interpreter.html上也有详细信息)。


1
有时添加模块来强制内建没有帮助(见这个bug,例如sourceforge.net/tracker/...
鲍里斯戈列利克

@Fabio:预定义补全可以在这里使用吗?如果执行类似的try: import a; except: a=mockModule操作,有什么选择?
TED 2012年

8
我试过了Ctrl-1,它给了我'@UndefinedVariable',它添加了一个注释并且可以正常工作。谢谢。
RichMeister

我在使用最新的Eclipse和PyDev时遇到同样的问题。我可以在所有模块之间导航,那么为什么代码分析不能做到相同?
亚当

3
在极端之前,请确保目录位于PYTHONPATH中,然后退出/重新启动Eclipse,执行Project> Pydev> Remove错误标记,并且numpy现在应该出现在Forced内置文件中。
smci

49

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

我通过以下步骤彻底删除了这些错误:

窗口->首选项-> PyDev->编辑器->代码分析->未定义->来自导入的未定义变量->忽略

就是这样。

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


8
谢谢你 这很简单。但是,我没有将“未找到导入”设置更改为“忽略”,而是将其更改为“警告”。现在什么都没有出现。:)希望我有一个真正的导入问题时得到警告。
爱与和平-Joe Codeswell,2012年

1
必须重新启动Eclipse才能使更改生效。
spettekaka

21

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

此解决方案适用于我:

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

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


1
考虑到“标记为答案的帖子”是由PyDev的开发人员编写的,您也许应该再看一遍。他没有在帖子本身中给出明确的说明,因为他链接到您指定的说明。
coredumperror

5
@CoreDumpError我不在乎谁写了一篇文章。我尝试了帖子中描述的内容,并且可以正常工作,但这是一种解决方法,而不是解决方案。我描述的内容可能不适用于其他计算机,但是对我有用,并且是正确的解决方案。如果其他帖子链接到该解决方案而不是描述它,那么它不遵循准则,我遵循准则的方式是描述对我来说是一个好的解决方案,希望对其他人有所帮助。
stenci

2
@Isaac现在可以了,我在编辑之前发布了答案。
stenci

是的,这是更好,更清洁的解决方案!而不是掩盖或隐藏它提供了合法的解决方法。我不得不添加,re但是一旦我不再为诸如此类的事情re.M
写红字了

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

6

这对我有用:

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

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

步骤3)右键单击项目浏览器中出现错误的模块。转到PyDev->代码分析。


也为我工作,感谢您使每个步骤都比当前接受的答案更加明确。
sc28

1

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


4
这是Eclipse最喜欢的消遣方式。使错误标志突然无缘无故地出现。它使人们疯狂地以为他们打破了世界,只是Eclipse突然决定为了娱乐和获利而随机实施的一个无意义的错误标志(?)
R Thiede 2012年

我尝试了一下,以为它起作用了,但这只是一个诡计,但是它花费了超过5分钟的时间,所以我无法撤消。但是@ Fabio Zadrozny ctrl-1 @UndefinedVariable完美地工作了,即使在5分钟后它仍然可以继续工作!
Mark Mikofski

1

我正在做什么的一个近似值:

import module.submodule

class MyClass:
    constant = submodule.constant

皮林特说: E: 4,15: Undefined variable 'submodule' (undefined-variable)

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

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

注意:我还使用导入的变量重命名了名称,以反映其常量性质。


0

您可能只需要在Eclipse中重新配置python路径。见我的回答对一个类似问题。


0

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

--generated-members=objects

您将需要针对每个生成的进行此操作。我通过谷歌搜索找到了这个,但是我丢失了参考。


0

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


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

现在错误消息不再显示。


0

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

  1. 确认(否则添加)模块的父文件夹到PYTHONPATH。
  2. 将模块的全名添加到强制内置。

这里要注意的事情:

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

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


如何添加lib.site-packages._pytest强迫内建...它不接受“ - ”符号......我在与配置模块的进口问题,并尝试做你的补救措施,请大家帮忙
热情

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.