Resolver una ruta relativa desde py: coincidencia en una plantilla genshi
-
06-07-2019 - |
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.
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.