genshiテンプレートのpy:matchからの相対パスを解決する
-
06-07-2019 - |
質問
<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"/>
&quot; somewhere&quot;として何をすべきか上? href
属性は、他のタグの href
属性のように、 foo
タグが含まれるファイルに対して相対的である必要があります。
また、どのファイルにpy:matchブロックが含まれていましたか? foo
タグを持つファイルとは異なるディレクトリにある可能性があるため、これはあまり良くありません。
さらに良くない:レンダリングするファイルのパスをGenshiの外部からコンテキスト引数として指定できますが、上記の両方とは異なるディレクトリにある可能性があります。
解決
ドライバープログラム(入力ファイルを解析するPythonプログラム)が foo
タグを含むファイルのディレクトリで実行されることを確認する必要があります。そうでない場合は、Pythonコードへのコンテキスト引数として相対パス(つまり、リーダーが実行されているディレクトリから読み取り中のファイルのディレクトリまでの取得方法)を渡し、それを osに追加する必要があります。 .path.join
コマンド。
このセットアップ(およびFinkパッケージgenshi-py26を介してMacOS X 10.6.3にインストールされたGenshi 0.6を使用)では、コマンド os.getcwd()
は、ファイルを含む現在の作業ディレクトリを返します foo
タグ。
このような複雑なパス構成には、 path = os.path.normpath(path)
を使用することを強くお勧めします。これは、結果のHTMLコードでそのようなものがリークすることを望まないためです。
所属していません StackOverflow