동일한 디렉토리 또는 하위 디렉토리 내에서 클래스를 가져 오는 방법은 무엇입니까?


675

모든 .py 파일 을 저장하는 디렉토리가 있습니다.

bin/
   main.py
   user.py # where class User resides
   dir.py # where class Dir resides

나는에서 클래스를 사용하려는 user.pydir.pymain.py .
이 파이썬 클래스를 main.py 로 어떻게 가져올 수 있습니까?
또한 user.py 가 하위 디렉토리에있는 User경우 클래스를 어떻게 가져올 수 있습니까?

bin/
    dir.py
    main.py
    usr/
        user.py


답변:


938

파이썬 2

파일 __init__.py과 같은 디렉토리에 빈 파일을 호출 하십시오. 그것은 파이썬에게 "이 디렉토리에서 가져 오기가 가능"하다는 것을 의미합니다.

그럼 그냥 ...

from user import User
from dir import Dir

파일이 서브 디렉토리에있는 경우에도 마찬가지 __init__.py입니다. 서브 디렉토리에도 넣은 다음 점 표기법과 함께 일반 import 문을 사용하십시오. 각 레벨의 디렉토리에 대해 가져 오기 경로에 추가해야합니다.

bin/
    main.py
    classes/
        user.py
        dir.py

따라서 디렉토리의 이름이 "classes"라면 다음과 같이합니다.

from classes.user import User
from classes.dir import Dir

파이썬 3

이전과 동일하지만 .하위 디렉토리를 사용하지 않는 경우 모듈 이름 앞에 접두사를 붙입니다 .

from .user import User
from .dir import Dir

14
경우 __init__.py입니다 하지 빈, 다음에 어떤 __init__.py패키지를 가져 오기 (그리고로 가져올 수 없습니다 일을 할 때 사용할 수 있습니다 무엇을 __init__.py전혀 사용할 수 없습니다).
Amber

23
__init__.py파일이 필요한가요? 세 개의 파일을 모두 같은 디렉토리에 넣고 실행 하면 다른 두 모듈에서 파일을 사용할 main.pyimport있습니다. 내가 무엇을 놓치고 있습니까?
martineau

30
그것이 파이썬이 가져 오기가 허용 된 디렉토리를 식별하는 방법이기 때문입니다. 실행중인 스크립트의 디렉토리는 예외입니다. 항상 스크립트를 가져올 수 있습니다.
Amber

20
@nbro & Amber : FWIW, __init__.py같은 디렉토리에서 다른 모듈을 가져오고 가져올 수 있다는 점에서 미묘한 변화가 있다고 생각합니다 . 특히 Python 2.7.8에서 작동 import하는 __init__.py파일 자체 와 동일한 디렉토리에있는 다른 모듈 은 Python 3.4.1에서 실패했습니다. 이 문제를 해결하려면 하위 디렉토리의 이름과 점을 접두사 import module로 사용해야했습니다 (예 : 로 변경해야 함 import subdirectory.module). 다행히도이 작업을 수행 한 후에도 여전히 Python 2.7.8에서 작동했습니다.
martineau

4
이 솔루션이 더 이상 작동하지 않음을 확인할 수 있습니다. 수정, 수정 또는 완전히 삭제할 수 있습니다.
Luís de Sousa

137

방금 동일한 디렉토리에있는 파일에서 클래스를 가져 오기 위해 Python 3으로 작성한다는 것을 알게되었습니다 ( martineau의 의견 덕분에 ).

from .user import User
from .dir import Dir

8
내가 이것을 시도하는 경우에는 나는 다음과 같은 오류를 얻을 ValueError: Attempted relative import in non-package내가 변경 때 오류가 도망 간다from user import User
Korpel

.fileloader import Fileloader에서 사용하고 ImportError : Get NameError : Name 'Fileloader'를 가져올 수 없음
Frikster

3
@Korpel : stackoverflow.com/questions/11536764/ 의 논의에 따라 위에서 언급 한 가져 오기의 작동 여부는 다음에 달려 있음을 알게되었습니다. [1] 스크립트의 호출 방식 (패키지로) 실제 작업 경로는 실행할 때입니다. [3] 실행 환경의 경로 변수가 채워지는 방법
ecp

@Korpel : 나는. init .py 파일이 있는 경우에만 모듈 이름이 필요 합니다. 생략해야합니다.
MUG4N

39

당신의 main.py:

from user import Class

여기서 Class가져 오려는 클래스의 이름입니다.

의 메소드를 호출하려는 경우 다음 Class을 사용하여 호출 할 수 있습니다.

Class.method

__init__.py동일한 디렉토리에 빈 파일 이 있어야합니다 .


1
가져 오려는 모듈에 클래스가 없으면 어떻게해야합니까? 원시 기능 만? 파이썬 2에서 내가해야 할 일은 '가져 오기 모듈'입니다. 파이썬 3에서는 작동하지 않으며 'import
.module

2
이 삭제 후 python3에서 작동합니다 __init__.py.
engineforce

13

함수와 클래스를 자신과 혼합하지 않으려면 모듈을 가져오고 해당 이름을 통해 액세스 할 수 있습니다

import util # imports util.py

util.clean()
util.setup(4)

또는 함수와 클래스를 코드로 가져올 수 있습니다

from util import clean, setup
clean()
setup(4)

wildchar *를 사용하여 해당 모듈의 모든 것을 코드로 가져올 수 있습니다

from util import *
clean()
setup(4)

10

python3에 __init__.py없는 더 이상 필요 . 콘솔의 현재 디렉토리가 파이썬 스크립트가있는 디렉토리이면 모든 것이 잘 작동합니다.

import user

그러나를 포함하지 않는 다른 디렉토리에서 호출하면 작동하지 않습니다 user.py.
이 경우에는

from . import user

클래스가 아닌 전체 파일을 가져 오려는 경우에도 작동합니다.


2
필자는 코드 대 pylint를 사용하고 있으며 동일한 디렉토리 가져 오기에서 항상 오류로 플래그가 지정되는 데 문제가 import user있었습니다 ( 빨간색으로 밑줄이 그어져 있음). 상대 가져 오기 ( from . import user)로 변경되었으며 linter에 더 이상 플래그가 지정되지 않았습니다.
rbatt

9

이해하기 쉽도록 :

1 단계 : 모든 디렉토리가 포함 된 하나의 디렉토리로 이동

$ cd /var/tmp

2 단계 : 이제 일부 코드를 사용하여 클래스 이름이 Class1 인 class1.py 파일을 만들 수 있습니다.

$ cat > class1.py <<\EOF
class Class1:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF

3 단계 : 이제 코드가 클래스 이름이 Class2 인 class2.py 파일을 만들 수 있습니다.

$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF

4 단계 : 이제 하나의 main.py를 만들어 두 개의 다른 파일에서 Class1 및 Class2를 사용하기 위해 한 번 실행됩니다.

$ cat > main.py <<\EOF
"""this is how we are actually calling class1.py and  from that file loading Class1"""
from class1 import Class1 
"""this is how we are actually calling class2.py and  from that file loading Class2"""
from class2 import Class2

print Class1.OK
print Class2.OK
EOF

5 단계 : 프로그램 실행

$ python main.py

출력은

[Class1 OK]: 
[Class2 OK]:

4
이것이 작동하지 않고 main.py가 class1 또는 class2를 읽을 수 없으면 어떻게됩니까? ... 우리가 무엇을 놓치고 있습니까?
darkgaze

6

파이썬 3


동일 directory합니다.

가져 오기 파일 :log.py

수입 클래스 : SampleApp().

import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

또는

디렉토리는 basic입니다.

파일로 가져 오기 : log.py.

수입 클래스 : SampleApp().

from basic import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

5
from user import User 
from dir import Dir 

이것은 Python 2.7과 Python 3.6 모두에 init .py 파일이 없어도 효과적이었습니다.
imsrgadich

1
@imsrgadich는 파일이 들어있는 디렉토리에서 파이썬을 실행하는 한 작동합니다. 이것은 예외입니다. 이 의견
Ciprian Tomoiagă

5

user.py 및 dir.py에 클래스가 포함되어 있지 않은 경우

from .user import User
from .dir import Dir

작동하지 않는다. 그런 다음

from . import user
from . import dir

0

왜 이것이 작동하는지 잘 모르겠지만 Pycharm 빌드를 사용하고 있습니다. from file_in_same_dir import class_name

IDE가 그것에 대해 불평했지만 여전히 작동하는 것 같습니다. 파이썬 3.7을 사용하고 있습니다


-2

너무 간단합니다. 파일 __init__.py은 클래스 디렉토리입니다. 다음과 같이 스크립트로 가져옵니다 (모두 가져 오기).

from classes.myscript import *

선택한 수업 만 가져 오기

from classes.myscript import User
from classes.myscript import Dir

4
이 답변에서 볼 수있는 와일드 카드 가져 오기는 일반적으로 PEP 8에 설명 된대로 잘못된 스타일로 간주됩니다 .
V02460

-3

같은 디렉토리에서 가져 오기

from . import the_file_you_want_to_import 

하위 디렉토리에서 가져 오려면 디렉토리에 포함되어야합니다

init .py

파일 이외의 파일

디렉토리에서 your_file을 가져 오십시오.


3
이 답변이 다른 답변이하지 않은 것을 추가한다고 생각하지 않으며 다른 답변에 대한 종합적인 요약이 아닙니다. 궁금 그래서 당신은 그것을 쓴 이유
lucidbrot

-3

파이썬 3

사용하다

from .user import User inside dir.py file

use from class.dir import Dir inside main.py
or from class.usr import User inside main.py

그렇게


3
이 답변은 실제로 다른 답변보다 더 많은 것을 추가하지 않으며 설명이 없습니다. 답변 을 추가하거나 개선하기 위해 답변편집 할 수있는 방법이 있습니까? 그렇지 않으면 이 답변이 완전히 제거되거나 제거 된 것처럼 다운 투표 됩니다.
Das_Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.