Модуль Python по пути - PullRequest
1 голос
/ 14 мая 2009

Я пишу минимальную замену для mod_python's publisher.py

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

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

Здесь / foo / может быть каталогом, а 'bar' - методом 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 () для этого.

1 Ответ

3 голосов
/ 14 мая 2009

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