2013-05-03 3 views
6

그래서 스택 오버플로에 대한 몇 가지 유사한 질문을 본 적이 있지만 아무 것도 내 문제 또는 일반적인 경우를 해결하는 것 같습니다. 그래서, 잘하면이 질문을 수정하고 내 두통을 멈 춥니 다. (시Python의 자매 서브 디렉토리에서 가져 오기?

repo/ 
    __init__.py 
    sub1/ 
     __init__.py 
     sub1a/ 
     __init.py 
     mod1.py 
    sub2/ 
     __init__.py 
     mod2.py 

내가 mod1.py 반대에서 mod2.py을 가져 어떻게, 어떻게이 변경 mod1.py 또는 mod2.py 스크립트가 있는지 여부에 따라 않습니다 : 나는 형식의 자식의 repo를 각각은 가져 오기 - 가져 오지 않음)입니까?

답변

6

가장 간단한 해결책은 repo이 포함 된 디렉토리를 PYTHONPATH에 넣은 다음 절대 경로 가져 오기를 사용하는 것입니다. import repo.sub2.mod2 등등.

다른 솔루션은 당신이 당신이 임의의 디렉토리에서 스크립트로 직접 파이썬 파일을 모두 호출하는 경우 포함하려는 경우 일부 해커를 포함하는 것입니다 - 효과적으로 PYTHONPATH을 설정하는 것과 같은 일을 수행하기 위해 엉망으로 가장 가능성이 sys.path을, 사용자가 설정하지 않아도됩니다. 특별한 도트 구문을 사용하는 상대 수입으로 당신의 PYTHONPATH

repo 추가

  • 상대 수입
  • :

+1

나는 PYTHONPATH를 편집해도 괜찮지 만 이것을 시행하는 표준 방법이 있습니까? 나는 repo의 모든 새로운 사용자가 수동으로 PYTHONPATH에 들어가서 업데이트해야하는 것을 원하지 않습니다. – Eli

+1

사람들이'PYTHONPATH'를 스스로 관리해야하는 것을 원하지 않는다면'sys.path' mangling을 고려해야 할 것입니다. (예를 들어,'__file__'과'os.abspath'를 사용하여 스크립트가 위치한 곳을 찾은 다음 디렉토리의 상위 레벨을'repo'의 부모로 만들고'sys.path.insert '그것.) – Amber

2

파이썬 2.6+를 사용하는 경우, 당신은 두 가지 선택이있다 :

패키지 sub1 :

패키지 sub1a에서
from .sub2.mod2 import thing 

: 일반 import 문 (import module)이 상대적으로 수입 작동하지 않는

from ..sub2.mod2 import otherthing 

참고.

export PYTHONPATH=/where/your/project/is:$PYTHONPATH 

상세 정보 :

+0

나는이 상대적 수입품이 정말로 원했던 것이다. 그러나, 내 파이썬 2.7, 그들은 작동하지 않습니다. –

+0

Python 2.7을 사용하여'from sub2.mod2 import thing'과 같은 명령문을 사용하여 성공했습니다. – coralvanda

0

스크립트 또는 모듈 중 하나를

    시스템 경로에
  1. 또는 수입 스크립트/모듈과 동일한 패키지의
  2. 부분입니다 모듈을 가져올 수 있습니다.

모듈의 경우 이러한 규칙은 예외없이 적용됩니다. 스크립트의 경우 규칙이 적용되지만 주름은 스크립트를 실행할 때 기본적으로 패키지의 일부로 간주되지 않습니다.

기본적으로 스크립트는 시스템 경로에있는 모듈 만 가져올 수 있습니다. 기본적으로 경로에는 현재 디렉토리가 포함되어 있으므로 스크립트를 실행하면 같은 디렉토리에있는 모듈이나 하위 디렉토리에있는 패키지를 가져올 수 있습니다. 하지만 그게 전부입니다. 스크립트에는 디렉토리 트리에 "어디에 있느냐"라는 개념이 없으므로 디렉토리를 묶는 것에 대한 특정 상대 경로 정보가 필요한 가져 오기를 수행 할 수 없습니다. 즉, "상위 디렉토리"또는 "형제 디렉토리에서"항목을 가져올 수 없음을 의미합니다. 해당 디렉토리에있는 항목은 시스템 경로에있는 경우에만 가져올 수 있습니다.

패키지에있는 "알기"스크립트를 만들고 싶다면 __package__ 속성을 지정할 수 있습니다. this previous question을 참조하십시오. 그러면 해당 스크립트 내에서 명시 적 상대 가져 오기 (예 : from ...sub2 import mod2)를 사용할 수 있습니다.

관련 문제