2014-11-19 3 views
0

초기 디렉토리 구조 : 내가 다른 프로젝트에서 lib.package을 다시 할 필요가로컬 패키지와 동일한 네임 스페이스에 외부 패키지를 추가하는 방법은 무엇입니까?

project/ 
    ▾ lib/ 
    ▸ dir/ 
    ▸ package 

(디렉토리에 __init__.py 파일을 가정)을 따라서 나는 그것을 위해 파이썬 패키지를 생성하고 디렉토리를 제거했습니다. 하지만 lib.package로 설치하면 lib 디렉토리에 네임 스페이스 충돌이 발생하여 프로젝트의 루트에서 가져올 수 없습니다.

최종 구조 :

▾ project/ 
    ▾ lib/ 
    ▸ dir/ 

그리고 VIRTUALENV에 설치된 패키지 이름 lib.package.

▾ lib/ 
    ▸ package/ 
    __init__.py 

나는 pkgutil.extendpath로하는 듯했지만 lib.package 파이썬 패키지의 __init__.py에 추가하는 것은 도움이되지 않았다. 동일한 네임 스페이스에 local 및 virtualenv 설치된 패키지를 모두 추가 할 수있는 방법이 있습니까 lib?

+0

나는 이해하지 못 하겠지만'lib'를 네임 스페이스 패키지로 만들려는 것처럼 들리며'lib.package'를 거의 네임 스페이스 패키지로 만듭니다. 'pkgutil'을 사용하려면 먼저'lib' 패키지를'extendpath'하고,'lib.package' 서브 패키지를'extendpath'해야합니다. 후자를하면, 두 개의'lib.package' 서브 패키지 중 하나만 얻게되며'extendpath'는 실행되지 않거나 확장 할 것이 없습니다. 그게 당신 문제입니까, 아니면 제가 잘못 해석 한가요? – abarnert

+0

@abarnert : 서로 다른 PYTHONPATH 디렉토리에 있어도 동일한 네임 스페이스'lib'에'dir'과'package'를 둘 다 갖기 위해 노력하고 있습니다. 당신이 언급 한'__init __. py' 둘 모두에'extendpath'를 추가하는 것은 효과가 없습니다. –

+0

실제 코드를 설명하는 대신 표시 할 수 있습니까? 나는 둘 다''__init __. py's "를 의미하는지 모르겠습니다. 또한 코드를 제대로 볼 수 없다면 아무도 말할 수없는 코드를 올바르게 사용하지 않았을 수도 있습니다. 또한,'sys.path'가 어떻게 생겼는지,'lib.__ path__'가'import lib' 다음에 어떻게 생겼는지 보여주세요. – abarnert

답변

0

파이썬 2.7에서는 경로를 조작하지 않고도 응용 프로그램의 코드베이스에서 고유하거나 최소한 가져올 수있는 종속성의 이름을 선택하여이 문제를 피하는 것이 좋습니다. 나는 상황이 파이썬 3.4에서 개선되었다고 생각하지만, 여기서는 그다지 확신 할 수 없다.

또한 동일한 문제가있어서 또 다른 이유 때문에 고유 한 이름을 사용하기로 결정했습니다. 모듈의 출처를 알아 내려고 할 때 모든 이름 공간이 lib 인 경우 매우 어렵습니다. 이는 모듈이 로컬 응용 프로그램뿐만 아니라 종속성에서도 존재할 수 있음을 의미합니다. 또한, 필자는 임포트 라인을보고, 내 애플리케이션 코드베이스, 내 의존성 또는 외부 의존성에 상관없이 언제든지 알 수 있음을 의미합니다.

+0

당신이 말하는 3.4의 개선점은 자동 네임 스페이스 패키지라고 생각합니다. 즉, OP가하려고하는 작업을 수행하기 위해 더 이상'pkgutil '이 필요하지 않습니다. 그러나 네임 스페이스 패키지의 기본 개념은 여전히 ​​같은 방식으로 작동합니다. – abarnert

관련 문제