Jinja: FileSystemLoader tidak berfungsi dengan jalur Windows (garis miring terbalik)

Dibuat pada 7 Sep 2017  ·  9Komentar  ·  Sumber: pallets/jinja

Perilaku yang Diharapkan

Pada Windows FileSystemLoader harus mengizinkan jalur gaya Windows (dengan \ ) dan gaya UNIX (dengan / ).

Perilaku Sebenarnya

Di Windows, saat menggunakan FileSystemLoader berikut ini gagal:
jinjaEnvironment.get_template('.\source\architecture\ARM\ARMv6-M-ARMv7-M\bo ardTemplates\ARMv6-M-ARMv7-M.metadata')
dengan
jinja2.exceptions.TemplateNotFound: .\source\architecture\ARM\ARMv6-M-ARMv7-M\bo ardTemplates\ARMv6-M-ARMv7-M.metadata

sementara jinjaEnvironment.get_template('.\source\architecture\ARM\ARMv6-M-ARMv7-M\bo ardTemplates\ARMv6-M-ARMv7-M.metadata'.replace('\\', '/')) ini berfungsi dengan baik.

Pelacakan Kembali Penuh

Traceback (most recent call last):
  File "./scripts/generateBoard.py", line 186, in <module>
    metadata = jinjaEnvironment.get_template(metadataFile).render(dictionary = d
ictionary)
  File "C:\Python27\lib\site-packages\jinja2\environment.py", line 830, in get_t
emplate
    return self._load_template(name, self.make_globals(globals))
  File "C:\Python27\lib\site-packages\jinja2\environment.py", line 804, in _load
_template
    template = self.loader.load(self, name, globals)
  File "C:\Python27\lib\site-packages\jinja2\loaders.py", line 113, in load
    source, filename, uptodate = self.get_source(environment, name)
  File "C:\Python27\lib\site-packages\jinja2\loaders.py", line 168, in get_sourc
e
    pieces = split_template_path(template)
  File "C:\Python27\lib\site-packages\jinja2\loaders.py", line 31, in split_temp
late_path
    raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: .\source\architecture\ARM\ARMv6-M-ARMv7-M\bo
ardTemplates\ARMv6-M-ARMv7-M.metadata

Lingkungan Anda

  • Versi Python: 2.7.12
  • Versi Jinja: 2.9.6

Komentar yang paling membantu

Saya pikir informasi ini harus dinyatakan secara eksplisit dalam dokumentasi dengan font tebal jika Anda tidak berniat untuk memperbaikinya. Bukannya saya sengaja menggunakan garis miring terbalik - ketika membuat nama file menggunakan beberapa kode python lain (misalnya dengan mencari folder untuk ekstensi yang sesuai), string memiliki garis miring asli sistem (jadi garis miring terbalik pada Windows). Dalam hal ini Anda harus secara eksplisit mengganti garis miring ...

BTW - Saya tidak menggunakan Windows, tetapi saya sedang menulis skrip yang seharusnya berfungsi di semua platform.

Semua 9 komentar

Nama template Jinja bukan jalur sistem file (meskipun mereka dipetakan ke jalur sistem file saat hanya menggunakan FileSystemLoader). Mereka selalu menggunakan garis miring ke depan jadi ini berfungsi sebagaimana mestinya.

Saya pikir informasi ini harus dinyatakan secara eksplisit dalam dokumentasi dengan font tebal jika Anda tidak berniat untuk memperbaikinya. Bukannya saya sengaja menggunakan garis miring terbalik - ketika membuat nama file menggunakan beberapa kode python lain (misalnya dengan mencari folder untuk ekstensi yang sesuai), string memiliki garis miring asli sistem (jadi garis miring terbalik pada Windows). Dalam hal ini Anda harus secara eksplisit mengganti garis miring ...

BTW - Saya tidak menggunakan Windows, tetapi saya sedang menulis skrip yang seharusnya berfungsi di semua platform.

@FreddieChopin
Apakah yang ini sudah diperbaiki? sepertinya masih mempengaruhi saya di tahun 2019.

Yang harus saya lakukan adalah mengganti semua \\ secara manual menjadi / .

Apakah yang ini sudah diperbaiki?

"Ini bukan bug - ini fitur!" (;

Ini benar-benar aneh! Bisakah ini diubah atau disebutkan (dalam huruf besar) di dokumen?

PR selamat datang (untuk dokumen)

Saya mulai dengan satu, tetapi kemudian saya menemukan ini: https://github.com/pallets/jinja/blob/master/jinja2/loaders.py#L43 -L61

A very basic example for a loader that looks up templates on the file
system could look like this::
    from jinja2 import BaseLoader, TemplateNotFound
    from os.path import join, exists, getmtime
    class MyLoader(BaseLoader):
        def __init__(self, path):
            self.path = path
        def get_source(self, environment, template):
            path = join(self.path, template)
            if not exists(path):
                raise TemplateNotFound(template)
            mtime = getmtime(path)
            with file(path) as f:
                source = f.read().decode('utf-8')
            return source, path, lambda: mtime == getmtime(path)

Dokumen secara eksplisit mengatakan bahwa os.path.join harus/dapat digunakan. Mungkin masalah lebih tepat?

Masalah sebenarnya adalah modul jalur python mengembalikan jalur dengan '\' di windows secara default. Saya tahu itu perilaku yang benar entah bagaimana tetapi fungsi bawaan seperti "terbuka" menerima garis miring dan garis miring terbalik jadi "kadang-kadang berhasil, kadang-kadang tidak" hal-hal semacam itu terjadi. Mungkin kita memerlukan beberapa cara untuk menangani jalur yang tidak bergantung pada platform...semacam "konvensi python untuk memperlakukan jalur secara internal" semacam itu...Saya pikir ini bukan masalah jinja2 (Ini adalah masalah konvensi historis antara Unix dan Windows dan tampaknya bertahan selamanya) tetapi beberapa "perhatian" dalam dokumen awal disambut.

Masalah mendasar adalah bahwa "jalur" templat sebenarnya bukan jalur OS, tetapi diharapkan hanya berisi pemisah "/". Namun di loaders.get_source() , self.searchpath juga menganggap bahwa pemisah jalur selalu "/".

Jalur templat tidak boleh diubah menjadi jalur OS yang sebenarnya, karena tampaknya ada tempat lain di mana asumsi kanonik ini digunakan.

Solusinya adalah mengubah template dan jalur pencarian untuk memuat pemisah jalur OS yang sebenarnya, pada titik di mana jalur OS diperlukan:

    def get_source(self, environment, template):
        _searchpaths = self.searchpath
        if path.sep != '/':
            template = template.replace('/', path.sep)
            _searchpaths = [p.replace('/', path.sep) for p in self.searchpath]
        pieces = os.path.split(template)
        for searchpath in _searchpaths:
            # Existing code continues here ...

Saya telah menguji kode ini secara singkat di Windows 10/Python 2.7, dan itu memperbaiki kesalahan "Templat tidak ditemukan" saya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat