2010-05-17 4 views
3

여러 디렉토리에 분산되어있는 하나의 모듈에 관한 질문이 있습니다.다른 디렉토리를 통해 배포되는 패키지에서 모듈에 액세스하는 Python

의 나는이 두 파일 및 디렉토리에 있다고 가정 해 봅시다 : 작동

import sys 
pythonlibpath = '~/lib/python' 
if pythonlibpath not in sys.path: sys.path.append(pythonlibpath) 
import xxx.util.module1 

:

~/lib/python 
    xxx 
     __init__.py 
     util 
     __init__.py 
     module1.py 
     module2.py 
~/graphics/python 
    xxx 
     __init__.py 
     misc 
     __init__.py 
     module3.py 
     module4.py 

을 그럼 내 파이썬 모듈, 내가 이런 짓을.

자, 문제는 내가 xxx.misc.module3이 필요하다는, 그래서 나는이 한 :

import sys 
graphicslibpath = '~/graphics/python' 
if graphicslibpath not in sys.path: sys.path.append(graphicslibpath) 
import xxx.misc.module3 

을하지만 난이 오류가 발생합니다 : 어떻게 든 아직도 기억처럼

ImportError: No module named misc.module3 

보인다 ~/lib/python에 xxx 패키지가 있고 거기에서 misc.module3을 찾으려고합니다.

이 문제를 해결하려면 어떻게합니까?

답변

2

하나의 패키지 구조를 다른 구조로 끌어 당기는 극단적 인 속임수가 있으면 안됩니다. 파이썬에서는 패키지의 모든 모듈이 단일 하위 디렉토리 아래에 있어야합니다. os 소스를보고 os.path 처리 방법을 알아보십시오.

1

파이썬은 실제로 xxx 패키지가 있음을 기억합니다. 모듈과 패키지가 캐싱 된 후에 수용 가능한 성능을 얻으려면 꽤 많이 필요합니다. 사전 sys.modules을 보면 어떤 모듈이로드되었는지 확인할 수 있습니다.

sys.modules는 그것을 강제로에서 일반 사전 그래서 아래처럼 다시로드 패키지를 제거 할 수 있습니다 : 그것은 사전입니다 xml 패키지를 가져온 후, 그러나 그것은하는 것이 가능하다는 것을

import sys 
print sys.modules 
import xml 
print sys.modules 
del sys.modules['xml'] 
print sys.modules 

공지 사항

해당 사전에서 제거하십시오. 이것은 내가 교육학적인 목적으로 만 만든 점입니다. 실제 응용 프로그램에서는이 접근법을 사용하지 않는 것이 좋습니다. 또한 miscutil 패키지를 함께 사용해야하는 경우이 방법이 효과가 없습니다. 가능한 모든 파이썬 모듈 로딩 메커니즘에 맞게 소스 코드 구조를 재정렬하십시오.

1

이 문제는 Python 3.3의 Implicit Namespace Packages에서 해결됩니다. PEP-420을 참조하십시오.

+0

이것은 실용적인 예와 함께 설명하는 것이 유용 할지라도, 파이썬 3에 대한 정답입니다. – funseiki

0

이것은 answer to a similar question의 변형입니다.

@ 게리의 대답에 이어 PEP 420 page은 공유 된 __init__.py 패키지에 다음 코드를 사용한다고 말합니다.

__init__.py

:

from pkgutil import extend_path 
__path__ = extend_path(__path__, __name__) 

이 코드는 내부에 배치해야 XXX 디렉토리의 __init__.py.

libPath=someroot/lib/python/ 
graphicsPath=someroot/graphics/python/ 
export PYTHONPATH=$PYTHONPATH:$libPath:$graphicsPath 

파이썬 테스트 코드 (pyenv를 사용하여 파이썬 버전 2.7.14과 3.6.4에서 테스트) :

someroot/ 
├── graphics 
│   └── python 
│    └── xxx 
│     ├── ****__init__.py**** 
│     └── misc 
│      ├── __init__.py 
│      ├── module3.py 
│      └── module4.py 
└── lib 
    └── python 
     └── xxx 
      ├── ****__init__.py**** 
      └── util 
       ├── __init__.py 
       ├── module1.py 
       └── module2.py 

일부 setup.sh 파일 아래 *이 s의 파이썬 경로에 추가 참조

import xxx.util.module1 
import xxx.misc.module3 # No errors 
관련 문제