Jinja: FileSystemLoaderλŠ” Windows 경둜(λ°±μŠ¬λž˜μ‹œ)μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 09μ›” 07일  Β·  9μ½”λ©˜νŠΈ  Β·  좜처: pallets/jinja

μ˜ˆμƒλ˜λŠ” λ™μž‘

Windows FileSystemLoader λŠ” Windows μŠ€νƒ€μΌ( \ 포함) 및 UNIX μŠ€νƒ€μΌ( / 포함) 경둜λ₯Ό λͺ¨λ‘ ν—ˆμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ‹€μ œ 행동

Windowsμ—μ„œ FileSystemLoader λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μŒμ΄ μ‹€νŒ¨ν•©λ‹ˆλ‹€.
jinjaEnvironment.get_template('.\source\architecture\ARM\ARMv6-M-ARMv7-M\bo ardTemplates\ARMv6-M-ARMv7-M.metadata')
~와 ν•¨κ»˜
jinja2.exceptions.TemplateNotFound: .\source\architecture\ARM\ARMv6-M-ARMv7-M\bo ardTemplates\ARMv6-M-ARMv7-M.metadata

이 jinjaEnvironment.get_template('.\source\architecture\ARM\ARMv6-M-ARMv7-M\bo ardTemplates\ARMv6-M-ARMv7-M.metadata'.replace('\\', '/')) λŠ” μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

전체 역좔적

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

λ‹Ήμ‹ μ˜ ν™˜κ²½

  • 파이썬 버전: 2.7.12
  • μ§„μž 버전: 2.9.6

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μˆ˜μ •ν•  생각이 μ—†λ‹€λ©΄ 이 정보λ₯Ό ꡡ은 κΈ€κΌ΄λ‘œ λ¬Έμ„œμ— λͺ…μ‹œμ μœΌλ‘œ λͺ…μ‹œν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ˜λ„μ μœΌλ‘œ λ°±μŠ¬λž˜μ‹œλ₯Ό μ‚¬μš©ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€. λ‹€λ₯Έ 파이썬 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 파일 이름을 생성할 λ•Œ(예: ν΄λ”μ—μ„œ μ μ ˆν•œ ν™•μž₯자λ₯Ό κ²€μƒ‰ν•˜μ—¬) λ¬Έμžμ—΄μ— μ‹œμŠ€ν…œμ˜ κΈ°λ³Έ μŠ¬λž˜μ‹œκ°€ μžˆμŠ΅λ‹ˆλ‹€(Windowsμ—μ„œλŠ” λ°±μŠ¬λž˜μ‹œ). 이 경우 λͺ…μ‹œμ μœΌλ‘œ μŠ¬λž˜μ‹œλ₯Ό λ°”κΏ”μ•Ό ν•©λ‹ˆλ‹€...

BTW - Windowsλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ λͺ¨λ“  ν”Œλž«νΌμ—μ„œ μž‘λ™ν•΄μ•Ό ν•˜λŠ” 슀크립트λ₯Ό μž‘μ„± μ€‘μž…λ‹ˆλ‹€.

λͺ¨λ“  9 λŒ“κΈ€

Jinja ν…œν”Œλ¦Ώ 이름은 파일 μ‹œμŠ€ν…œ κ²½λ‘œκ°€ μ•„λ‹™λ‹ˆλ‹€(FileSystemLoader만 μ‚¬μš©ν•  λ•Œ 파일 μ‹œμŠ€ν…œ κ²½λ‘œμ— λ§€ν•‘λ˜λ”λΌλ„). 그듀은 항상 μŠ¬λž˜μ‹œλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ μ˜λ„ν•œ λŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

μˆ˜μ •ν•  생각이 μ—†λ‹€λ©΄ 이 정보λ₯Ό ꡡ은 κΈ€κΌ΄λ‘œ λ¬Έμ„œμ— λͺ…μ‹œμ μœΌλ‘œ λͺ…μ‹œν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ˜λ„μ μœΌλ‘œ λ°±μŠ¬λž˜μ‹œλ₯Ό μ‚¬μš©ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€. λ‹€λ₯Έ 파이썬 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 파일 이름을 생성할 λ•Œ(예: ν΄λ”μ—μ„œ μ μ ˆν•œ ν™•μž₯자λ₯Ό κ²€μƒ‰ν•˜μ—¬) λ¬Έμžμ—΄μ— μ‹œμŠ€ν…œμ˜ κΈ°λ³Έ μŠ¬λž˜μ‹œκ°€ μžˆμŠ΅λ‹ˆλ‹€(Windowsμ—μ„œλŠ” λ°±μŠ¬λž˜μ‹œ). 이 경우 λͺ…μ‹œμ μœΌλ‘œ μŠ¬λž˜μ‹œλ₯Ό λ°”κΏ”μ•Ό ν•©λ‹ˆλ‹€...

BTW - Windowsλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ λͺ¨λ“  ν”Œλž«νΌμ—μ„œ μž‘λ™ν•΄μ•Ό ν•˜λŠ” 슀크립트λ₯Ό μž‘μ„± μ€‘μž…λ‹ˆλ‹€.

@FreddieChopin
이거 κ³ μ •μΈκ°€μš”? 2019년에도 μ—¬μ „νžˆ 영ν–₯을 λ―ΈμΉ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ν•΄μ•Ό ν•  일은 μˆ˜λ™μœΌλ‘œ λͺ¨λ“  \\ 을 / 둜 λ°”κΎΈλŠ” κ²ƒμž…λ‹ˆλ‹€.

이거 κ³ μ •μΈκ°€μš”?

"버그가 μ•„λ‹ˆλΌ κΈ°λŠ₯μž…λ‹ˆλ‹€!" (;

이것은 정말 μ΄μƒν•œ κ²ƒμž…λ‹ˆλ‹€! λ¬Έμ„œμ—μ„œ 이것을 λ³€κ²½ν•˜κ±°λ‚˜ μ–ΈκΈ‰ν•  수 μžˆμŠ΅λ‹ˆκΉŒ(큰 κΈ€μžλ‘œ)?

PR ν™˜μ˜(λ¬Έμ„œμš©)

λ‚˜λŠ” ν•˜λ‚˜μ—μ„œ μ‹œμž‘ν–ˆμ§€λ§Œ 이것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 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)

λ¬Έμ„œμ—μ„œλŠ” os.path.join을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€κ³  λͺ…μ‹œμ μœΌλ‘œ λ§ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€ 더 μ μ ˆν•˜μ§€ μ•Šμ„κΉŒμš”?

μ‹€μ œ λ¬Έμ œλŠ” python 경둜 λͺ¨λ“ˆμ΄ 기본적으둜 Windowsμ—μ„œ '\'κ°€ μžˆλŠ” 경둜λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚˜λŠ” 그것이 μ–΄λ–»κ²Œ λ“  μ˜¬λ°”λ₯Έ ν–‰λ™μ΄λΌλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ "open"κ³Ό 같은 λ‚΄μž₯ ν•¨μˆ˜λŠ” μŠ¬λž˜μ‹œμ™€ λ°±μŠ¬λž˜μ‹œλ₯Ό λͺ¨λ‘ ν—ˆμš©ν•˜λ―€λ‘œ "λ•Œλ‘œλŠ” μž‘λ™ν•˜μ§€λ§Œ λ•Œλ‘œλŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€"λΌλŠ” 일이 λ°œμƒν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ μš°λ¦¬λŠ” ν”Œλž«νΌκ³Ό 독립적인 경둜λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ–΄λ–€ 방법이 ν•„μš”ν•  κ²ƒμž…λ‹ˆλ‹€... μΌμ’…μ˜ "경둜λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 파이썬 κ·œμΉ™" μ’…λ₯˜... 제 생각에 이것은 jinja2의 λ¬Έμ œκ°€ μ•„λ‹ˆλΌκ³  μƒκ°ν•©λ‹ˆλ‹€(이것은 Unix 및 WindowsλŠ” μ˜μ›νžˆ μ§€μ†λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ‹œμž‘ λ¬Έμ„œμ˜ 일뢀 "주의"λŠ” ν™˜μ˜ν•©λ‹ˆλ‹€.

근본적인 λ¬Έμ œλŠ” ν…œν”Œλ¦Ώ "경둜"κ°€ μ‹€μ œλ‘œ OS κ²½λ‘œκ°€ μ•„λ‹ˆλΌ "/" ꡬ뢄 기호만 포함할 κ²ƒμœΌλ‘œ μ˜ˆμƒλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ loaders.get_source() μ—μ„œ self.searchpath λŠ” 경둜 ꡬ뢄 κΈ°ν˜Έκ°€ 항상 "/"라고 μƒκ°ν•©λ‹ˆλ‹€.

이 ν‘œμ€€ 가정이 μ‚¬μš©λ˜λŠ” λ‹€λ₯Έ μœ„μΉ˜κ°€ λΆ„λͺ…νžˆ 있기 λ•Œλ¬Έμ— ν…œν”Œλ¦Ώ 경둜λ₯Ό μ‹€μ œ OS 경둜둜 λ³€κ²½ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.

μ†”λ£¨μ…˜μ€ OS κ²½λ‘œκ°€ ν•„μš”ν•œ μ§€μ μ—μ„œ μ‹€μ œ OS 경둜 κ΅¬λΆ„μžλ₯Ό ν¬ν•¨ν•˜λ„λ‘ ν…œν”Œλ¦Ώκ³Ό 검색 경둜λ₯Ό λͺ¨λ‘ λ³€κ²½ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

    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 ...

이 μ½”λ“œλ₯Ό Windows 10/Python 2.7μ—μ„œ κ°„λ‹¨νžˆ ν…ŒμŠ€νŠΈν–ˆμœΌλ©° "ν…œν”Œλ¦Ώμ„ 찾을 수 μ—†μŒ" 였λ₯˜λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰