하위 폴더에서 모듈 가져 오기


104

하위 폴더를 모듈로 가져오고 싶습니다. 따라서 모든 하위 폴더에는 __init__.py. 내 폴더 구조는 다음과 같습니다.

src\
  main.py
  dirFoo\
    __init__.py
    foofactory.py
    dirFoo1\
      __init__.py
      foo1.py
    dirFoo2\
      __init__.py
      foo2.py

내 기본 스크립트에서 가져옵니다.

from dirFoo.foofactory import FooFactory

이 팩토리 파일에는 하위 모듈이 포함되어 있습니다.

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2

내 foofactory를 호출하면 오류가 발생하고 해당 파이썬은 하위 모듈 foo1 및 foo2를 가져올 수 없습니다.

Traceback (most recent call last):
  File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
  File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in    <module>
from dirFoo1.foo1 import Foo1
    ImportError: No module named dirFoo1.foo1

답변:


136

당신 PYTHONPATH이나 sys.path여기 를 엉망으로 만들 필요가 없습니다 .

패키지에서 절대 가져 오기를 올바르게 사용하려면 "루트"패키지 이름도 포함해야합니다. 예 :

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2

또는 상대 가져 오기를 사용할 수 있습니다 .

from .dirfoo1.foo1 import Foo1
from .dirfoo2.foo2 import Foo2

47
기억해야 할 한 가지! __init__.py가져 오는 모든 하위 폴더에 추가하십시오 .
Aziz Alto

6
비어 있으면 __init__.py작업을 수행 할 수 있습니다.
cerebrou

1
이전 Foo1에 상위 디렉토리에 있었고 from Foo1 import *. 동일한 효과를 얻을 수있는 방법이 있으므로 모든 접두사를 붙일 필요가 Foo1없습니까?
jxramos

1
@AzizAlto는 : 귀하의 코멘트없이이 솔루션은 매우 유용하지 않습니다
알렉스

21

여기서 알려주세요. (newbee, keviv22에서)

자신의 이익을 위해 절대로 "-"또는 "_"와 같은 기호로 폴더 나 파일의 이름을 지정하십시오. 그렇게하면 몇 가지 문제에 직면 할 수 있습니다. 내 것과 마찬가지로 가져 오기 명령이 정확하더라도 이름이 지정된 폴더 내에서 사용할 수있는 원하는 파일을 성공적으로 가져올 수 없습니다.

다음과 같이 잘못된 폴더 이름 지정 :

  • 일반 클래스 폴더
  • Generic_Classes_Folder

위의 유효한 폴더 이름 :

  • GenericClassesFolder 또는 Genericclassesfolder 또는 genericClassesFolder (또는 단어 사이에 공백이나 특수 기호없이 이와 유사 함)

내가 한 실수 :

파일 구조를 고려하십시오.

Parent
   . __init__.py
   . Setup
     .. __init__.py
     .. Generic-Class-Folder
        ... __init__.py
        ... targetClass.py
   . Check
     .. __init__.py
     .. testFile.py

내가 뭘하고 싶었어?

  • testFile.py에서 Generic-Class-Folder 파일에있는 'targetClass.py'파일을 가져 와서 'targetClass.py'파일에서 "functionExecute"라는 함수를 사용하고 싶었습니다.

내가 한 명령은 무엇입니까?

  • 'testFile.py'에서 명령을 작성했습니다. from Core.Generic-Class-Folder.targetClass import functionExecute
  • 다음과 같은 오류가 있습니다. SyntaxError: invalid syntax

많은 검색을 시도하고 많은 스택 오버플로 질문을 보았지만 무엇이 잘못되었는지 결정할 수 없었습니다. 내 파일을 여러 번 교차 확인하고 파일을 사용 __init__.py하고 환경 경로를 삽입했으며 무엇이 잘못되었는지 크게 걱정했습니다 ...

그리고 오랜만에 친구와 이야기하면서 이걸 알아 냈어요. 이러한 명명 규칙을 사용하는 것은 조금 어리 석습니다. 폴더 나 파일의 이름을 정의하는 데 공백이나 특수 기호를 사용해서는 안됩니다. 그래서 이것이 제가 전하고 싶었던 것입니다. 좋은 하루 되세요!

(이에 대한 큰 게시물에 대해 죄송합니다 ... 내 좌절감을 풀어줍니다 .... :) 감사합니다!)


22
공백과 대시 ( "-")를 사용하면 문제가 발생하지만 밑줄 ( "_")은 여전히 ​​잘 작동합니다.
cowlinator

6

PYTHONPATH 환경 변수를 설정하십시오. 예를 들어 다음과 같은 PYTHONPATH =. : .. (* nix 계열의 경우).

또한 pythonpath에 현재 디렉토리 (귀하의 경우 src)를 수동으로 추가 할 수 있습니다.

import os
import sys
sys.path.insert(0, os.getcwd())

2

프로젝트가 다음과 같이 구성되었다고 가정 해 보겠습니다.

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

내부는 run.py, 당신은 스크립트를 하나, 둘,로 가져올 수 있습니다 :

from subscripts import script_one as One
from subscripts import script_two as Two

이제 여전히 내부 run.py에서 다음을 사용하여 메서드를 호출 할 수 있습니다.

One.method_from_one(param)
Two.method_from_two(other_param)

1

빈 ___init____.py 파일을 만들고 다른 파이썬 모듈이있는 파이썬 응용 프로그램의 모든 하위 디렉토리 / 폴더뿐만 아니라 루트에 추가하십시오.


-2

init .py가 하위 폴더에 있고 누락 된 모든 것이 가져 오기 후 'as'를 추가하는 경우에도 문제가 발생했습니다.

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