2009-05-14 2 views
1

Я пишу минимальную замену publisher.py mod_python вмодуль Python по пути

Основной предпосылкой является то, что она загружается модулей на основе схемы URL:

/foo/bar/a/b/c/d 

Причем/Foo/может быть каталог и «бар» - это метод ExposedBar в классе, доступном для публикации, в /foo/index.py. Аналогично/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

При просмотре в браузере, это довольно случайный который 'index.py' выбирается, даже если я установил первый путь поиска к '/ var/www/html/foo' или '/ var/www/html/bar', а затем загрузил __import __ ('index'). Я понятия не имею, почему он находит либо случайный выбор. Это видно из:

__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

Могу ли я загрузить модуль по абсолютной величине Путь в объект модуля? Без изменение 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

Замечательный. Огромное спасибо. Будучи новичком в Python, я ожидал, что импорт будет иметь легкий механизм «по пути», такой как dlopen() в C –

+0

работает как шарм :) спасибо dF –

Смежные вопросы