2011-11-08 1 views
5

필자가 작성한 프로그램을 구성하는 스크립트가 점점 늘어나고 있으며, 내 소스 트리를 정리하고 올바르게 패키지화해야한다고 결정했습니다. 나는 이것이 간단한 질문이지만 그것을하는 법을 알 수 없다고 확신한다."within"모듈 패키지

모듈 그룹이 있는데 그 모듈은 함께 맞지만 하나는 최상위 모듈이어야하고 다른 모듈 이름 앞에 모듈 이름이 있지만 실제로는 하위 패키지에 들어가야합니다. 어떻게해야합니까?

예를 들어, import mystuff 수 있기를 원한다고 모든 mystuff 얻을. 하지만 나는 또한 import mystuff.test.test1 수 있어야합니다. 나는이 같은

myprogram/ 
    mystuff.py 
    mystuff/ 
     __init__.py 
     tests/ 
      __init__.py 
      test1.py 
      test2.py 
      ... 

을 소스 트리를 만들 것이라고 생각하지만 (한 mystuff/__init__.py가 비어로) 그래서 import mystuff는 아무것도하지 않는다,이 경우, 항상 mystuff/ 보인다 mystuff.py보다 우선합니다.

원하는 동작을 얻으려면 올바른 방법은 무엇입니까? 아니면 이것이 가능하지 않으며 mystuff.pymystuff/으로 이동해야하며 mystuff.mystuff (불필요한 반복 인 것처럼 보임)로 액세스해야합니다.

죄송합니다. 나는 이것이 어딘가에 문서화되어야한다고 생각하지만 어딘가 어디 있는지 찾을 수 없다.

업데이트. 나는 이그나시오의 방법이 정확한 것이라고 생각하지만 나는 그것을 정말로 좋아하지 않는다! 내 편집기에서 여러 파일을 열고 있는데 모두 __init__.py이라면 이상 할 수 있습니다. 그래서 저는 제 구조를 그대로두고, mystuff.pymystuff/__init__.py에 연결하기로 결정했습니다. 왜 내가이 일을해서는 안되는 지에 대한 의견이 있으면 누구든 듣고 싶습니다.

실제로는 결국 tar.gz을 만들 때 distutils의 심볼릭 링크를 역 참조하는 방법을 찾을 수 없기 때문에 다른 방법으로 연결하고 있습니다. 결과적으로 링크가 끊어졌습니다. 이 방법은 동일한 효과를 가지고 행복하게 유지합니다.

+0

예. Ignatio의 응답이 정확한 것이기 때문에 그렇게해서는 안됩니다. – cwallenpoole

+0

@cwallenpoole.동의하지만, 하루가 끝날 때 내가 가지고있는 방법은 정확히 똑같은 효과가 있습니다. 심지어'sdist' 출력은 내 링크가없는 Ignacio의 출력과 정확히 같을 것입니다. 그래서 그것은 개발하는 동안 나를 쉽게 해줍니다. 왜 이것이 나쁜 일인가하는 다른 이유가 있습니까? – tjm

답변

4

mystuff.py의 모든 내용은 대신 mystuff/__init__.py에 입력해야합니다.

+0

나는 그것에 대해 생각했다. 그러나 그것을하는 조금 더러운 방법 같았다. 그래도 추천 된 방법인가요? 그렇다면, 내가 할거야, 아니면 그냥 "일할 수있는 방법"인가? 귀하의 답변에 감사드립니다. – tjm

+0

그것이 완료된 방법입니다. 'foo/__ init __. py'의 내용은 가져올 때'foo'의 일부가됩니다. –

+0

확인. 그 때 좋았어. 그 정도로 쉽습니다 :) 대단히 감사합니다. (허용 될 때 받아 들일 것입니다.) – tjm

4

mystuff.pymystuff/ 패키지를 함께 사용할 수는 없습니다.

  • mystuff.py는 다음 예, mystuff/_stuff.py 및 대한 mystuff/__init__.py로 그를 가져올 이름을 변경 mystuff/__init__.py
  • mystuff.py에 코드를 넣어 :

    당신은 두 가지 선택이있다.

    myprogram/ 
        mystuff.py ------- 
        mystuff/   \ 
         __init__.py /
         _stuff.py <--- 
         tests/ 
          __init__.py 
          test1.py 
          test2.py 
          ... 
    

    mystuff/__init__.py은 다음과 같습니다 :

두 번째 옵션은 다음과 같이 보입니다

from mystuff._stuff import *