Python에서 "ImportError : No module named…"오류를 수정하는 방법은 무엇입니까?


115

이 ImportError 오류를 수정하는 올바른 방법은 무엇입니까?

다음 디렉터리 구조가 있습니다.

/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo

그리고 나는 디렉토리에 있습니다.

/home/bodacydo/work/project

이제 입력하면

python ./programs/my_python_program.py

나는 즉시 얻는다

ImportError: No module named foo.tasks

./programs/my_python_program.py에는 다음 행 이 포함됩니다.

from foo.tasks import my_function

파이썬이 왜 찾지 못하는지 이해할 수 없습니다 ./foo/tasks.py. 거기에 있습니다.

Python 셸에서 수행하면 작동합니다.

python
>>> from foo.tasks import my_function

python ./programs/my_python_program.py스크립트 를 통해 호출하는 경우에만 작동하지 않습니다 .

답변:


121

Python은 현재 디렉터리를에 추가하지 않고 sys.path스크립트가있는 디렉터리에 추가 /home/bodacydo/work/project합니다 . sys.path또는에 추가 합니다 $PYTHONPATH.


9
그렇다면 루트 폴더에 init .py 를 갖는 요점은 무엇입니까? sys.path 또는 pythonpath를 편집하면 아무런 의미가없는 것 같습니다.

11
@Editor : __init__.py부모가 sys.path패키지 안에 있거나 그 자체 가 패키지 일 때 디렉토리가 패키지로 취급되어야 함을 나타냅니다 .
Ignacio Vazquez-Abrams 2014 년

3
또한 폴더에 대한 권한을 확인하십시오. 제 경우에는 그게 문제였습니다.
SidJ

15
파이썬 경로에 현재 디렉토리를 추가하려면export PYTHONPATH=`pwd`
rodorgas

1
무엇 나를 위해 일한 것이 될 것입니다 귀하의 경우, $ PYTHONPATH에 프로젝트의 부모 디렉토리를 추가했다 : /home/bodacydo/work... 이 답변을 참조
maledr53

33

__init__.pyfoo 디렉토리에 파일이 있습니까? 그렇지 않으면 파이썬은 foo를 파이썬 패키지로 인식하지 않습니다.

자세한 내용은 python 튜토리얼의 패키지 섹션 을 참조하십시오.


고마워요 __init__.py. 이번 문제는 $PYTHONPATH. Ignacio의 솔루션이 작동했습니다.
bodacydo 2010

1
초기화 평 파일은 파이썬 패키지를 포함하는 등의 디렉토리를 치료하기 위해 필요합니다; 이는 문자열과 같은 공통 이름을 가진 디렉토리가 나중에 모듈 검색 경로에서 발생하는 유효한 모듈을 의도하지 않게 숨기는 것을 방지하기 위해 수행됩니다. 가장 간단한 경우 init .py는 빈 파일 일 수 있습니다
panofish

저를 구 해주셔서 감사합니다.
cpu_meltdown

9

다음은 단계별 솔루션입니다.

  1. run.py에서 호출 된 스크립트를 추가 /home/bodacydo/work/project하고 다음과 같이 편집하십시오.

    import programs.my_python_program
    programs.my_python_program.main()
    

    ( main()에서 동등한 방법으로 대체 하십시오 my_python_program.)

  2. 이동 /home/bodacydo/work/project
  3. 운영 run.py

설명 : python 은 실행되는 스크립트 의 경로를 PYTHONPATH에 추가하므로 실행 run.py하면 /home/bodacydo/work/project. 그리고 함으로써 해결할 수 , import foo.tasks발견 될 것이다.


8

PYTHONPATH에 라이브러리를 추가하는 예제 솔루션입니다.

  1. ~ / .bashrc에 다음 행을 추가하거나 직접 실행하십시오.

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. 그런 다음 필요한 라이브러리를 ~ / .python 폴더에 연결하십시오.

    ln -s /home/user/work/project/foo ~/.python/

6

더 나은 설정보다 수정 PYTHONPATH사용하는 것입니다python -m module.path

이것은 올바르게 설정 sys.path[0]되고 모듈을 실행하는 더 안정적인 방법입니다.

나는이 빠른 작성자 의 다른 답변자가 언급 한 것처럼,이 문제에 대한을 이유로 이에 대한 인 python path/to/file.pypath/to의 시작 부분에 PYTHONPATH( sys.path).


2

내 생각에는 foo폴더가 독립 실행 형 라이브러리라는 것을 고려해야합니다 . Lib\site-packages파이썬 설치 내의 폴더로 옮기는 것을 고려할 수 있습니다 . foo.pth거기 에 파일을 추가하는 것을 고려할 수 있습니다 .

./programs/my_python_program.py에 다음 줄 이 포함되어 있기 때문에 라이브러리라는 것을 알고 있습니다 .

from foo.tasks import my_function

따라서 그것이 ./programs.NET의 형제 폴더 인지 는 중요하지 않습니다 ./foo. my_python_program.py다음과 같은 스크립트로 실행 되는 것은 사실입니다 .

파이썬 ./programs/my_python_program.py


0

설치 한 버전을 사용할 때이 문제가 발생하면을 사용할 때 setup.py모듈이 내부에 포함되어 있는지 확인하십시오.packages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.