2013-03-06 1 views
5

계층 구조 이름 지정 규칙 :파이썬 모듈 I는 다음과 같이 모듈/패키지 구조를 가지고 싶습니다

/__init__.py 
/mymodule.py 
/mymodule/ 
/mymodule/__init__.py 
/mymodule/submodule.py 

그리고 다음과 같은 모듈을 사용

import mymodule 
import mymodule.submodule 

을하지만 파일 "인 MyModule처럼 보인다. py "은"mymodule "디렉토리와 충돌합니다.

올바른 이름 지정 규칙은 무엇입니까?

감사합니다.

답변

11

패키지를 확인하려면, 당신은 파이썬으로 변환하는 방법을 이해해야 파일 이름을 모듈 이름으로 변경하십시오.

파일 mymodule.pymymodule으로 사용할 수 있으며, 인터프리터는 파이썬 검색 경로의 디렉토리에서 해당 파일을 찾습니다. 대소 문자를 구별하지 않는 파일 시스템을 사용하고 있다면 다른 대소 문자를 사용하여 가져올 수도 있습니다 (단, 이러한 시스템 종속적 인 동작은 사용하지 않아야합니다).

패키지는 __init__.py 파일이있는 디렉토리입니다. 최근에 이러한 파일이없는 패키지를 허용하는 움직임이 있었지만이 대답에 대해서는 그다지 일반적인 경우를 무시할 것입니다. 패키지는 파이썬 안에서 모듈이되고 코드는 __init__.py 파일에서 가져옵니다. 따라서 파일 mypackage/__init__.pymypackage으로 가져올 수 있습니다.

__init__.py 파일에는 Python 검색 경로에 직접 의미가 없습니다 (글쎄, __init__ 모듈을 가져올 수 있지만 아마도 좋지 않은 생각입니다).

그래서 상황에, 여기에 적절한 파일 시스템 레이아웃입니다 :

toplevel/ 
    mymodule/ 
     __init__.py  # put code here for mymodule 
     submodule.py # put code here for mymodule.submodule 

toplevel 폴더가 파이썬 검색 경로에 있어야합니다.

+0

필자는 파이썬 포크가'mymodule/__ init __. py'에 중요한 코드를 넣는 것을 보지 못했습니다. [알렉스 Martelli] (http://stackoverflow.com/a/2361278/188535),이 확률이 될 것으로 보인다. (필자가 필자의 의견에 반드시 동의하지는 않는다 ...) – detly

+2

사실입니다. 보다 대중적인 스타일은'mymodule '에 대한 실제 코드를 문서화되지 않은 서브 모듈에 넣은 다음 공개 API를'__init __. py'로 가져 오는 것입니다. 유익한 답변에 감사드립니다. – Blckknght

+0

파이썬이 분명한 일을하기 위해 더러운 해킹을 필요로하는 것은 유감스러운 일입니다. –

4

귀하는 package을 다루고 있습니다. 당신이해야하는 패키지 구조는 다음과 같습니다

/some-parent-directory # This needs to be on sys.path 
    /mymodule # This is not really a module - it's a package 
     __init__.py # import mymodule 
     # init is loaded when you `import mymodule` or anything below it 
     some.py # import mymodule.some 
     implementation.py # import mymodule.implementation 
     files.py # import mymodule.files 
     /submodule 
      __init__.py # import mymodule.submodule 
      # init is loaded when you `import mymodule.submodule` or anything below it 
      submodule_impl.py # import mymodule.submodule.submodule_impl 
      goes.py # import mymodule.submodule.goes 
      here.py # import mymodule.submodule.here 

은 오랫동안 부모 디렉토리가 sys.path에 당신은 문제없이 import mymodule 또는 from mymodule.submodule import something를 호출 할 수 있습니다.

당신이 뭔가 패키지 (전. 전자. from mymodule import SomeItem 또는 하위 패키지 from mymodule.submodule import AnotherItem에서) 다음 적절한 __init__.py 파일로 가져올 수 있습니다의 루트 레벨에서 사용할 수있게합니다.

예를 들어, submodule_impl.py 모듈에 정의 된 클래스 CustomClasssubmodule에서 직접 가져 오려고한다고 가정 해 보겠습니다. 귀하의 submodule/__init__.py 다음과 같은 포함 할 것이다 : 그런 다음

from .submodule_impl import CustomClass 

당신이 submodule에서 직접 CustomClass를 가져올 수있을 것이다 (즉 from mymodule.submodule import CustomClass)