Python 오류“ImportError : No module named”


452

파이썬은 로컬 디렉토리에 설치됩니다.

내 디렉토리 트리는 다음과 같습니다

(local directory)/site-packages/toolkit/interface.py

내 코드는 다음과 같습니다.

(local directory)/site-packages/toolkit/examples/mountain.py

예제를 실행하려면을 작성 python mountain.py하고 코드에 작성하십시오.

from toolkit.interface import interface

그리고 오류가 발생합니다.

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

나는 이미 확인 sys.path했고 거기에 디렉토리가 /site-packages있습니다. 또한 __init__.py.bin툴킷 폴더에 파일 이 있는데 이는 파이썬에게 이것이 패키지임을 나타냅니다. 또한 __init__.py.binexamples 디렉토리에 있습니다.

파이썬이 왜 파일을 찾을 수 없는지 모르겠습니다 sys.path. 어떤 아이디어? 권한 문제 일 수 있습니까? 실행 권한이 필요합니까?


3
파이썬에서 해당 파일에 대한 읽기 권한이 있는지 확인하십시오. 참조 : stackoverflow.com/a/20999950/1657225
cSn

1
PyCharm에게 이것이 패키지임을 알리려면 디렉토리를 "리소스 루트"로 표시하십시오.
emmmphd

내 경우의 문제는 새로 설치된 모듈에 대한 권한이 없다는 것 755입니다. 때문이었다 umask기계에 있던 0027(가)되는 때문에 others이 없었다 read읽을 수 없습니다에 허가를 일으키는 모듈을. read권한을 추가하면 문제가 해결되었습니다. 설치 후 대상 디렉토리의 권한을 확인하는 것이 좋습니다.
anu


로컬 디렉토리 이름이 interface 충돌했을 수 있습니다.
Benyamin Jafari

답변:


267

orip의 게시물에 대한 귀하의 의견을 바탕으로, 이것이 일어난 일이라고 생각합니다.

  1. __init__.py창에서 편집 했습니다.
  2. Windows 편집기는 캐리지 리턴 (Windows의 줄 끝은 CR / LF, 유닉스에서는 LF에만 해당) 또는 CTRL-Z (Windows 파일 끝)와 같이 인쇄하지 않는 것을 추가했습니다.
  3. WinSCP를 사용하여 파일을 유닉스 박스에 복사했습니다.
  4. WinSCP는 다음과 같이 생각했다. "이것은 기본 텍스트가 아닌 것을 가지고있다. 바이너리 데이터를 나타 내기 위해 .bin 확장자를 붙일 것이다."
  5. 누락 __init__.py(현재라고 함 __init__.py.bin)은 파이썬이 툴킷을 패키지로 이해하지 못한다는 것을 의미합니다.
  6. __init__.py적절한 디렉토리에 작성 하면 모든 것이 작동합니다 ...?

50
또한 python -c 'import sys; print sys.path 'help-때로는 사용자가 스캔되지 않은 경로에 파일을 배치했습니다.
mikebabcock

1
WinSCP가 추가하지 않은 것을 제외하고는 동일한 것을 사용하고 .bin있습니다.
사용자

9
빈 "__init__.py"가 있으면 같은 일이 발생합니까?
dietbacon

2
세상에, 당신은 지배합니다! 내 이야기 ​​: 1. Windows에서 init .py를 편집했습니다 . 2. 스페이스 대신 TAB을 추가했습니다. 3.이 게시물을 찾을 때까지 많이 google! ;)
GBrian

1
나에게 문제 는와 함께 설치 한 후 python driver.py사용해야했을 때 사용 중이었습니다 . python3 driver.pypip3
Eric Wiener

72

않습니다

(local directory)/site-packages/toolkit

__init__.py?

수입하려면 도보 당신의 디렉토리를 통해이 모든 디렉토리가 있어야합니다 __init__.py파일을.


1
좋은 지적! 비고 : Python 3.3부터는 패키지 이름과 일치하는 이름을 가진 sys.path의 모든 디렉토리가 인식됩니다.
PatrickT

1
상대 경로 참조에만 필요하지 않습니까? 모든 디렉토리에 왜 있어야 합니까?
소닉 소울

56

LPTHW에서이 운동을했을 때 매우 비슷한 일이있었습니다. 필자가 호출 한 디렉토리에 파일이 있음을 Python이 인식하도록 할 수 없었습니다. 그러나 결국에는 작동하도록 할 수있었습니다. 내가 한 일과 내가 추천하는 것은 이것을 시도하는 것입니다.

(참고 : 초기 게시물에서 * NIX 기반 컴퓨터를 사용하고 명령 줄에서 작업을 수행한다고 가정 하므로이 조언은 그에 맞게 조정되었습니다. 우분투를 실행하기 때문에 이것이 내가 한 일입니다)

1) 디렉토리 (cd)를 파일이 있는 디렉토리 의 디렉토리로 변경하십시오. 이 경우 mountain.py파일 을 실행 하려고하고 toolkit.interface.py별도의 디렉토리에 있는 모듈 을 호출하려고합니다 . 이 경우 두 파일 모두에 대한 경로가 포함 된 디렉토리 (또는 두 파일의 경로가 공유하는 가장 가까운 디렉토리)로 이동합니다. 이 경우 toolkit디렉토리 는 어느 것입니까 ?

2) tookit디렉토리 에있을 때 명령 행에 다음 코드 행을 입력하십시오.

export PYTHONPATH=.

이는 PYTHONPATH를 "."로 설정합니다. 이는 기본적으로 PYTHONPATH가 현재있는 디렉토리 내에서 (그리고 현재 디렉토리하위 디렉토리 분기 에서) 호출 된 파일을 찾습니다 . 그래서 당신의 현재 디렉토리에 보이지만, 모든 디렉토리에서하지 않습니다 ) 현재 디렉토리.

3) 위 단계에서 PYTHONPATH를 설정 한 후 현재 디렉토리 ( toolkit디렉토리) 에서 모듈을 실행하십시오 . 파이썬은 이제 지정한 모듈을 찾아서로드해야합니다.

도움이 되었기를 바랍니다. 나는 이것에 대해 매우 좌절했다.


2
또는 Windows에서 set PYTHONPATH=..
cjbarth

이것은 나를 위해 일했습니다. 또한 기계를 바꿀 때마다 절대 경로로 업데이트해야하기 때문에 PYTHONPATH 좌절감을 완전히 단순화했습니다. 고마워요
the_e

41

* nix에서 PYTHONPATH가 올바르게 구성되어 있는지, 특히 다음 형식을 갖는지 확인하십시오.

 .:/usr/local/lib/python

( .:처음 에는를 염두 에두고 현재 디렉토리에서도 검색 할 수 있습니다.)

버전에 따라 다른 위치에있을 수도 있습니다.

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6
또한있을 수 .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7등 버전에 따라
니키타 볼코프

나에게 모듈은 /usr/local/lib/python3.4/dist-packages에 있지만 터미널 (ubuntu)에 python3을 입력하고 가져 오려고하면 모듈을 허용하지 않습니다. 존재하지 않습니다. "ImportError : x 모듈이 없습니다"
user65165

#!/usr/bin/python파일 끝에 추가해도 효과 가 있습니까?
Nearoo

1
@Nearoo 나는 그것이 작동하지 않을 것이라고 생각합니다. 또한 일반적 으로이 shebang은 파일 맨 위에 추가됩니다.
Renaud

2
MacOSX에서 PYTHONPATH = / usr / local / lib / python2.7 / site-packages를 시작 스크립트에 추가하여 수정했습니다.
요한 스노우 구스

23

나는 내 자신의 문제를 해결했으며, 잘못된 것들과 해결책에 대한 요약을 작성합니다.

파일을 정확히 호출해야합니다 __init__.py. 내 경우와 같이 확장명이 다르면 .py.binPython은 디렉토리를 이동할 수 없으며 모듈을 찾을 수 없습니다. 파일을 편집하려면 vi 또는 nano 와 같은 Linux 편집기를 사용해야합니다 . Windows 편집기를 사용하면 숨겨진 문자가 작성됩니다.

그것에 영향을 준 또 다른 문제는 루트로 다른 파이썬 버전을 설치했기 때문에 누군가 로컬 파이썬 설치로 작업하는 경우 프로그램을 실행하는 파이썬 설치가 로컬 파이썬인지 확인하십시오. 이를 확인하려면 그냥 수행 which python하고 실행 파일이 로컬 디렉토리에있는 파일인지 확인하십시오. 그렇지 않은 경우 경로를 변경하되 로컬 Python 디렉토리가 다른 Python보다 앞에 있는지 확인하십시오.


내가 얻은 문제는 모듈을 루트 사용자만이 pip에 의해 (다시) 설치하여 액세스했기 때문에 프로그램을 실행 한 사용자가 볼 수 없다는 것입니다.
Jānis Elmeris

@ JānisElmeris 위의 의견에 대해 더 자세히 설명해 주시겠습니까? 비슷한 오류가 발생한다고 생각합니다. 나는이 __init__.py파일을 해당 디렉토리에 위치하지만 수동으로 사용하여 패키지를 설치 setup.py. 새 패키지를 설치하면 가져 오기를 방해하는 방법이 있습니다.
Krishna Oza

@darth_coder, 죄송합니다. 6 년 전의 일이며 기억이 나지 않습니다. 또한, 나는 최근에 조금도 파이썬을 다루지 않습니다. 내가 쓴 것에서 나는 루트로 패키지를 설치했다고 생각할 수 있는데, 다른 사용자가 이전에 가지고 있던 액세스 권한을 갖지 못하도록 권한을 변경했습니다.
Jānis Elmeris

19

쉬운 해결책은 관리자 제한의 경우 sudo를 사용할 수있는 python -m pip install <library-name>대신 대신 모듈을 설치하는 것입니다.pip install <library-name>


2
python -m앞에서 무엇을 달성 pip install합니까?
sporc

1
@sporc--m 명령 줄 플래그를 사용하면 Python은 모듈이나 패키지를 가져 와서 스크립트로 실행합니다. -m 플래그를 사용하지 않으면 지정한 파일이 스크립트로 실행됩니다.
Tony Ciccarone

이 답변이 wrt python -m pip...작동 을 어떻게 말하고 있는지 확실 pip...하지 않지만 실제로는 동일한 python디렉토리 에 있다고 가정하면 실제로 동일한 것 입니다. 아마도 pip이전의 일부 파이썬 릴리스에서는 독립형 프로그램을 사용할 수 없었습니다 (그러나 현재는 최신 2.7 및 3.x입니다). 이 경우 python로컬 virtualenv에 pip있었고 그렇지 않았으므로 python -m pip install로컬 virtualenv pip에 설치 하는 반면 시스템 python에 설치하려고 시도하고 sudo없이 실패했습니다. 어쨌든 이해가되지 않습니다.
마이클

17

디렉토리를 패키지로 표시하려면이라는 파일이 필요합니다. __init__.py도움이 되나요?


init .py.bin 이라는 파일이 이미 있습니다. 이름을 init .py로 변경하면 다음 오류가 발생합니다. /__init__.py ", 1 행"utilities ","demo "] ^ SyntaxError : invalid syntax
Eduardo

에 무엇입니까 초기화 평? 질문의 일부로 게시하십시오.
S.Lott

아무것도 없습니다. 비어 있습니다. 다운로드 한 패키지와 함께있었습니다. 파일에 무언가를 써야합니까?
Eduardo

@ S.Lott : init .py 에 아무것도 넣을 필요가 없습니까?
igorgue

1
@ 에두아르도 귀하의 초기화 평 오류를 가져옵니다. 그리고 당신은 그것이 비어 있다고 말합니다. 조정하기가 어렵습니다. 그리고 init .py.bin 이라고 부를 수는 없습니다 . 파이썬은이 파일을 무시합니다. 일반적으로 아무것도 포함 할 수 없습니다.
S.Lott

16

사용 PyCharm하면 소스로 스크립트 디렉토리를 정의해야합니다 (JetBrains의 제품군의 일부) :
Right Click > Mark Directory as > Sources Root


12

이 답변을 읽고 있으면 귀하 __init__.py가 올바른 위치에 있으며 모든 종속성을 설치했으며 여전히을 받고 있습니다 ImportError.

PyCharm을 사용하여 실행할 때 내 프로그램이 제대로 실행된다는 점을 제외하고 비슷한 문제에 직면했지만 터미널에서 실행할 때 위의 오류가 발생했습니다. 더 깊이 파고 들자 PYTHONPATH프로젝트 디렉토리에 대한 항목이 없다는 것을 알았습니다. 그래서 나는 설정 PYTHONPATH에 따라 PyCharm에 가져 오기 문이 작동하지만 터미널에서 :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

다음 sys.path과 같이 사용하여이를 수행하는 다른 방법이 있습니다.

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

프로젝트를 검색하려는 순서에 따라 삽입 / 추가를 사용할 수 있습니다.


12

저에게는 정말 어리석은 일이었습니다. 를 사용하여 라이브러리를 설치 pip3 install했지만 python program.py와는 달리 프로그램을 실행 했습니다 python3 program.py.


1
와 ! 그것은 나에게도 효과가있었습니다.
JavaDeveloper

1
당신은 내 하루를 구했습니다.
Aymen

7

예. __init__.py패키지를 초기화하는 파일 인 파일 을 포함 할 디렉토리가 필요합니다 . 여기, 한 번 봐 가지고 .

__init__.py 파일은 파이썬이 디렉토리를 패키지를 포함하는 것으로 취급하게하는데 필요합니다. 이는 문자열과 같은 공통 이름을 가진 디렉토리가 나중에 모듈 검색 경로에서 발생하는 유효한 모듈을 실수로 숨기지 않도록하기 위해 수행됩니다. 가장 간단한 경우 __init__.py는 빈 파일 일 수 있지만 나중에 패키지에 대한 초기화 코드를 실행하거나 __all__ 변수를 설정할 수도 있습니다.


6
  1. 가져올 파일과 같은 디렉토리에 __ init__.py 파일이 있어야합니다.
  2. 이름이 같고 PYTHONPATH에 구성된 2 개 폴더의 파일을 가져 오려고 시도 할 수 없습니다.

예 : / etc / environment

PYTHONPATH = $ PYTHONPATH : / opt / folder1 : / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

그리고 foo 파일을 가져 오려고하면 파이썬은 원하는 파일을 알지 못합니다.

foo import from ... >>> importerror : foo라는 모듈이 없습니다.


5

내 두 센트 :

여기에 이미지 설명을 입력하십시오

침:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

이것은 나에게 지옥을 혼란스럽게했습니다-추악한 syspath 해킹을 제안하는 게시물과 게시물을 보았습니다 (내가 __init__.py모두 거기에있는 것처럼 ). game / oblivion.py와 game / oblivion은 파이썬을 혼란스럽게해서 다소 도움이되지 않는 "No Module named RecordRecords"를 뱉어 냈습니다. 이 (동일한 이름) 동작을 설명하는 해결 방법 및 / 또는 링크-> 편집 (2017.01.24)- 모듈과 패키지가 같은 이름을 가진 경우 어떻게됩니까? 흥미롭게도 일반적으로 패키지 가 우선하지만 런처가이를 위반하는 것 같습니다.

편집 (2015.01.17) : 나는 우리가 여기에 해부 된 사용자 정의 실행기를 사용한다고 언급하지 않았습니다. .


더 길을 벗어난 것처럼. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py 다음과 같이 사용할 파이썬 코드를 추가하여 문제를 해결하고 싶을 수도 있습니다.game.oblivion.patchers.RecordGroups
Dwight Spencer

@DwightSpencer : "RecordGroups"를 가져 game.oblivion.__init__.py왔지만이를 확인해야 할 수도 있습니다.
Mr_and_Mrs_D

4

Linux : 가져온 모듈은 /usr/local/lib/python2.7/dist-packages에 있습니다.

C로 컴파일 된 모듈을 사용하는 경우 .so 파일을 chmod하는 것을 잊지 마십시오 sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

3

필자의 경우, 문제는 내가 디버그 python & 에 링크하는 것이었고 boost::Python, 확장은 FooLib_d.pyd단지 FooLib.pyd; 파일 이름을 바꾸거나 CMakeLists.txt속성을 업데이트 하면 오류가 해결되었습니다.


3

위에 제공된 모든 방법을 시도했지만 실패한 경우 모듈 의 이름 이 내장 모듈 과 동일 할 수 있습니다 . 또는 모듈 보다 우선 순위가 높은 폴더에 동일한 이름sys.path 의 모듈이 존재합니다.

디버깅하려면 from foo.bar import baz불만을 말하십시오 ImportError: No module named bar. 로 변경 import foo; print foo하면 경로가 표시됩니다.foo . 당신이 기대하는 것입니까?

그렇지 않은 경우 이름을 바꾸 foo거나 절대 가져 오기를 사용하십시오 .


1
나를 위해, 이것은 산출 ImportError: No module named foo합니다.
alex

3

내 문제는 __init__.py실제로 부모 디렉토리를 추가해야 할 때 파일이 있는 디렉토리 를 PYTHONPATH에 추가한다는 것 입니다.


3

여전히이 문제가있는 모든 사람들에게. Pycharm이 수입품과 혼동된다고 생각합니다. 나에게 '네임 스페이스에서 가져 오기 가져 오기'를 쓰면 이전 줄에 빨간색 밑줄이 표시되어 오류가 있음을 알리지 만 작동합니다. 그러나``from .namespace import something ''에는 밑줄이 표시되지 않지만 작동하지 않습니다.

시험

try:
    from namespace import something 
except NameError:
    from .namespace import something

1
첫 번째입니다 파이썬이 구문은, 두 번째는 파이썬 3입니다
타냐 Branagan

2

글을 작성 print (sys.path)하여 문제를 해결 하고 새로 설치해도 파이썬이 오래된 패키지를 사용하고 있음을 알았습니다. 이것을 만든 파이썬을 삭제하면 올바른 패키지가 자동으로 사용됩니다.


2

필자의 경우 PyCharm과 PyCharm을 사용하기 때문에 프로젝트 폴더의 모든 프로젝트에 대해 'venv'를 만들지 만 파이썬의 미니 환경입니다. Python에서 필요한 라이브러리를 설치했지만 사용자 정의 프로젝트 'venv'에서는 사용할 수 없습니다. 이것이 PyCharm에서 'ImportError : xxxxxx라는 모듈이 없습니다'의 실제 원인입니다. 이 문제를 해결하려면 다음 단계에 따라 프로젝트 사용자 정의 환경에 라이브러리를 추가해야합니다.

  • PyCharm의 메뉴 '파일'-> 설정
  • 설정 대화 상자에서 프로젝트 : XXXProject-> 프로젝트 인터프리터
  • "추가"버튼을 클릭하면 '사용 가능한 패키지'대화 상자가 표시됩니다
  • 라이브러리를 검색하고 '패키지 설치'를 클릭하십시오
  • 그런 다음 필요한 모든 패키지가 프로젝트 사용자 정의 'venv'폴더에 설치됩니다.

설정 대화 상자

즐겨.


0

동일한 문제로 어려움을 겪은 후 내 해결책은 모두 삭제하는 것이 었습니다. pyc 내 프로젝트에서 파일 캐시 된 파일이 어떻게 든이 오류를 일으킨 것처럼 보입니다.

내가 찾은 가장 쉬운 방법은 Windows 탐색기에서 프로젝트 폴더로 이동하여을 검색 *.pyc한 다음 모두 ( Ctrl+ A) 를 선택 하고 삭제하는 것입니다 ( Ctrl+X )하는 것입니다.

특정 pyc파일을 삭제하여 문제를 해결할 수 있었지만 시도하지 않았습니다.


0

나는 같은 문제에 직면했다 Import error. 또한 라이브러리가 100 % 올바르게 설치되었습니다. 문제의 원인은 내 PC 3 버전의 python (anaconda packet)이 설치되어 있다는 것입니다). 이것이 바로 도서관이 올바른 장소에 설치되지 않은 이유입니다. 그 후 방금 IDE PyCharm에서 적절한 버전의 Python으로 변경했습니다.


0

나는 같은 오류가 있었다. 누군가 내 스크립트와 동일한 폴더에 폴더를 만들었 기 때문에 다른 곳에서 가져 오는 모듈과 이름이 충돌했습니다. 외부 모듈을 가져 오는 대신 예상 폴더가 들어 있지 않은이 폴더 내부를 살펴 보았습니다.


0

나는 같은 문제 (Python 2.7 Linux)를 가지고 있었고 해결책을 찾았으며 그것을 공유하고 싶습니다. 내 경우에는 아래 구조를 가졌습니다.

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

'main.py'에서 모든 조합이 실패했습니다.

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

해결책은 생각보다 훨씬 간단했습니다. "소책자"폴더의 이름을 "소책자"로 바 꾸었습니다. 이제 파이썬은 'main.py'코드를 사용하여 Question 클래스를 정상적으로 가져올 수 있습니다.

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

이것에서 나는 'booklet'과 같은 Package-Names (folders)가 소문자로 시작해야한다고 결론 지을 수 있습니다. 그렇지 않으면 Python은 그것을 class 이름 및 Filename과 혼동합니다.

분명히 이것은 귀하의 문제는 아니지만 John Fouhy의 대답은 매우 좋으며이 스레드에는이 문제를 일으킬 수있는 거의 모든 것이 있습니다. 따라서 이것은 한 가지 더 있으며 다른 사람들에게 도움이되기를 바랍니다.


0

필자의 경우 실제 패키지 대신 package.egg 폴더의 경로를 포함 시켰습니다. 패키지를 최상위 수준으로 복사하면 효과가 있습니다.


0

이것은 나를 위해 일했습니다 : __init__.py부모 폴더 안에 파일을 만들었습니다 (귀하의 경우 site-packages폴더 안에 ). 그리고 다음과 같이 가져옵니다.

from site-packages.toolkit.interface import interface

그것이 당신에게도 도움이되기를 바랍니다!


0

리눅스 서버에서 dos2unix script_name

( pyc명령 이있는 모든 파일 이 있으면 제거하십시오)find . -name '*.pyc' -delete )

Windows에서 스크립트 작업을 한 경우 다시 실행하십시오.


0

필자의 경우 sys.path.insert()로컬 모듈을 가져오고 module not found다른 라이브러리에서 가져 왔습니다. 나는 sys.path.insert()보고 된 수입품을 아래 에 두어야 했다 module not found. 가장 좋은 방법은 sys.path.insert()수입의 맨 아래에 두는 것 입니다.

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