Pyinstaller and Python-Markdown - ImportError: no module named 'extra'

Pyinstaller and Python-Markdown - ImportError: no module named 'extra'

我 运行 遇到一个问题,试图让 python-markdown 在 pyinstaller 中工作。我有这段代码来演示名为 test.py:

的文件中的问题
import markdown

testMarkdown = "blahdy blah blah"
print(markdown.markdown(testMarkdown))
print(markdown.markdown(testMarkdown, extensions=["extra"]))

当我 运行 使用 python3 时,我得到了所需的:

(venv) C:\Users\madgrizzle>python3 test.py
<p>blahdy blah blah</p>
<p>blahdy blah blah</p>

我运行pyinstaller如下:

(venv) C:\Users\madgrizzle>pyinstaller test.py

和 运行 结果代码,我得到以下内容:

(venv) C:\Users\madgrizzle\dist\test>test
<p>blahdy blah blah</p>
Traceback (most recent call last):
  File "test.py", line 5, in <module>
  File "lib\site-packages\markdown\core.py", line 390, in markdown
  File "lib\site-packages\markdown\core.py", line 100, in __init__
  File "lib\site-packages\markdown\core.py", line 126, in registerExtensions
  File "lib\site-packages\markdown\core.py", line 166, in build_extension
  File "importlib\__init__.py", line 126, in import_module
  File "<frozen importlib._bootstrap>", line 985, in _gcd_import
  File "<frozen importlib._bootstrap>", line 968, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
ImportError: No module named 'extra'
[14432] Failed to execute script test

我尝试使用以下方法重建:

(venv) C:\Users\madgrizzle>pyinstaller --hidden-import="markdown.extensions.extra" test.py

但我收到相同的错误消息。

包含 markdown 扩展需要什么特别的东西吗?

附加信息:

看来问题可能是 'extra' 扩展。每 https://python-markdown.github.io/extensions/extra/,'extra' 是多个扩展的汇编,包括 fenced_code 和表格。如果我只是尝试单独使用表扩展,pyinstaller 工作 IF 我使用全名如下:

markdown.markdown(testMarkdown, extensions=["markdown.extensions.tables"])

如果我不使用 'markdown.extensions.tables' 而使用 'markdown.extensions.extra',使用 pyinstaller 编译,然后 运行 它,它会返回缺少的 "fenced_code" 模块。基本上,我似乎必须避免使用 pyinstaller 'extra'。

extratable 等扩展的简称是 setuptools 入口点。我预计 pyinstaller 不能很好地处理入口点。因此,您需要为所有扩展使用完整的可导入字符串名称。

但是,由于 extra 在内部使用短名称,这意味着您不能使用 extra。您需要通过完整的可导入字符串名称分别调用每个嵌套扩展:

markdown.markdown(
    testMarkdown, 
    extensions=[
        "markdown.extensions.abbr", 
        "markdown.extensions.attr_list", 
        "markdown.extensions.def_list", 
        "markdown.extensions.fenced_code", 
        "markdown.extensions.footnotes", 
        "markdown.extensions.tables"
    ]
)

唯一的问题是您不会获得任何 extra 特定行为。但是,当 3.2 版发布时,更改 here 将可用,您可以将 markdown.extensions.md_in_html 添加到扩展列表中。到那时,您将获得所有 extra,而根本不需要包含 extra