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

하위 폴더를 모듈로 가져오고 싶습니다. 따라서 모든 하위 폴더에는 __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



답변

당신 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


답변

여기서 알려주세요. (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하고 환경 경로를 삽입했으며 무엇이 잘못되었는지 크게 걱정했습니다 …

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

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


답변

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

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

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


답변

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

+---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)


답변

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


답변

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

from folder.file import Class as Class
import folder.file as functions


답변