1

我在尝试让 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

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

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

附加信息:

似乎“额外”扩展名可能会导致问题。根据https://python-markdown.github.io/extensions/extra/,“extra”是多个扩展的编译,包括 fenced_code 和表格。如果我只是尝试单独使用表扩展名,那么如果我使用全名,pyinstaller 就可以工作,如下所示:

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

如果我不使用“markdown.extensions.tables”,而是使用“markdown.extensions.extra”,使用 pyinstaller 编译并运行它,它会以缺少的“fenced_code”模块作为响应。基本上,似乎我必须避免使用 pyinstaller 进行“额外”操作。

4

1 回答 1

1

扩展的简称,例如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 发布时,此处的更改将可用,您可以添加markdown.extensions.md_in_html到扩展列表中。那时,您将获得所有内容,而根本extra不需要包括在内extra

于 2019-11-26T16:45:31.760 回答