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

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

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 : ‘모듈’개체에 ‘사용자’속성이 없습니다.



답변

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

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

from Models.user import User

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


답변

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

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

from Models.user import User

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

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


답변

사용자 가져 오기

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

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

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

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

import Server.Models.user

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

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

from .user import User


답변

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

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

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

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


답변

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

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

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


답변

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

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


답변

내가 선호하는 방법은 다른 모듈에서 사용하는 모듈을 포함하는 모든 디렉토리에 __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에서 사용자를 가져올 수 있습니다.