programing

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

nasanasas 2020. 9. 12. 10:07
반응형

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


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

What command I did?

  • from 'testFile.py', wrote command, from Core.Generic-Class-Folder.targetClass import functionExecute
  • Got errors like SyntaxError: invalid syntax

Tried many searches and viewed many stackoverflow questions and unable to decide what went wrong. I cross checked my files multiple times, i used __init__.py file, inserted environment path and hugely worried what went wrong......

And after a long long long time, i figured this out while talking with a friend of mine. I am little stupid to use such naming conventions. I should never use space or special symbols to define a name for any folder or file. So, this is what I wanted to convey. Have a good day!

(sorry for the huge post over this... just letting my frustrations go.... :) Thanks!)


Set your PYTHONPATH environment variable. For example like this PYTHONPATH=.:.. (for *nix family).

Also you can manually add your current directory (src in your case) to pythonpath:

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

Say your project is structured this way:

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

Inside run.py, you can import scripts one and two by:

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

Now, still inside run.py, you'll be able to call their methods with:

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

Had problems even when init.py existed in subfolder and all that was missing was adding 'as' after import

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

참고URL : https://stackoverflow.com/questions/8953844/import-module-from-subfolder

반응형