2009-08-06 2 views
2

단일 응용 프로그램이 포함 된 Django 프로젝트에서 작업하고 있습니다. 응용 프로그램은 GPL에 따라 배포되므로 프로젝트와 별도로 개발하고 싶습니다. 응용 프로그램을 사용하는 개인 사이트입니다. 프로젝트와 앱 모두에 도메인 이름을 기반으로 한 패키지 구조를 사용하려고 시도하고 있는데 문제가 발생합니다.패키지 구조의 일부를 공유하는 여러 디렉토리에 여러 Python 모듈 만들기

$HOME/django-sites/mydomain 
$HOME/django-apps/mydomain/cms 

그리고 내 PYTHONPATH :

여기에 (적절한 __init__.py 파일) 내 파일 구조의

$HOME/django-sites:$HOME/django-apps 

나는 파일 시스템에있는 모든 디렉토리에서 파이썬 인터프리터 (불 경우) 사이트에서는 클래스를 가져올 수 있지만 응용 프로그램에서는 가져올 수 없습니다. 만약 내가 PYTHONPATH (애플 리케이션을 처음으로 다음 사이트)에서 두 항목의 순서를 반대로하면 앱에서 가져올 수 있지만 사이트에서는 가져올 수 없습니다.

파이썬이 패키지 이름의 첫 번째 부분을 포함하는 PYTHONPATH의 첫 번째 항목에서 가져 오기를 시도하는 것처럼 보입니다. 그 맞습니까? 이 예상되는 동작입니까? 그렇다면 PYTHONPATH에 관계없이 domain/app1, domain/app2와 같은 패키지 구조의 모듈 만 동일한 디렉토리 구조에있을 수 있습니다.

내가 사이트 이름을 바꿀 수 있기 때문에 쇼 스토퍼가 아니지만 기대했던 것과 많이 다릅니다. 파이썬 튜토리얼에는 __path__에 대한 언급이 있지만 사용법은 모르겠다.

패키지는 __path__이라는 특수 속성을 하나 이상 지원한다. 이것은 파일의 코드가 실행되기 전에 패키지의 __init__.py를 담고있는 디렉토리의 이름을 포함하는리스트로 초기화됩니다. 이 변수는 수정할 수 있습니다. 그렇게하면 패키지에 포함 된 모듈 및 하위 패키지에 대한 향후 검색에 영향을 미칩니다.

이 기능은 자주 필요하지는 않지만 패키지에서 발견되는 모듈 집합을 확장하는 데 사용할 수 있습니다.

누구도이 문제를 알고 있습니까? 이 함수를 예상대로 만들기 위해 __path__로 할 수있는 것이 있습니까?

답변

1

귀하의 분석이 올바르게 된 것 같습니다. python 경로는 가져올 모듈을 찾는 데 사용됩니다. 파이썬은 발견 한 첫 번째 것을 가져옵니다. 모듈 이름을 다르게하거나 검색 경로의 같은 위치에 두는 것 외에 다른 작업을 수행하기 위해 할 수있는 일이 무엇인지 확신 할 수 없습니다.

1

기본적으로 같은 이름의 모듈 두 개 (mydomain)가 있습니다. 왜 그렇게 PYTHONPATH를 설정하지 않습니까?

$HOME/django-sites:$HOME/django-apps/mydomain 

가져 오기 문제를 방지 할 수 있습니다.

+1

어쨌든해야 할 일은 제 3 자 앱이 파이썬 가져 오기 네임 스페이스 (예 :'from cms import models')의 맨 위에 있어야합니다. 모든 프로젝트 관련 앱은 프로젝트 모델 내에 있어야합니다 (예 :'[프로젝트] .apps. [appname] 가져 오기 모델') – SmileyChris

+0

그래서 재배포 가능한 여러 타사 응용 프로그램을 개발하려면 완전히 필요합니다. 독특한 패키지 구조? –

4

여기 패키지의 __init__.py가 사용하기위한 방법 __path__에서이다 :

$ export PYTHONPATH=$HOME/django-sites 
$ ls -d $HOME/django* 
django-apps/ django-sites/ 
$ cat /tmp/django-sites/mydomain/__init__.py 
import os 

_components = __path__[0].split(os.path.sep) 
if _components[-2] == 'django-sites': 
    _components[-2] = 'django-apps' 
    __path__.append(os.path.sep.join(_components)) 

$ python -c'import mydomain; import mydomain.foo' 
foo here /tmp/django-apps/mydomain/foo.pyc 
$ 

당신이 보는대로, 이것은이 mydomain 패키지의 django-apps/mydomain 부분 (그 __init__.pydjango-sites/mydomain 아래에있는)의 내용을 만드는 - 당신 돈 이 방법을 사용하는 경우이 목적으로 에 django-apps이 필요합니다.

@ defrex의 대답보다 더 나은 배열인지는 알 수 없지만 패키지의 풍부함은 파이썬 프로그래머의 도구 모음에서 매우 중요하기 때문에 어쨌든 더 잘 설명 할 수있을 것이라고 생각했습니다. -).

+0

감사합니다. 파이썬 자습서에 이와 같은 예가 있었으면합니다. 이제는 의미가 있습니다. :) –

관련 문제