Python 모듈 이름 알아내기
혹시나 어떤 의존성을 설치하고 import로 쓰려고 하는데 이름을 알 수 없는 경우가 있다면 어떻게 찾아야 할까? 간단히 알아보자.
이 글을 적게 된 발단
발단은 마크다운 모듈에서 매크로 기능을 알아보던 중 일어났다. markdown_macros
라는 모듈이 마음에 들어서 설치를 해봤다.
pip install markdown_macros
설치는 잘 끝났다.
문제는 공식 예제 코드를 거의 그대로 복사한 코드가 동작하지 않았다는 데 있다. 문제의 코드는 아래 부분이다.
from markdown_macros import MacroExtension
어처구니 없게도 모듈 사용의 시작점에 해당하는 import 단계에서 아래와 같은 오류가 발생하고 있었다.
ModuleNotFoundError: No module named 'markdown_macros'
정말 어처구니가 없었다. 이건 공식 예제가 아니었던 걸까? 아니면 내가 뭔가 착각하고 있는 것일까?
공식 사이트에서는 별다른 이슈나 언급이 없었다. 도대체 뭘까? 어떻게 된 일일까?
해답: 모듈의 정확한 이름 알아내기
혹시나 markdown_macros
의 설치된 실제 모듈 이름을 알고 싶어한다면 답은 mdx_macros
라는 좀 다른 것이라는 점을 먼저 밝힌다.
이것을 찾는 과정은 순탄치 않았지만 결론적으로 아래 커맨드로 확인할 수 있었다.
pydoc modules
이 커맨드를 입력하면 방대한 모듈 목록이 나열된다. 아래는 실제 출력 결과의 내용들 중 불필요한 일부를 생략한 것이다.
$ pydoc modules
Please wait a moment while I gather a list of all available modules...
test_sqlite3: testing with SQLite version 3.45.2
__future__ _testmultiphase graphlib rlcompleter
...
_datetime bisect markdown subprocess
_dbm builtins markupsafe sunau
_decimal bz2 marshal symtable
_elementtree cProfile math sys
_functools calendar mdx_macros sysconfig
...
_testinternalcapi glob resource
결국 여기서 mdx_macros
라는 이름을 찾았고 혹시나해서 import해서 dir
로 확인해보니 원하는 모듈임을 확인할 수 있었다.
>>> import mdx_macros
>>> dir(mdx_macros)
[ ... 'MacroExtension', ...]
...
으로 표시한 부분은 불필요해서 생략했다는 것에 주의하자.
어쨌든 이런 식으로 문제가 무엇이고 어떻게 해결할 수 있는지 알 수 있게 되었다.
참고로 파이썬 패키지 목록을 구할 수 있는 방법은 여러가지지만, 패키지 이름이 아닌 실제로 import 해야 하는 모듈 명은 알아내는 것은 pydoc을 이용하는 방법이 유용했다.
이 외에 다른 방법도 하나 있는데 help 커맨드를 이용하는 방법이다.
$ python -c 'help("modules")'
위 커맨드는 위의 pydoc의 실행 결과와 동일한 내용을 출력한다. 단지 커맨드라인에서는 pydoc을 쓰는 방법이 명령어가 짧아서 편했다는 차이가 있을 것 같다. 하지만 만약 python REPL에서 확인하려면 help 커맨드를 쓰는 것이 더 편할 것 같다.
추신
참고로 이 markdown_macros
패키지는 이름이 비슷한 하지만 전혀 다른 두 모듈이 존재해서 착각해서 발생한 문제였다. pip에서 search 커맨드를 지원하지 않으니 이런 오해가 종종 발생할 수도 있는 듯하다.
참고로 하나 더 말하자면 이 모듈과 이름이 비슷한 다른 모듈 둘 다 현재는 개인적으로 쓰지 않는다. 아무래도 더이상 유지보수 되지 않아써 뭔가 써먹기가 힘든 것 같아서 직접 다른 방식으로 구현했다.