Python을 다른 폴더에서 가져올 수 없습니다.


90

파이썬이 하위 폴더의 모듈을 가져 오도록 할 수없는 것 같습니다. 가져온 모듈에서 클래스의 인스턴스를 만들려고하면 오류가 발생하지만 가져 오기 자체는 성공합니다. 내 디렉토리 구조는 다음과 같습니다.

Server
    -server.py
    -Models
        --user.py

다음은 server.py의 내용입니다.

from sys import path
from os import getcwd
path.append(getcwd() + "\\models") #Yes, i'm on windows
print path
import user

u=user.User() #error on this line

그리고 user.py :

class User(Entity):
    using_options(tablename='users')

    username = Field(String(15))
    password = Field(String(64))
    email    = Field(String(50))
    status   = Field(Integer)
    created  = Field(DateTime)

오류 : AttributeError : '모듈'개체에 '사용자'속성이 없습니다.


1
오류 메시지를 붙여 넣을 수 있습니까?
Harley Holcombe

user.py에서 server.py를 가져오고 싶습니다. 어떡하죠?
Chandra Kanth

답변:


142

__init__.pyPython이 모듈로 취급하도록 Models 디렉토리에 파일을 만들어야한다고 생각합니다 .

그런 다음 다음을 수행 할 수 있습니다.

from Models.user import User

에 코드를 포함하거나 __init__.py(예 : 몇 가지 다른 클래스에 필요한 초기화 코드) 비워 둘 수 있습니다. 하지만 거기에 있어야합니다.


2
감사합니다.이 전에 패키지에 대해 들어 본 적이 없습니다.
ryeguy

1
실제로 Python을 가져올 때 blah.py와 blah / __ init__.py는 정확히 동일하게 처리됩니다.
파이.

2
즉 불명확했다 ... 그리고 나는 나 자신에게 말한다 : RTFM FMF
Alexander.Iljushkin

1
다른 디렉토리에서 server.py를 실행하는 경우에는 작동하지 않습니다.
kchoi

1
server.py가 다른 폴더에 있으면 어떻게됩니까?
Mandroid

24

하위 폴더 에 만들어야 __init__.py합니다 Models. 파일이 비어있을 수 있습니다. 패키지를 정의합니다.

그런 다음 다음을 수행 할 수 있습니다.

from Models.user import User

여기에 있는 파이썬 튜토리얼에서 모든 것을 읽으 십시오 .

여기 에 파이썬 프로젝트의 파일 구성에 대한 좋은 기사도 있습니다 .


파일이 비어 있지 않으면 어떻게합니까?
darkgaze

12

사용자 가져 오기

u = user.User () #이 줄의 오류

위에서 언급 한 __init__가 없기 때문에 문제를 더 명확하게 만드는 ImportError가 예상됩니다.

'user'도 표준 라이브러리의 기존 모듈이기 때문에 얻을 수 없습니다. import 문은이 문을 잡고 그 안에서 User 클래스를 찾으려고합니다. 존재하지 않는 경우에만 오류가 발생합니다.

일반적으로 가져 오기를 절대적으로 만드는 것이 좋습니다.

import Server.Models.user

이런 종류의 모호함을 피하기 위해. 실제로 Python 2.7에서 '사용자 가져 오기'는 현재 모듈에 대해 전혀 상대적으로 보이지 않습니다.

상대 가져 오기를 정말로 원한다면 다소보기 흉한 구문을 사용하여 Python 2.5 이상에서 명시 적으로 가져올 수 있습니다.

from .user import User

9

표준 패키지 구조가 없을 때 상위 폴더에있는 모듈을 가져 오는 올바른 방법은 다음과 같습니다.

import os, sys
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(CURRENT_DIR))

(마지막 두 줄을 병합 할 수 있지만이 방법이 이해하기 더 쉽습니다).

이 솔루션은 크로스 플랫폼이며 다른 상황에서 수정할 필요가 없을 정도로 일반적입니다.


7

__init__.py가 누락되었습니다. Python 자습서에서 :

__init__.py 파일은 Python이 디렉토리를 패키지를 포함하는 것으로 취급하도록하는 데 필요합니다. 이는 문자열과 같은 공통 이름을 가진 디렉토리가 나중에 모듈 검색 경로에서 발생하는 유효한 모듈을 의도하지 않게 숨기는 것을 방지하기 위해 수행됩니다. 가장 간단한 경우 __init__.py는 빈 파일 일 수 있지만 패키지에 대한 초기화 코드를 실행하거나 나중에 설명하는 __all__ 변수를 설정할 수도 있습니다.

모델 디렉토리에 __init__.py라는 빈 파일을 넣으면 모두 황금색이어야합니다.


1

매개 변수 os.path.dirname.... 명령을 어떻게 작성합니까?

import os, sys
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(CURRENT_DIR))

0

내가 선호하는 방법은 다른 모듈에서 사용하는 모듈을 포함하는 모든 디렉토리에 __init__.py를두고 진입 점에서 아래와 같이 sys.path를 재정의하는 것입니다.

def get_path(ss):
  return os.path.join(os.path.dirname(__file__), ss)
sys.path += [
  get_path('Server'), 
  get_path('Models')
]

이렇게하면 지정된 디렉토리의 파일이 가져 오기를 위해 표시되고 Server.py에서 사용자를 가져올 수 있습니다.


0

이상이 기여자에 의해 주어진 답을 거쳐 - Zorglub29, 톰, 마크, 아론 McMillin, lucasamaral, JoeyZhao, Kjeld 플라 럽, Procyclinsur, martin.zaenker, tooty44 내가 직면하고있는 문제를 디버깅 나는 때문에 다른 사용 사례를 발견 이 문제에 직면했습니다. 따라서 누군가의 참조를 위해 아래에 내 관찰을 추가하십시오.

내 코드에서 나는 주기적으로 클래스를 가져 왔습니다. 예를 들면 :

src
 |-- utilities.py (has Utilities class that uses Event class)  
 |-- consume_utilities.py (has Event class that uses Utilities class)
 |-- tests
      |-- test_consume_utilities.py (executes test cases that involves Event class)

test_utilities.py 로 작성된 UT를 실행 하기 위해 python -m pytest tests / test_utilities.py 를 실행 하려고 할 때 다음 오류가 발생 했습니다.

ImportError while importing test module '/Users/.../src/tests/test_utilities.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_utilities.py:1: in <module>
    from utilities import Utilities
...
...
E   ImportError: cannot import name 'Utilities'

오류를 해결 한 방법은 순환 가져 오기 클래스의 기능을 이동하여 클래스의 순환 가져 오기를 제거 할 수 있도록 코드를 리팩토링하는 것이 었습니다.

참고로 __init__.py' src '폴더와 ' tests '폴더에 파일이 있으며 코드를 리팩토링하여 ' ImportError '를 제거 할 수있었습니다 .

다음 stackoverflow 링크는 Python의 순환 종속성에 .

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