Pregunta

<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"/>

¿Qué debería ir como " en algún lugar " ¿encima? Quiero que el atributo href sea relativo al archivo con la etiqueta foo , como los atributos href en otras etiquetas.

Alternativamente, ¿qué archivo contenía el bloque py: match? Esto es menos bueno porque puede estar en un directorio diferente del archivo con la etiqueta foo .

Aún menos bueno: podría proporcionar la ruta del archivo que estoy representando como argumento de contexto desde fuera de Genshi, pero eso podría estar en un directorio diferente de los dos anteriores.

¿Fue útil?

Solución

Debe asegurarse de que el programa del controlador (es decir, el programa Python que analiza el archivo de entrada) se ejecuta en el directorio del archivo que contiene la etiqueta foo . De lo contrario, debe pasar la ruta relativa (es decir, cómo llegar desde el directorio en el que se ejecuta el lector al directorio del archivo que se está leyendo) como un argumento de contexto a su código de Python y agregarlo al os .path.join comando.

Con esta configuración (y usando Genshi 0.6 instalado en MacOS X 10.6.3 a través del paquete Fink genshi-py26) el comando os.getcwd () devuelve el directorio de trabajo actual del archivo que contiene el Etiqueta foo .

Para construcciones de ruta tan complicadas, también recomiendo utilizar path = os.path.normpath (ruta) , ya que es posible que no desee que esas cosas se filtren en su código HTML resultante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top