Edited at

py-gfm (GithubFlavoredMarkdownExtension) が import できない時の対処法[Python3]

jupyter notebook 上で @driller 3 により公開されている tsumiki を試す過程で、py-gfm (GithubFlavoredMarkdownExtension) を import できない事象にあたったので対処した方法をまとめる


環境


  • MacOS High Sierra

  • Python 3.6.5


事象



  • https://pythonhosted.org/py-gfm/ で紹介されている Quick start のコードを実行しても module 'markdown.inlinepatterns' has no attribute 'BRK' というメッセージが出てエラーとなる


結論

pip3 uninstall markdown

pip3 install git+https://github.com/Python-Markdown/markdown.git@regex-fixes

のようにして、git branch を指定して markdown を再インストールすると上手くいった。


仮説・検証



  • https://pythonhosted.org/py-gfm/ で紹介されている Quick start のコードを下記のように実行しても module 'markdown.inlinepatterns' has no attribute 'BRK' というメッセージが出てエラーとなった

実行コード


python3

    import markdown

from mdx_gfm import GithubFlavoredMarkdownExtension

source = """
Hello, *world*! This is a ~~good~~marvelous day!
Here is an auto link: https://example.org/

Le me introduce you to [task lists] (https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments):

- [ ] eggs
- [x] milk

You can also have fenced code blocks:
```
import this
```
"""

# Direct conversion
html = markdown.markdown(source,
extensions=[GithubFlavoredMarkdownExtension()])

# Factory-like
md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension()])
html = md.convert(source)



result

    ---------------------------------------------------------------------------

ModuleNotFoundError Traceback (most recent call last)

<ipython-input-1-000efe484076> in <module>()
1 import markdown
----> 2 from mdx_gfm import GithubFlavoredMarkdownExtension
3
4 source = """
5 Hello, *world*! This is a ~~good~~marvelous day!

/usr/local/lib/python3.6/site-packages/mdx_gfm/__init__.py in <module>()
25 from markdown.extensions.nl2br import Nl2BrExtension
26
---> 27 from mdx_partial_gfm import PartialGithubFlavoredMarkdownExtension
28
29

/usr/local/lib/python3.6/site-packages/mdx_partial_gfm/__init__.py in <module>()
28 from markdown.extensions import Extension
29 from markdown.extensions.fenced_code import FencedCodeExtension
---> 30 from markdown.extensions.smart_strong import SmartEmphasisExtension
31 from markdown.extensions.tables import TableExtension
32

ModuleNotFoundError: No module named 'markdown.extensions.smart_strong'


まずは、py-gfm が markdown を呼び出す事ができているのかを確認するためにインタプリタから下記を確認した。


python3

import markdown

markdown.inlinepatterns



result

<module 'markdown.inlinepatterns' from '/usr/local/lib/python3.6/site-packages/markdown/inlinepatterns.py'>


markdown 自体は普通に import できていそう。という事で github のコードを読む

... どこにもエラーメッセージにある BRK なんてないやんけ。そりゃ動かん。

エラー発生行の次の行の NOIMG ってのはあったので、試しに markdown.inlinepatterns.NOIMG を実行してみる。


python3

markdown.inlinepatterns.NOIMG



result

'(?<!\\!)'


うん、動きますね。

py-gfm の問題というより、import markdown 時点で問題がありそうだ。

試しに markdown を再インストール。


bash

$ pip3 install markdown

$ pip3 uninstall markdown


python3

import markdown

markdown.inlinepatterns.BRK



result

    ---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

<ipython-input-2-58535ab67692> in <module>()
1 import markdown
2
----> 3 markdown.inlinepatterns.BRK

AttributeError: module 'markdown.inlinepatterns' has no attribute 'BRK'


ダメですね orz

別途気づいた所として github の 別ブランチには BRK の定義あり。

https://github.com/Python-Markdown/markdown/blob/2.6/markdown/inlinepatterns.py

ブランチ指定して install すればうまく行くのではないかな。

pip3 uninstall markdown

pip3 install git+https://github.com/Python-Markdown/markdown.git@2.6

import markdown

markdown.inlinepatterns.BRK

'\\[([^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*)\\]'

動いた。ということは最初の Quick start を再度実行すると...


python3

    import markdown

from mdx_gfm import GithubFlavoredMarkdownExtension

source = """
Hello, *world*! This is a ~~good~~marvelous day!
Here is an auto link: https://example.org/

Le me introduce you to [task lists] (https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments):

- [ ] eggs
- [x] milk

You can also have fenced code blocks:
```
import this
```
"""

# Direct conversion
html = markdown.markdown(source,
extensions=[GithubFlavoredMarkdownExtension()])

# Factory-like
md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension()])
html = md.convert(source)


-> エラー発生なし。とりあえず解決。


おまけ(tsumikiとは)

tsumikiとは先日の pycon 2018 に登壇された @driller 3 により公開されているライブラリで、jupyter notebook で Markdown と HTML を組み合わせて表示したり、段組にして表示したりする事ができます。


使用例

%load_ext tsumiki


jupyter-notebook_markdown_cell

%%tsumiki

:Markdown:
# Title

:HTML:::
<p>col0</p>
<font color="red">Red</font>
</br>
<font color="green">Green</font>

:Markdown:::
col1
* list1
* list2

:Markdown:::
col2
* list1
* list2


実行結果

装飾や、段組にして何かの diff を見せたい時など非常に便利そうです ☺️