2009-05-14 6 views
1

가 나는 기본 전제는 그것이 URL 방식에 따라 모듈을로드하기 때문입니다 mod_python에서의 publisher.py파이썬 모듈 경로

에 대한 최소한의 대체 쓰고 있어요 디렉토리와 'bar'는 /foo/index.py의 게시 가능 클래스에있는 ExposedBar 메소드입니다. 마찬가지로/foo는 /foo.py에 매핑되고 bar는 노출 된 클래스의 메소드입니다. 이것의 의미는 실제로 중요하지 않습니다. 나는 라인이있다 :

sys.path.insert(0, path_to_file) # /var/www/html/{bar|foo} 
mod_obj = __import__(module_name) 
mod_obj.__name__ = req.filename 

그런 다음 모듈은 적절한 클래스/기능/방법을 검사 받는다. 프로세스가 남은 URI 데이터까지 가능하면/a/b/c가 해당 메소드 나 함수에 전달됩니다.

이것은

브라우저에서 볼

, 그것은 상당히 랜덤 나는 /var/www/html/foo/index.py 때까지 잘 작동하고 /var/www/html/bar/index.py했다 첫 번째 검색 경로를 '/ var/www/html/foo'또는 '/ var/www/html/bar'로 설정하고 __import __ ('index')를로드하더라도 'index.py'가 선택됩니다. 나는 그것이 겉으로보기에 무작위적인 선택에 의해 어느 쪽인가를 발견하고 있는지 전혀 모른다. 이것은 다음에 의해 표시됩니다 :

__name__ is "/var/www/html/foo/index.py" 
req.filename is "/var/www/html/foo/index.py" 
__file__ is "/var/www/html/bar/index.py" 

이 질문은 왜 __import__가 임의로 색인을 선택하게됩니까? 경로가 '/ var/www/html'인 경우이를 이해할 수 있지만 그렇지 않습니다. 둘째 :

모듈을 절대 경로로 모듈 객체에로드 할 수 있습니까? sys.path를 수정하지 않아도됩니다. __import__ 또는 new.module()에서이 문서를 찾을 수 없습니다.

+0

TurboGears를 재발 명하고 있습니까? http://turbogears.org/ –

+0

아니요, 제가 필요로하는 바를 정확히 수행 할 수있는 제멋대로인 게시자를 찾고 있습니다. 이렇게 손을 더럽 히면 Python을 배우는 좋은 방법입니다. –

+0

사실, 제 질문은 수사학 적이었습니다. 그들이하는 일을 아주 자세히보고 싶을 수도 있습니다. 시간과 노력을 많이 절약 할 수 있습니다. –

답변

2

모듈을 모듈 객체로 절대적으로 경로로로드 할 수 있습니까? without sys.path의 수정. __import__에있는 문서 또는 new.module() 에 대한 문서를 찾을 수 없습니다.

import imp 
import os 

def module_from_path(path): 
    filename = os.path.basename(path) 
    modulename = os.path.splitext(filename)[0] 

    with open(path) as f: 
     return imp.load_module(modulename, f, path, ('py', 'U', imp.PY_SOURCE)) 
+0

훌륭합니다. 매우 감사합니다. 파이썬에 익숙하지 않아 가져 오기가 C에서 dlopen()과 같은 쉬운 '경로'메커니즘을 가질 것을 기대했습니다 –

+0

은 매력처럼 작동합니다 :) thanks dF –