PyLint가 numpy 멤버를 인식하도록하려면 어떻게해야합니까?


163

Python 프로젝트에서 PyLint를 실행 중입니다. PyLint는 numpy 회원을 찾을 수없는 것에 대해 많은 불만을 제기합니다. 회원 확인을 건너 뛰지 않으면 서이를 피하려면 어떻게해야합니까?

코드에서 :

import numpy as np

print np.zeros([1, 4])

어느 것이 달렸을 때 나는 기대를 얻습니다.

[[0. 0. 0.]]]

그러나 pylint는 다음과 같은 오류를 발생시킵니다.

E : 3, 6 : 'numpy'모듈에 'zeros'멤버가 없습니다 (멤버 없음)

버전의 경우 pylint 1.0.0 (astroid 1.0.1, common 0.60.0)을 사용하고 numpy 1.8.0을 사용하려고합니다.

답변:


75

Don Jayamanne의 뛰어난 Python 확장 과 함께 Visual Studio Code 를 사용하는 경우 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"]
Peter

2
Windows 7 x64 및 Visual Studio Code 1.15.1에서 작동하는 @Peter의 솔루션 !!
BSP

3
@ BSP Peter의 게시물은 문제를 해결하지 못하지만 무시합니다. 이 의견을 공언 할 수 있다면 ..
Jonathan H

4
pylint 2.3.0에서는 더 이상 작동하지 않습니다.
Guillochon

58

심지어 관련된 모든 패키지의 최신 버전으로, 여기에 같은 문제가 있었다 ( astroid 1.3.2, logilab_common 0.63.2, pylon 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에서는 이것이 효과가 있었지만 .pylintrc 파일 extension-pkg-whitelist=numpy[MASTER]제목 아래에 줄 을 넣어야했습니다 . 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=numpypylint 명령에 추가 할 수 있습니다 . 그들은 이전 버전에서 안전하지 않은 방식으로이 문제를 해결했습니다. 이제 표준 라이브러리 외부의 패키지를보다 신중하게 살펴 보려면 명시 적으로 화이트리스트에 추가해야합니다. 여기를 보아라.


2
"여기 참조"링크가 종료되었습니다. 솔루션은 여전히 ​​작동하지만 왜 이해하기가 어렵습니다. 연결된 문제에서 발췌를 추가하는 것이 좋습니다.
GergelyPolonkai

"여기 참조"링크가 수정되었습니다 (현재 github에서 동일한 문제 참조)
David Clarke

모듈 및 패키지에는 작동하지만 클래스 이름에는 작동하지 않는 것 같습니다.
Ian A. Mason

17

이것이 Google의 최고 결과이므로 모든 파일에서 해당 경고를 무시해야한다는 인상을 받았습니다.

문제는 지난 달 https://bitbucket.org/logilab/astroid/commits/83d78af4866be5818f193360c78185e1008fd29e 에서 pylint / astroid 소스에서 수정 되었지만 아직 우분투 패키지에는 없습니다.

소스를 얻으려면

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

7
어떤 버전을 사용하고 있습니까? 나는 별 모양 1.3.2에있어 및 1.4.0을 pylint 그리고 나는 아직도이 코드로 문제를 얻을 from numpy import ceil에 결과 E: 1, 0: No name 'ceil' in module 'numpy' (no-name-in-module) 내가 위에서 언급 커밋 확인하고는 그 변화가 내가 가진 별 모양의 버전에있는 것으로 보인다.
Zach Dwiel

2
Xubuntu 14.04에서 제안한대로 정확하게 작동하지 않았으므로 작동하지 않는 pylint : py2.7.egg / pylint / lint.py ", 866 행, check_astroid_module astroid.close ()의 866 행 close '
bli

3
아마도 이것은 회귀입니다. 문제를 해결하기위한 릴리스가있는 것 같습니다. 어느 쪽이든, 나는 그것에 대해 새로운 문제를 bitbucket.org/logilab/pylint/issue/453/
dstromberg

4
분명히 이것은 여전히 ​​pylint 1.4.2, astroid 1.3.4에서 수정되지 않았습니다 : Module 'numpy' has no 'zeros' member (no-member)
Bill

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.*

지금까지 질문 코드에서 언급했듯이 이것은 중복되는 것처럼 보이지만 여전히 다른 모듈, 즉 중요합니다. 네티 페이스


을 사용할 때 동일한 문제가 발생했습니다 patsy.dmatrices. 추가 generated-members=patsy.dmatrices하면 내 문제가 해결되었습니다.
Jonas Dahlbæk

12

더 많은 구성을 추가하지 않으려면 'whitelist'대신이 코드를 구성 파일에 추가하십시오.

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

9
이것은 VS 코드에만 적용됩니다.
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

2
-1 @bijancn의 대답이 이제 이것을 대체해야하기 때문입니다.
LondonRob

@LondonRob 그렇지 않습니다. 1.4.2에서는 여전히 문제가 있습니다. paduwan의 솔루션은 코드에 해킹 크릭을 추가 할 필요가 없다는 점에서 더 좋습니다.
naught101

7

아마도, 그것은 numpy의 애매 모호한 메소드 임포트 메소드와 혼동됩니다. 즉, zeros실제로 numpy.core.multiarray.zerosnumpy로 명령문을 가져옵니다.

from .core import *

차례로 수입

from .numeric import *

그리고 숫자로 찾을 수 있습니다

zeros = multiarray.zeros

PyLint 대신 혼란 스러울 것 같습니다!

PyLint 측면에 대해서는 이 버그 를 참조하십시오 .


그런 단일 메서드를 가져올 수 있기를 원하지만 너무 많은 함수를 사용하면 가져 오기가 엉망이됩니다.
Alphadelta14

@ Alphadelta14 그들 모두를 찾는 것은 큰 혼란입니다. 내 답변 끝에 링크에서 제안을 참조하십시오.
alko

2
이 SO 링크는 PyLint가 일부 모듈 가져 오기를 무시하도록합니다. 그 파일에 대한 멤버 없음 오류가 발생하지 않도록 확실하지 않습니다. 또한 가능한 경우 PyLint 패치를 피하고 싶습니다.
Alphadelta14

@ Alphadelta14 PyLint에 대한 패치를 기다려야한다고 생각합니다.
alko

4

numpy를 많이 사용하는 모든 파일의 맨 위에 이것을 추가해야했습니다.

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

일식에 누군가 Pydev와 pylint에 문제가있는 경우를 대비하여 ...


4

j_hougs 확장에 대한 답변에서 이제 문제의 모듈을 .pylintrc 의이 줄에 추가 할 수 있습니다. 이는 이미 생성시 비어 있습니다.

extension-pkg-whitelist=numpy

다음을 수행하여 샘플 .pylintrc를 생성 할 수 있습니다.

pylint --generate-rcfile > .pylintrc

그런 다음 언급 한 줄을 편집하십시오.


4

이것은 마침내 Pylint 1.8.2에서 해결되었습니다. 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_array, np_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.zeros,np.array

이 방법의 장점은 모든 numpy관련 가져 오기가 한 번에 수행 되는 단일 모듈을 보유한 다음 원하는 곳에서 해당 단일 행으로 가져 오는 것입니다. 그래도 numpy_importer존재하지 않는 이름은 numpypylint에 의해 잡히지 않기 때문에 이름을 가져 오지 않도록주의해야 합니다 .


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 케이스를 추가하여 확장 할 수 있습니다.

NB : 이것이 당신에게 적용된다면, 다음과 같이 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

이 솔루션은 저에게 효과적이었습니다.

기본적으로 왼쪽 하단에서 톱니 바퀴 아이콘 선택 => 설정 => 작업 영역 설정 => 확장 => 파이썬 구성 => 설정을 클릭하십시오 .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. 일부 이전 버전에서는 pylintnumpy (및 기타 유사한 패키지)로 작업하지 못하게하는 문제가있었습니다.

  2. 이제이 문제는 해결되었지만 보안상의 이유로 외부 C 패키지 (C 코드와 유사한 Python 인터페이스-numpy-)는 기본적으로 비활성화되어 있습니다.

  3. pylint파일에서 화이트리스트 를 사용할 수 있도록 화이트리스트를 만들 수 있습니다 ~/.pylintrc.

실행할 기본 명령 : # 홈에 .pylintrc 파일이없는 경우에만 $ pylint --generate-rcfile> .pylintrc

그런 다음 파일을 열고 extension-pkg-whitelist=쉼표로 구분하여 원하는 패키지를 추가하십시오 . 옵션을 사용하여 동일한 동작을 가질 수 있습니다--extension-pkg-whitelist=numpy명령 행에서 을 .

[TYPECHECK]섹션 에서 일부 패키지를 무시 pylint하면 해당 패키지와 관련된 오류가 표시되지 않습니다. 실제로, pylint그 패키지들에 대해서는 아무 것도 말하지 않을 것입니다.


0

numpy와 같은 라이브러리의 동적 멤버 관련 문제를 해결하기 위해 pylint에 대한 패치를 작성했습니다. "동적 모듈"옵션을 추가하여 모듈을 실제로 가져 와서 런타임 중에 멤버가 있는지 확인합니다. logilab / pylint의 이슈 # 413을 참조하십시오 . 풀 요청도 있습니다. 의견 중 하나의 링크를 참조하십시오.


pydev가이를 해결하는 방법입니다 (로드 검사 할 특수 모듈 목록). 그 일은 어때요?
Epu

0

빠른 답변 : Pylint를 1.7.1로 업데이트하십시오 (conda를 사용하여 패키지를 관리하는 경우 conda-forge에서 제공 한 Pylint 1.7.1 사용)

나는 pylint GitHub 에서 비슷한 문제를 발견 했으며 누군가 1.7.1로 업데이트 한 후 모든 것이 OK라고 대답했습니다.


0

이것이 솔루션인지 확실하지 않지만 VSCode에서 pylint를 활성화하기 위해 사용자 설정에 명시 적으로 작성하면 모든 모듈이 인식되었습니다.

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

0

최근에 스파이더 나 pylint 또는?에서 변경된 것이기 때문에 astropy.constants 기호에 대한 스파이더의 정적 코드 분석에서 E1101 오류 ( "멤버 없음")가 발생했습니다. 왜 그런지 모르겠다.

Linux 또는 Unix 시스템의 모든 사용자를위한 간단한 솔루션은 다음과 같이 / etc / pylintrc를 만드는 것입니다.

[TYPECHECK]
ignored-modules=astropy.constants

물론 이것은 대신 개인 $ HOME / .pylintrc 파일에 넣을 수 있습니다. 그리고 기존 파일을 업데이트 할 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.