Résolution d'un chemin relatif depuis py: match dans un modèle genshi
-
06-07-2019 - |
Question
<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'est-ce qui devrait être considéré comme "quelque part"? au dessus de? Je souhaite que l'attribut href
soit relatif au fichier contenant la balise foo
, comme les attributs href
des autres balises.
Sinon, quel fichier contenait le bloc py: match? Ceci est moins bon car il peut se trouver dans un répertoire différent du fichier portant la balise foo
.
Encore moins bon: je pourrais fournir le chemin du fichier que je suis en train de restituer en tant qu'argument de contexte extérieur à Genshi, mais il se peut que ce soit dans un répertoire différent de celui mentionné ci-dessus.
La solution
Vous devez vous assurer que le programme du pilote (c'est-à-dire le programme Python qui analyse le fichier d'entrée) est exécuté dans le répertoire du fichier contenant la balise foo
. Sinon, vous devez indiquer le chemin relatif (c.-à-d. Comment accéder au répertoire dans lequel le lecteur s'exécute dans le répertoire du fichier en cours de lecture) en tant qu'argument de contexte de votre code Python et l'ajouter à l'OS . .path.join
commande.
Avec cette configuration (et avec Genshi 0.6 installé sur MacOS X 10.6.3 via le paquet Fink, genshi-py26), la commande os.getcwd ()
renvoie le répertoire de travail actuel du fichier contenant le balise foo
.
Pour des constructions de chemin aussi compliquées, je vous recommande également fortement d'utiliser path = os.path.normpath (chemin)
, car vous ne voudrez peut-être pas que de telles choses se glissent dans le code HTML résultant.