无法从使用 PyInstaller 构建的 Kivy 应用程序中获取 lexers.PythonLexer()

Posted

技术标签:

【中文标题】无法从使用 PyInstaller 构建的 Kivy 应用程序中获取 lexers.PythonLexer()【英文标题】:Can't get lexers.PythonLexer() from Kivy app built with PyInstaller 【发布时间】:2014-07-12 03:38:35 【问题描述】:

我有一个运行良好的 Python 应用程序,我在其中执行以下操作:

from pygments import lexers

那么……

testing = lexers.PythonLexer()

只需运行脚本就可以了,我得到了 PythonLexer 的一个新实例。但是...当我使用 PyInstaller 为应用程序创建一个构建文件夹然后运行它时,该行失败:

文件“blah\myfile”,第 31 行,在 __init__ 中 AttributeError:“模块”对象没有属性“PythonLexer”

有什么想法吗?我认为这是因为 pygments 在运行时以某种方式从我的 PyInstaller 构建文件夹中缺少的一些文件构建其对象,但我不太明白如何。

该应用正在使用 Kivy,但实际上我认为这与此问题无关。

【问题讨论】:

【参考方案1】:

问题是包pygments.lexers 不包含名为PythonLexer.py 的文件。要解决问题,您可以这样做:

from pygments.lexers.agile import PythonLexer
testing = PythonLexer()

【讨论】:

这确实解决了这个问题。但是,我需要使用 PyInstaller 设置而不是通过编辑我的文件来解决这个问题(有问题的文件实际上不是我的,它在 Kivy 内部)。我希望 hook-pygments.lexers.py 文件涵盖了这一点,但默认的钩子文件已经包含 hiddenimports = ['agile', 'dotnet'] 所以我不明白为什么它不执行导入. 只想补充,我也遇到这个问题,无法解决。最终我摆脱了使用 rstwidget 和 codeinput 的 *.kv,并修改 main.py 以不显示源代码。 ... 再次在这里,回到自己的评论... :( 知道为什么 Kivy 应用程序找不到 PythonLexer 吗?我已经安装了这些:“sudo pip install pyglet docutils” 【参考方案2】:

您可以通过使用 PyInstaller 的一项建议来修复它,以包含未自动找到的模块。 http://pythonhosted.org/PyInstaller/#helping-pyinstaller-find-modules

【讨论】:

【参考方案3】:

我在使用pyinstaller打包Kivy的'showcase'演示应用时遇到了类似的问题。

这似乎是一个 Pygments 错误。

我打了\pygments\lexers\__init__.py之后,错误就消失了:

--- __init__old.py
+++ __init__.py
@@ -15,6 +15,7 @@
import fnmatch
from os.path import basename

+from pygments.lexers.agile import PythonLexer
from pygments.lexers._mapping import LEXERS
from pygments.modeline import get_filetype_from_buffer

【讨论】:

以上是关于无法从使用 PyInstaller 构建的 Kivy 应用程序中获取 lexers.PythonLexer()的主要内容,如果未能解决你的问题,请参考以下文章

使用 PyQt5 构建并由 pyinstaller 编译的 GUI 无法正常工作 [不重复] [重复]

Pyinstaller - “致命错误!将脚本转换为 exe 时无法执行脚本”

pyinstaller“无法解析样式表”

PyInstaller Winerror3:系统无法找到指定的路径

Pyinstaller 难以通过 Kivy 构建 FileChooserListView

如何使用pyinstaller打包32位的exe