PyLint“가져올 수 없습니다”오류-PYTHONPATH를 설정하는 방법?


165

Windows의 Wing IDE 내부에서 PyLint를 실행하고 있습니다. 프로젝트에 하위 디렉토리 (패키지)가 있고 패키지 내부에 최상위 레벨에서 모듈을 가져옵니다.

__init__.py
myapp.py
one.py
subdir\
    __init__.py
    two.py

내부 two.py에는 import one최상위 디렉토리 ( myapp.py실행 디렉토리 )가 Python 경로에 있기 때문에 런타임에 올바르게 작동합니다 . 그러나 two.py에서 PyLint를 실행하면 오류가 발생합니다.

F0401: Unable to import 'one'

이 문제를 어떻게 해결합니까?

답변:


145

내가 알고있는 두 가지 옵션이 있습니다.

하나, PYTHONPATH모듈 위에 디렉토리를 포함 하도록 환경 변수를 변경하십시오 .

또는 ~/.pylintrc다음과 같이 모듈 위에 디렉토리를 포함하도록 편집 하십시오.

[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'

(또는 다른 버전의 pylint에서 init-hook은 [General]을 [MASTER]로 변경해야합니다)

이 두 옵션 모두 작동해야합니다.

희망이 도움이됩니다.


8
이 pylint hook은 현재 VScode에서 가장 좋은 방법입니다. PYTHONPATH는 내장 사용에 대해 아직 지원되지 않기 때문입니다.
Danny Staple

2
syntastic과 함께 MacVim을 사용하는 것과 동일한 문제가 있습니다. 가져 오기 오류를 수정하도록 prosector를 구성하려면 어떻게해야합니까?
Laurent

몇 가지 자세한 내용이 포함 된 관련 블로그 게시물 .
Christian Long

~/.pylintrcOSX에서 저를 위해 일했는데 다른 것은 작동하지 않았습니다
Miquel

확실하지이 허용 대답없는 이유 - 또한, 가치가 이것에 비틀 거리고있는 사람들을 위해 언급 당신이 필요 export PYTHONPATH그 때문에 pylint(적어도, bash는 / zsh을에서) 볼 것
마르코 Massenzio

43

경로를 변경하는 솔루션 init-hook은 좋지만 절대 경로를 추가해야한다는 사실을 싫어합니다. 결과적 으로이 pylintrc 파일을 프로젝트 개발자와 공유 할 수 없습니다. pylintrc 파일의 상대 경로를 사용하는이 솔루션은 나에게 더 효과적입니다.

[MASTER]
init-hook="from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"

참고 pylint.config.PYLINTRC또한 존재하고 같은 값을 가진다 find_pylintrc().


1
이것이 실제로 E0611 및 E0401 pylint 오류에 대한 솔루션을 제공했는지 확인합니다. VSCode 사용자의 경우 : 열린 폴더가 "python root folder"이고 .pylintrc가 해당 폴더에 있어야합니다.
np8

또한 모듈 디렉토리 이름이 .(점)으로 시작하지 않아야합니다 .
Saw-mon와 Natalie

2
특정 하위 폴더 (예 appfrom pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.join(os.path.dirname(find_pylintrc()), 'app'))
:)

27

1) sys.path는 목록입니다.

2) 문제는 때때로 sys.path가 virtualenv.path가 아니며 virtualenv 에서 pylint를 사용하려는 경우입니다

3) 따라서, init-hook을 사용하십시오 ( '및 "pylint 구문 분석은 엄격합니다)

[Master]
init-hook='sys.path = ["/path/myapps/bin/", "/path/to/myapps/lib/python3.3/site-packages/", ... many paths here])'

또는

[Master]
init-hook='sys.path = list(); sys.path.append("/path/to/foo")'

.. 및

pylint --rcfile /path/to/pylintrc /path/to/module.py

8
pylint이 조언에 따라 내 virtualenv 에 설치 하여이 문제를 해결 한 것 같습니다 : plaidzooks.tumblr.com/post/36813101879
Matt

3
이것은 훌륭하게 작동하며 최고의 대답이어야합니다. .pylintrc가 설정되어 있지 않으면 pylint --generate-rcfile > .pylintrc홈 폴더에서 빠른 작업을 수행하십시오 .
reka18

26

venv에서 pylint 경로를 구성하면 문제를 해결할 수 있습니다. $ cat .vscode / settings.json

{
    "python.pythonPath": "venv/bin/python",
    "python.linting.pylintPath": "venv/bin/pylint"
}

2
Windows의 { "python.pythonPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe" "python.linting.pylintPath": "${workspaceFolder}\\.venv\\Scripts\\pylint.exe" } 경우 완벽 함을위한 것입니다.
Roy2511

질문은이 편집기를 요구하지 않습니다.
Ivailo Bardarov

VSCode는 이제이 메시지를 보여줍니다 : 줄을 The setting "python.pythonPath" defined in your settings.json is now deprecated. 삭제하면 python.pythonPath여전히 작동하는 것 같습니다.
제시 Aldridge

23

__init__.py파이썬에게 dirs가 모듈이라는 것을 알리기 위해 두 디렉토리에 빈 파일이 있습니까?

폴더 내에서 실행하지 않을 때의 기본 개요는 (예를 들어 사용하지 않았지만 pylint 's에서) :

topdir\
  __init__.py
  functions_etc.py
  subdir\
    __init__.py
    other_functions.py

이 그렇다면 pylint가 자신의 절대 경로에서 실행되고있는 현재 디렉토리를 참조하지 않고 모듈의 인식 통역 파이썬, 그것은 액세스 할 수 있습니다 방법입니다 functions_etc.py같은 topdir.functions_etc또는 topdir.subdir.other_functions제공, topdir온입니다 PYTHONPATH.

업데이트 : 문제가 __init__.py파일 이 아닌 경우 모듈을 복사하거나 이동하십시오. c:\Python26\Lib\site-packages추가 패키지를 넣는 일반적인 장소이며 pythonpath에 있습니다. Windows 심볼릭 링크 또는 이와 동등한 기능을 수행하는 방법을 알고 있다면 대신 할 수 있습니다. http://docs.python.org/install/index.html 에는 개발 코드의 사용자 수준 디렉토리에 sys.path를 추가하는 옵션을 포함하여 더 많은 옵션이 있지만 실제로는 일반적으로 심볼릭 링크입니다. 내 로컬 개발 디렉토리를 사이트 패키지에 복사하는 것이 동일한 효과입니다.


1
예, __init__.py두 디렉토리 모두에 있습니다. 문제는 PyLint가 실행될 때 최상위 디렉토리가 PYTHONPATH에 있지 않다고 생각하며 어떻게 수정 해야할지 모르겠습니다.
EMP

symlink는 좋은 생각이지만 Windows Vista 이상에서만 지원되며 XP를 실행하고 있습니다. 하드 링크를 시도 할 수 있다고 생각합니다 ...
EMP

다시 연결 : 아니요,하지 않는 것이 좋습니다. 나는 그것을 가지고 놀았으며, 확실히 (어떻게 든) 작동하지만 예상대로 작동하지 않을 것입니다.
shylent

심볼릭 링크는 좋은 생각이 아닙니다. 이것은 컴퓨터의 문제 만 해결합니다. 다른 사람이 프로젝트를 체크 아웃하면 해당 프로젝트가 손상됩니다.
Jonathan Hartley

12

이 페이지에서 찾은이 질문에 대한 일반적인 답변 OPEN NOT NOT OPEN, SITE IS BUGED

작성 .pylintrc및 추가

[MASTER]
init-hook="from pylint.config import find_pylintrc;
import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"

5

WingIDE와 어떻게 작동하는지 모르겠지만 Geany와 함께 PyLint를 사용하려면 외부 명령을 다음과 같이 설정하십시오.

PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f"

여기서 % f는 파일 이름이고 % d는 경로입니다. 누군가에게 유용 할 수 있습니다 :)


4

PYTHONPATHApp Engine 경로를 추가 하려면 시스템 변수 를 업데이트해야했습니다 . 필자의 경우 ~/.bashrc파일 을 편집 하고 다음 줄을 추가해야했습니다.

export PYTHONPATH=$PYTHONPATH:/path/to/google_appengine_folder

사실, init-hook첫 번째 설정을 시도 했지만 이것이 코드베이스에서 일관되게 문제를 해결하지 못했습니다 (왜 그런지 확실하지 않음). 시스템 경로에 추가하면 (일반적으로 좋은 아이디어 일 것입니다) 내 문제가 사라졌습니다.


3

방금 발견 한 한 가지 해결 방법은 실제로 단일 파일이 아닌 전체 패키지에 대해 PyLint를 실행하는 것입니다. 어떻게 든 가져온 모듈을 찾을 수 있습니다.


좋은 소리; 어떻게?
Cees Timmerman

1
@CeesTimmerman pylint ... dir부모 폴더에서 실행 합니다. 파일 __init__.py과 함께 각 하위 폴더에 있어야 .py합니다.
yugr

3

시험

if __name__ == '__main__':
    from [whatever the name of your package is] import one
else:
    import one

Python 3에서 else절의 부분에 대한 구문은 다음과 같습니다.

from .. import one

다시 생각하면, 이것은 특정 문제를 해결하지 못할 것입니다. 나는 질문을 오해하고 two.py가 기본 모듈로 실행되고 있다고 생각했지만 사실은 아닙니다. 파이썬 2.6 ( absolute_import에서 가져 오지 않고 __future__)과 파이썬 3.x가 가져 오기를 처리 하는 방식의 차이점을 고려할 때 어쨌든 파이썬 2.6에서는이 작업을 수행 할 필요가 없습니다.

그래도 결국 Python 3으로 전환하고 패키지 모듈과 패키지 내부의 독립형 스크립트로 모듈을 사용하려는 경우 다음과 같은 것을 유지하는 것이 좋습니다.

if __name__ == '__main__':
    from [whatever the name of your package is] import one   # assuming the package is in the current working directory or a subdirectory of PYTHONPATH
else:
    from .. import one

마음에.

편집 : 이제 실제 문제에 대한 가능한 해결책을 찾으십시오. one명령 줄을 통해 모듈을 포함하는 디렉토리에서 PyLint를 실행하거나 PyLint를 실행할 때 다음 코드를 입력하십시오.

import os

olddir = os.getcwd()
os.chdir([path_of_directory_containing_module_one])
import one
os.chdir(olddir)

기본적으로 PYTHONPATH를 사용하는 대신, 현재 작업중인 디렉토리가 one.py가져 오기를 수행 할 때 포함 된 디렉토리인지 확인하십시오 .

(Brian의 대답을 보면 이전 코드를에 할당 할 수는 init_hook있지만 그렇게 할 경우 단순히 sys.path내 코드보다 더 우아하게 추가 할 수 있습니다.)


2

핵심은 sys.pathenv 변수를 고려하지 않고 프로젝트 디렉토리를 추가하는 것 입니다.

VSCode를 사용하는 사람에게는 프로젝트의 기본 디렉토리가있는 경우 한 줄 솔루션이 있습니다.

[MASTER]
init-hook='base_dir="my_spider"; import sys,os,re; _re=re.search(r".+\/" + base_dir, os.getcwd()); project_dir = _re.group() if _re else os.path.join(os.getcwd(), base_dir); sys.path.append(project_dir)'

조금 설명하겠습니다 :

  • re.search(r".+\/" + base_dir, os.getcwd()).group(): 편집 파일에 따라 기본 디렉토리를 찾습니다

  • os.path.join(os.getcwd(), base_dir): 추가 cwdsys.path충족 명령 줄 환경에


참고로 .pylintrc는 다음과 같습니다.

https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f


2

나는 같은 문제가 있었고 virtualenv에 pylint를 설치하고 파일에 다음과 같이 .pylintrc 파일을 프로젝트 디렉토리에 추가하여 수정했습니다.

[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'

이것이 E0611 pylint 오류를 제거한다는 것을 확인해야하지만 E0401 오류는 남아 있습니다.
np8

1

어쩌면 PYTHONPATH 내부에 dir을 수동으로 추가하여?

sys.path.append(dirname)

흠,하지만 그 코드를 어디에 두겠습니까? 각 파일의 상단에? 나는 그것이 작동한다고 가정하지만 PyLint를 작동시키는 것은 꽤 해킹입니다.
EMP

@Evgeny : Brian M. Hunt가 최근 게시 한 답변을 참조하십시오.
JAB

그리고 모든 파일의 맨 위에 이것을 추가하는 것은 어떤 이유로 든 작동하지 않습니다 .PyLint는 스캔하는 모듈 내에서 작성된 sys.path의 수정을 무시할 수있는 완벽한 내용 인 것 같습니다. 나는 왜 그런지 연구하려고 귀찮게하지 않았다.
javawizard

1

나는 같은 문제가 있었고 대답을 찾을 수 없으므로 비슷한 문제를 가진 사람을 도울 수 있기를 바랍니다.

나는 epylint와 함께 flymake를 사용합니다. 기본적으로 dired 디렉토리가 python 패키지 디렉토리인지 확인하는 dired-mode-hook을 추가했습니다. 그렇다면 PYTHONPATH에 추가하십시오. 제 경우에는 "setup.py"라는 파일이 들어있는 디렉토리를 파이썬 패키지로 간주합니다.

;;;;;;;;;;;;;;;;;
;; PYTHON PATH ;;
;;;;;;;;;;;;;;;;;

(defun python-expand-path ()
  "Append a directory to the PYTHONPATH."
  (interactive
   (let ((string (read-directory-name 
          "Python package directory: " 
          nil 
          'my-history)))
     (setenv "PYTHONPATH" (concat (expand-file-name string)
                  (getenv ":PYTHONPATH"))))))

(defun pythonpath-dired-mode-hook ()
  (let ((setup_py (concat default-directory "setup.py"))
    (directory (expand-file-name default-directory)))
    ;;   (if (file-exists-p setup_py)
    (if (is-python-package-directory directory)
    (let ((pythonpath (concat (getenv "PYTHONPATH") ":" 
                  (expand-file-name directory))))
      (setenv "PYTHONPATH" pythonpath)
      (message (concat "PYTHONPATH=" (getenv "PYTHONPATH")))))))

(defun is-python-package-directory (directory)
  (let ((setup_py (concat directory "setup.py")))
    (file-exists-p setup_py)))

(add-hook 'dired-mode-hook 'pythonpath-dired-mode-hook)

도움이 되었기를 바랍니다.


1

누구든지 PyCharm에서 pylint를 외부 도구로 실행하고 가상 환경에서 작동하게하는 방법을 찾고있는 경우 (이 질문에 온 이유), 다음은 해결 방법입니다.

  1. PyCharm> 환경 설정> 도구> 외부 도구에서 pylint에 대한 항목 추가 또는 편집
  2. 도구 편집 대화 상자의 도구 설정에서 python 인터프리터 디렉토리의 pylint를 사용하도록 프로그램을 설정하십시오. $PyInterpreterDirectory$/pylint
  3. 다음과 같이 매개 변수 필드에서 다른 매개 변수를 설정하십시오. --rcfile=$ProjectFileDir$/pylintrc -r n $FileDir$
  4. 작업 디렉토리를 $FileDir$

이제 pylint를 외부 도구로 사용하면 공통 구성 파일을 사용하여 선택한 디렉토리에서 pylint를 실행하고 프로젝트에 대해 구성된 인터프리터 (가상으로 virtualenv 인터프리터)를 사용합니다.


1

이것은 오래된 질문이지만 받아 들일만한 대답이 없으므로 제안합니다 : import 문을 two.py에서 다음과 같이 변경하십시오.

from .. import one

현재 환경 (Python 3.6, pylint 2.3.1을 사용하는 VSCode)에서 플래그가 지정된 문장을 지 웁니다.


1

좋은 대답을 찾았습니다 . pylintrc를 편집하고 master에 다음을 추가하십시오.

init-hook="import imp, os; from pylint.config import find_pylintrc; imp.load_source('import_hook', os.path.join(os.path.dirname(find_pylintrc()), 'import_hook.py'))"



0

Linux에서 Cython을 사용하는 경우 module.cpython-XXm-X-linux-gnu.so프로젝트 대상 디렉토리에서 파일 제거를 해결했습니다 .


0

이 코드를 .vscode / settings.json 파일에 추가하십시오.

, "python.linting.pylintPath": "venv / bin / pylint"

이것은 pylint의 위치를 ​​알려줍니다 (python의 오류 검사기)


-1

안녕하세요, 다른 디렉토리에서 패키지를 가져올 수있었습니다. 방금 다음을 수행했습니다. 참고 : VScode를 사용하고 있습니다.

파이썬 패키지를 만드는 단계 파이썬 패키지로 작업하는 것은 정말 간단합니다. 당신이해야 할 일은 :

디렉토리를 작성하고 패키지 이름을 지정하십시오. 수업을 넣으십시오. 디렉토리에 init .py 파일을 작성하십시오.

예를 들어, 모든 사용자 정의 클래스를 유지하고있는 Framework라는 폴더가 있으며, 작업은 Framework라는 폴더 안에 init .py 파일을 작성하는 것 입니다.

그리고 가져 오는 동안 다음과 같은 방식으로 가져와야합니다.

Framework 수입 기지에서

따라서 E0401 오류가 사라집니다. Framework는 방금 init .py를 생성 한 폴더 이고 base는 가져 와서 Hope on help에서 작동하는 데 필요한 사용자 정의 모듈입니다 !!!!

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