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'
というメッセージが出てエラーとなった
実行コード
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)
---------------------------------------------------------------------------
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 を呼び出す事ができているのかを確認するためにインタプリタから下記を確認した。
import markdown
markdown.inlinepatterns
<module 'markdown.inlinepatterns' from '/usr/local/lib/python3.6/site-packages/markdown/inlinepatterns.py'>
markdown 自体は普通に import できていそう。という事で github のコードを読む
... どこにもエラーメッセージにある BRK
なんてないやんけ。そりゃ動かん。
エラー発生行の次の行の NOIMG
ってのはあったので、試しに markdown.inlinepatterns.NOIMG
を実行してみる。
markdown.inlinepatterns.NOIMG
'(?<!\\!)'
うん、動きますね。
py-gfm の問題というより、import markdown
時点で問題がありそうだ。
試しに markdown を再インストール。
$ pip3 install markdown
$ pip3 uninstall markdown
import markdown
markdown.inlinepatterns.BRK
---------------------------------------------------------------------------
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
の定義あり。
ブランチ指定して install すればうまく行くのではないかな。
pip3 uninstall markdown
pip3 install git+https://github.com/Python-Markdown/markdown.git@2.6
import markdown
markdown.inlinepatterns.BRK
'\\[([^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*(\\[[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*\\])*[^\\]\\[]*)\\]'
動いた。ということは最初の Quick start を再度実行すると...
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
%%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 を見せたい時など非常に便利そうです ☺️