我有一个非常简单的Python程序,它使用“brized”。它可以与win10python解释器一起工作,但是在与Pyinstaller打包时会报告错误,并且忽略终端控制代码。代码如下:
from blessed import Terminal
t = Terminal()
print(t.bright_green('Hello world'))
字符串“Hello world”应该以亮绿色显示在控制台上。Pyinstaller完成,没有错误,当我运行.exe时,会收到以下消息:
terminal.py:222: UserWarning: Failed to setupterm(kind='vtwin10'): Could not find terminal vtwin10
然后“Hello world”以默认的终端颜色显示。你知道吗
看起来Pyinstaller在构建中没有包含解释器发现的没有问题的东西。我在Anaconda3安装文件夹中找到了一个vtwin10.py文件,位于:
C:\Anaconda3\Lib\site-packages\jinxed\terminfo
我查看了神圣图书馆的终端.py文件。代码如下:
try:
curses.setupterm(self._kind, self._init_descriptor)
except curses.error as err:
warnings.warn('Failed to setupterm(kind={0!r}): {1}'
.format(self._kind, err))
所以它看起来像self.u kind被设置为“vtwin10”。中存在条件导入终端.py看起来是这样的:
if platform.system() == 'Windows':
import jinxed as curses # pylint: disable=import-error
HAS_TTY = True
(我很幽默)看起来像是在代码中显式导入了jinxed包,并替换了curses包。但不知怎么的,vtwin10的定义丢失了。你知道吗
我在jinxed中找到了setupterm(),并深入研究了错误消息的来源。在这个代码中:
try:
self.terminfo = importlib.import_module('jinxed.terminfo.%s' % term.replace('-', '_'))
except ImportError:
raise error('Could not find terminal %s' % term)
这就是我被卡住的地方。看起来这段代码在jinxed库中找不到vtwin10.py文件。有人知道如何强制Pyinstaller包含vtwin10终端定义的诅咒吗?我猜这就是问题所在。你知道吗
非常感谢。你知道吗
终于弄明白了。在jinxed库中,代码行:
动态加载库模块。Pyinstaller无法动态打包导入的模块。所以要解决这个问题,我需要使用hidden import选项指定模块。语法如下:
程序就像在解释器中一样工作。这是可行的,但我担心这会破坏
jinxed
本应具有的任何平台独立性。我可以强制导入vtwin10.py
模块,它将在win10
平台上工作。但是以jinxed
的编写方式,它会找出windows平台,然后动态加载所需的terminfo
模块。在jinxed.terminfo
目录中有很多。hidden-import
的通配符不起作用,因此唯一的选择是对jinxed.terminfo
文件夹中的每个文件使用hidden-import
。你知道吗相关问题 更多 >
编程相关推荐