如何让PyLint识别numpy成员?


163

我在Python项目上运行PyLint。PyLint抱怨无法找到numpy成员。在避免跳过成员资格检查的同时如何避免这种情况。

从代码:

import numpy as np

print np.zeros([1, 4])

运行时,我得到了预期的结果:

[[0. 0. 0. 0.]]

但是,pylint给了我这个错误:

E:3,6:模块'numpy'没有'zeros'成员(no-member)

对于版本,我使用的是pylint 1.0.0(星号1.0.1,常见的0.60.0),并尝试使用numpy 1.8.0。

Answers:


75

如果将Visual Studio Code与Don Jayamanne的出色Python扩展一起使用,请将用户设置添加到numpy白名单:

{
    // whitelist numpy to remove lint errors
    "python.linting.pylintArgs": [
        "--extension-pkg-whitelist=numpy"
    ]
}

2
这有帮助!VSCode 1.12.2上的版本已确认可以在Windows 10 x64上运行。
Simara

8
我需要更多:“ python.linting.pylintArgs”:[“ --ignored-modules = numpy”,“ --ignored-classes = numpy”,“ --extension-pkg-whitelist = numpy”]
彼得·

2
@Peter的解决方案可在Windows 7 x64和Visual Studio Code 1.15.1中使用!
BSP

3
@BSP Peter的帖子不能解决问题,它会忽略它。如果我不能对此评论投反对票,我会..
Jonathan H

4
对于pylint 2.3.0,这对我不再起作用。
Guillochon

58

我这里有同样的问题,即使所有相关的软件包的最新版本(astroid 1.3.2logilab_common 0.63.2pylon 1.4.0)。

以下解决方案非常有用:在该部分中,numpy我通过修改pylintrc文件将其添加到了被忽略的模块列表中[TYPECHECK]

[TYPECHECK]

ignored-modules = numpy

根据错误,您可能还需要添加以下行(仍在中[TYPECHECK] section):

ignored-classes = numpy

2
在带有pylint 1.4.4,astroid 1.3.8和Python 3.4.3的linux上,这行得通,但是我不得不将该extension-pkg-whitelist=numpy行放在[MASTER].pylintrc文件的标题下。pylint似乎是相当脆弱的软件,需要专家的配合才能使其能够执行基本任务。
Eric Leschinski

12
这不是一个好的解决方案。它所做的就是完全禁用pylint检查是否存在任何成员。理想情况下,您希望它正确识别它们,这是其他解决方案的作用。
iFreilicht

1
@iFreilicht这是一种安全措施。在运行时,模块定义可以动态更改。但是在pylint中启用此功能将涉及运行任意代码。不过,我仍然希望在有关的答案中有某种说明--extension-pkg-whitelist,该说明实际上会执行指定模块的导入。
Zev Spitz

43

对于正在处理的一个小numpy项目,我遇到了相同的错误,因此决定忽略numpy模块就可以了。我创建了一个.pylintrc文件:

$ pylint --generate-rcfile > ~/.pylintrc

根据paduwan和j_houg的建议,我修改了以下部分:

[MASTER]

# A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code
extension-pkg-whitelist=numpy

[TYPECHECK]

# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
ignored-modules=numpy

# List of classes names for which member attributes should not be checked
# (useful for classes with attributes dynamically set). This supports can work
# with qualified names.
ignored-classes=numpy

它“解决”了我的问题。


6
您确定也必须将其添加到两个ignored-*入口吗?对我来说,只需将模块添加到扩展白名单即可。
iFreilicht

39

在最新版本的pylint中,您可以添加--extension-pkg-whitelist=numpy到pylint命令中。他们以不安全的方式解决了早期版本中的此问题。现在,如果希望他们更加仔细地查看标准库之外的软件包,则必须将其明确列入白名单。看这里。


2
“查看此处”链接已失效。尽管该解决方案仍在起作用,但很难理解为什么。最好添加链接问题的摘录。
GergelyPolonkai

“看到这里”链接已修复(现在在github中引用相同的问题)
David Clarke

似乎它适用于模块和包,但不适用于类名。
伊恩·梅森

17

由于这是google中的最高结果,它给我的印象是您必须忽略所有文件中的警告:

这个问题实际上已经在上个月的pylint / astroid来源https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e的来源中得到解决, 但尚未在Ubuntu软件包中。

要获取来源,只需

hg clone https://bitbucket.org/logilab/pylint/
hg clone https://bitbucket.org/logilab/astroid
mkdir logilab && touch logilab/__init__.py
hg clone http://hg.logilab.org/logilab/common logilab/common
cd pylint && python setup.py install

因此,最后一步很可能需要一个sudo,当然您也需要一些技巧来克隆。


我会说您不需要克隆新的logilab / common,但是您确实需要安装新的logilab / astroid。通过重新安装logilab / astroid和logilab / pylint,它为我解决了该错误。
paugier 2014年

7
你们正在使用哪个版本?我使用的是astroid 1.3.2和pylint 1.4.0,我仍然遇到了此代码from numpy import ceil结果的问题, E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) 因为我检查了上面引用的提交,并且这些更改似乎都在我拥有的astroid版本中。
Zach Dwiel 2014年

2
完全按照Xubuntu 14.04上的建议进行操作,这导致无法使用的pylint:check_astroid_module astroid.close()中的行py2.7.egg / pylint / lint.py“,行866错误:'Module'对象没有属性'关闭”
bli

3
也许这是一种回归-似乎确实有一个旨在解决该问题的版本。无论哪种方式,我都在bitbucket.org/logilab/pylint/issue/453/…上
dstromberg 2015年

4
显然,在pylint 1.4.2,astroid 1.3.4中仍未解决此问题:Module 'numpy' has no 'zeros' member (no-member)
比尔

12

为了忽略numpy.core属性产生的所有错误,我们现在可以使用:

$ pylint a.py --generated-members=numpy.*

作为另一个解决方案,将此选项添加到〜/ .pylintrc/ etc / pylintrc文件中:

[TYPECHECK]

# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=numpy.*

到目前为止,对于有问题的代码来说,这似乎是多余的,但对于另一个模块(即,)仍然很重要。netifaces


使用时我遇到了同样的问题patsy.dmatrices。添加generated-members=patsy.dmatrices解决了我的问题。
乔纳斯·达尔贝克(JonasDahlbæk),

12

如果您不想添加更多配置,请将此代码添加到您的配置文件中,而不是“ whitelist”。

{
"python.linting.pylintArgs": ["--generate-members"],
}

9
您应该提到,这非常适用于VS Code。
bers

它将输出pylint: error: no such option: --generate-members
Spaceship222

8

在过去的几年中,有许多关于此的错误报告,即https://bitbucket.org/logilab/pylint/issue/58/false-positive-no-member-on-numpy-imports

我建议禁用投诉发生的线路。

# pylint: disable=E1103
print np.zeros([1, 4])
# pylint: enable=E1103

10
我使用了numpy太多了,所以我最好只禁用整个文件中的无成员检查,但是,我想避免这样做。
Alphadelta14 2013年

2
-1只是因为@bijancn的答案现在应该取代了这个答案。
LondonRob 2014年

@LondonRob没有。1.4.2中仍然存在问题。paduwan的解决方案更好,因为它不需要在代码中添加骇客的东西。
naught101

7

可能是,它与numpy的方法导入的抽象方法混淆了。也就是说,zeros实际上numpy.core.multiarray.zeros是通过numpy语句导入的

from .core import *

依次导入

from .numeric import *

并且以数字形式您会发现

zeros = multiarray.zeros

我想我会代替PyLint感到困惑!

有关PyLint侧面的信息,请参见此错误


我希望我可以只导入这样的单个方法,但是我使用了太多的函数,这会使导入变得一团糟。
Alphadelta14 2013年

@ Alphadelta14即使找到所有的人,也将是一个巨大的混乱。请参阅答案末尾的链接中的建议。
alko 2013年

2
该SO链接使PyLint忽略了导入某些模块。我不太确定它是否会抑制那些文件的无成员错误。我也尽可能避免修补我的PyLint。
Alphadelta13年

@ Alphadelta14我猜您应该等待PyLint的补丁。
alko 2013年

4

我必须将其添加到我经常使用numpy的任何文件的顶部。

# To ignore numpy errors:
#     pylint: disable=E1101

以防万一有人在日食中遇到Pydev和pylint的麻烦...


4

在j_hougs答案的扩展中,您现在可以在.pylintrc的此行中添加有问题的模块,该行在生成时已经准备好为空:

extension-pkg-whitelist=numpy

您可以通过执行以下操作来生成示例.pylintrc:

pylint --generate-rcfile > .pylintrc

然后编辑提到的行



3

这是我针对此问题提出的伪解决方案。

#pylint: disable=no-name-in-module
from numpy import array as np_array, transpose as np_transpose, \
      linspace as np_linspace, zeros as np_zeros
from numpy.random import uniform as random_uniform
#pylint: enable=no-name-in-module

然后,在你的代码,而不是调用numpy功能np.arraynp.zeros等等,你会写np_arraynp_zeros等等。这种做法与在其他的答案提出其他方法的优点:

  • pylint禁用/启用仅限于代码的一小部分
  • 这意味着您不必用pylint指令将每一个调用numpy函数的行都包围起来。
  • 您没有为整个文件执行pylint禁用错误操作,这可能会掩盖代码的其他问题。

明显的缺点是,您必须显式导入您使用的每个numpy函数。该方法可以进一步阐述。您可以定义自己的模块,numpy_importer如下所示

""" module: numpy_importer.py
       explicitely import numpy functions while avoiding pylint errors  
"""
#pylint: disable=unused-import
#pylint: disable=no-name-in-module
from numpy import array, transpose, zeros  #add all things you need  
from numpy.random import uniform as random_uniform
#pylint: enable=no-name-in-module

然后,您的应用程序代码只能将该模块(而不是numpy)导入为

import numpy_importer as np 

并像往常一样使用名称:np.zerosnp.array等等。

这样做的好处是您将拥有一个模块,其中所有numpy相关的导入都将一劳永逸地完成,然后您可以在任意位置使用该行导入它。仍然要注意numpy_importer不要导入不存在的名称,numpy因为这些错误不会被pylint捕获。


2

我遇到了numpy,scipy,sklearn,nipy等问题,并通过包裹epylint来解决了这个问题,如下所示:

$猫epylint.py

#!/usr/bin/python

"""
Synopsis: epylint wrapper that filters a bunch of false-positive warnings and errors
Author: DOHMATOB Elvis Dopgima <gmdopp@gmail.com> <elvis.dohmatob@inria.fr>

"""

import os
import sys
import re
from subprocess import Popen, STDOUT, PIPE

NUMPY_HAS_NO_MEMBER = re.compile("Module 'numpy(?:\..+)?' has no '.+' member")
SCIPY_HAS_NO_MEMBER = re.compile("Module 'scipy(?:\..+)?' has no '.+' member")
SCIPY_HAS_NO_MEMBER2 = re.compile("No name '.+' in module 'scipy(?:\..+)?'")
NIPY_HAS_NO_MEMBER = re.compile("Module 'nipy(?:\..+)?' has no '.+' member")
SK_ATTR_DEFINED_OUTSIDE_INIT = re.compile("Attribute '.+_' defined outside __init__")
REL_IMPORT_SHOULD_BE = re.compile("Relative import '.+', should be '.+")
REDEFINING_NAME_FROM_OUTER_SCOPE = re.compile("Redefining name '.+' from outer scope")

if __name__ == "__main__":
    basename = os.path.basename(sys.argv[1])
    for line in Popen(['epylint', sys.argv[1], '--disable=C,R,I'  # filter thesew arnings
                       ], stdout=PIPE, stderr=STDOUT, universal_newlines=True).stdout:
        if line.startswith("***********"):
            continue
        elif line.startswith("No config file found,"):
            continue
        elif "anomalous-backslash-in-string," in line:
            continue
        if NUMPY_HAS_NO_MEMBER.search(line):
            continue
        if SCIPY_HAS_NO_MEMBER.search(line):
            continue
        if SCIPY_HAS_NO_MEMBER2.search(line):
            continue
        if "Used * or ** magic" in line:
            continue
        if "No module named" in line and "_flymake" in line:
            continue
        if SK_ATTR_DEFINED_OUTSIDE_INIT.search(line):
            continue
        if "Access to a protected member" in line:
            continue
        if REL_IMPORT_SHOULD_BE.search(line):
            continue
        if REDEFINING_NAME_FROM_OUTER_SCOPE.search(line):
            continue
        if NIPY_HAS_NO_MEMBER.search(line):
            continue
        # XXX extend by adding more handles for false-positives here
        else:
            print line,

该脚本仅运行epylint,然后刮擦其输出以过滤掉错误肯定的警告和错误。您可以通过添加更多elif案例来扩展它。

注意:如果这适用于您,则您需要修改pychechers.sh,使其像这样

#!/bin/bash

epylint.py "$1" 2>/dev/null
pyflakes "$1"
pep8 --ignore=E221,E701,E202 --repeat "$1"
true

(当然,您必须首先使epylint.py可执行)

这是我的.emacs https://github.com/dohmatob/mydotemacs的链接。希望这对某人有用。



2

这个解决方案对我有用

基本上,请从左下角选择齿轮图标=> Setting => Workspace Setting => Extension => Python Configuration =>单击任何Settings.json =>将此添加到文件“ python.linting.pylintArgs”中:[ --extension-pkg-whitelist = numpy“]我正在使用VS 1.27.2


2

我在另一个不同的模块(kivy.properties)上遇到了同样的问题,它是一个包装好的C模块,例如numpy

使用VSCode V1.38.0,公认的解决方案停止了该项目的所有棉绒。因此,尽管它确实消除了误报no-name-in-module,但并没有真正改善这种情况。

对我来说,最好的解决方法是--ignored-modules在有问题的模块上使用参数。麻烦的是,通过传递任何参数python.linting.pylintArgs抹了默认VSCode设置,所以你需要重新设置者也。那给我留下了以下settings.json文件:

{
    "python.pythonPath": "C:\\Python\\Python37\\python.exe",
    "python.linting.pylintEnabled": true,
    "python.linting.enabled": true,
    "python.linting.pylintArgs": [
        "--ignored-modules=kivy.properties",
        "--disable=all",
        "--enable=F,E,unreachable,duplicate-key,unnecessary-semicolon,global-variable-not-assigned,unused-variable,binary-op-exception,bad-format-string,anomalous-backslash-in-string,bad-open-mode"
    ]
}

“ python.linting.pylintArgs”:[“ --generate-members = kivy.properties”]
yee

1

从前面的答案中复制了一些文字,以总结出有效的方法(至少对我来说:debian-jessie)

  1. 在某些旧版本中,pylint存在一个问题,使其无法与numpy(及其他类似软件包)一起使用。

  2. 现在已经解决了该问题,但是出于安全原因,默认情况下禁用了外部C包(C代码的python接口-例如numpy-)。

  3. 您可以创建白名单,以允许pylint在文件中使用它们~/.pylintrc

要运行的基本命令:#仅在您家中没有.pylintrc文件的情况下$ pylint --generate-rcfile> .pylintrc

然后打开文件并添加所需的软件包(extension-pkg-whitelist=用逗号分隔)。使用--extension-pkg-whitelist=numpy命令行中的选项,您可以具有相同的行为。

如果您忽略了本[TYPECHECK]节中的某些软件包,则这pylint将永远不会显示与该软件包相关的错误。实际上,pylint不会告诉您有关那些软件包的任何信息。


0

我一直在为pylint制作补丁,以解决numpy等库中动态成员的问题。它添加了一个“动态模块”选项,该选项通过实际导入模块来强制检查运行时是否存在成员。请参阅logilab / pylint中的第413期。还有一个拉取请求,请参阅注释之一中的链接。


pydev就是这样解决它的(加载检查模块的特殊列表)。那工作怎么样
2015年

0

快速答案:将Pylint更新为1.7.1(如果使用conda管理软件包,请使用conda-forge提供的Pylint 1.7.1)

我在此处的pylint GitHub中发现了类似的问题,有人回复说更新到1.7.1后一切正常。


0

我不确定这是否是解决方案,但是在VSCode中,我在用户设置中明确编写了启用pylint的代码后,所有模块都被识别。

{
    "python.linting.pep8Enabled": true,
    "python.linting.pylintEnabled": true
}

0

最近(由于spyder或pylint或?有所更改),我从astropy.constants符号的spyder静态代码分析中得到了E1101错误(“无成员”)。不知道为什么。

对于Linux或Unix系统(Mac可能与此类似)上的所有用户,我的简化解决方案是创建一个/ etc / pylintrc,如下所示:

[TYPECHECK]
ignored-modules=astropy.constants

当然,可以将其放在个人$ HOME / .pylintrc文件中。而且,我本可以更新现有文件。

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.