본문 바로가기
개발일지/Django

Django - ModuleNotFoundError: No module named 'n12br' - 해결

by 개발에정착하고싶다 2022. 12. 25.

이번 에러는 n12br이라는 모듈을 찾지 못하겠다는 에러다.

 

보통 ModuleNotFoundError가 나오면 맨 뒤에나오는 n12br같은것을 설치해주면 해결될 문제였는데 이번에는 케이스가 다른것같다.

요지는 markdown이라는 라이브러리를 다운받아서 사용하려고 했는데 이런 에러가 뜬 것이였다.


#1 상황정리

import markdown

@register.filter()
def mark(value):
    extensions = ["n12br", "fenced_code"]
    return mark_safe(markdown.markdown(value, extensions=extensions))

이런 코드로 markdown을 사용해 주려고 했다.


#2 접근방식

 

1)하지만 어쨌든 에러가 뜨길래 "응? 내가 뭘 잘 설치해주지 못했나?" 싶어서 pip list, conda list를 찾아보았다.

모두 markdown 3.4.1 버전이 설치되어있었다. (설치를 했으니깐)

 

2)그렇다면 markdown을 html 에서 extention으로 불러오는 경로가 잘못되어서 저런 문제가 생긴걸까?

라는 생각도 들어서 경로를 수정하면서 고쳐보기 전에 우선 강사님의 파일, 폴더배열과 등록되어있는게 같은지를 확인했고

그 다음으로는 터미널에서 python을 입력해서 import markdown을 해봤다.

import가 되는 것으로 보아 import 자체는 문제가 아니였다. 하지만 테스트를 위해서 인터프리터(터미널을 통해 들어온 python 환경)

에다가

>>> import markdown
>>> text = """
... line1
... line2
... """
>>> html = markdown.markdown(text, extensions=['n12br'])

이렇게 입력을 해봤더니 

ModuleNotFoundError: No module named 'n12br'

이 에러가 뜨는 것이다.

즉, 여기서 의심이 드는 것은 어떠한 경로에 대한 걸림이 없음에도 저렇게 나오는것에 대해서 n12br은 markdown의 내무 모듈인데

이게 불러와 지지 않는 것을 해결해야한다. 로 결론이 났다.


#3 해결 순서

 

1) 일단은 여기까지 확인이 된 후에 구글에 검색해봤고, 바로 답이 나오질 않았기에 찾는 동안의 도움을 받으려고 저자님의 게시판에 질문을 올렸다.

 

2) 보다보니 느끼는 것인데 "환경 변수"가 잘못 되어서. 이를테면 markdown이 설치되어야하는 위치와 sys.path의 위치가 다를 수있다는 판단이 들었고 일단 그것으로 접근을 해보고 있다 (진행중)

 

3) .... python-markdown n12br 에 연관된 키워드로 계속 구글링을 해봤다. 하지만 결과가 자꾸 이상한것만 나오는 것 같아서 검색결과를 기존의 한국어에서 영어로 변경한 다음에 찾기 시작했다.

 

4) 그러던 중 확실한것은 모르겠으나, 공식문서로 보이는 모습의 사이트가 있었고 그 사이트에 들어갔다.

https://pypi.org/project/denden-extension/

 

denden-extension

Python-Markdown extension for DenDenMarkdown

pypi.org

처음에는 markdown이라고는 되어있으나 딱히 n12br에 대해서 나오지는 않고 있었고 사용법을 위주로 좀 보고 있었다. markdown extentions n12br 그런느낌의 키워드로.

그러다가 동일한 공식사이트로 추정되는 곳에서 사용법을 써놨었는데, 나는 책에서 배우기로 extensions라는 변수에 n12br, fenced_code를 담아서 return의 extensions에 넣어주는 방식으로 배웠는데. 해당 사이트에서는 markdown.n12br 이런식으로 사용을 하더라.

그래서 "이렇게 디테일하게 안끊어줘서 안되는건가?"싶어서 타이핑을 하던 중, 뭔가 약간의 차이를 느꼈다.

책에서 봤을때는 n12br같이 보였는데 공식문서로 추정되는 사이트에서는 미세하게 1이 아니라 l(L의소문자)같았다

그래서 기존의 n12br이 아니라 -> nl2br(영문,영문,숫자,영문,영문)으로 변경해주니깐 잘 사용 되었다 ㅋㅋㅋ

 

휴... 거참..