Я пишу минимальную замену для 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 () для этого.