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.array및 np.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.