Разрешение относительного пути из py: match в шаблоне genshi - PullRequest
0 голосов
/ 21 июня 2009
<py:match path="foo">
    <?python
        import os
        href = select('@href').render()
        SOMEWHERE = ...  # what file contained the foo tag?
        path = os.path.abspath(os.path.join(os.path.dirname(SOMEWHERE), href)
        f = file(path,'r')
        # (do something interesting with f)
    ?>
</py:match>
...
<foo href="../path/relative/to/this/template/abcd.xyz"/>

Что должно идти как "где-то" выше? Я хочу, чтобы атрибут href относился к файлу с тегом foo, как атрибуты href для других тегов.

Или в каком файле содержится блок py: match? Это менее хорошо, потому что он может находиться в другом каталоге, чем файл с тегом foo.

Еще менее хорошо: я мог бы указать путь к файлу, который я рендерил, в качестве аргумента контекста извне Genshi, но он может находиться в другом каталоге, чем оба перечисленных выше.

1 Ответ

1 голос
/ 20 мая 2010

Необходимо убедиться, что программа драйвера (т.е. программа Python, которая анализирует входной файл) работает в каталоге файла, содержащего тег foo. В противном случае вам нужно передать относительный путь (т. Е. Как получить из каталога, в котором читатель работает, в каталог читаемого файла) в качестве аргумента контекста для вашего кода Python и добавить его в команду os.path.join .

С этой настройкой (и с использованием Genshi 0.6, установленной в MacOS X 10.6.3 через пакет Fink genshi-py26) команда os.getcwd() возвращает текущий рабочий каталог файла, содержащего тег foo.

Для таких сложных конструкций путей я также настоятельно рекомендую использовать path=os.path.normpath(path), так как вы можете не захотеть, чтобы такие вещи просачивались в ваш результирующий HTML-код.

...