祝福/诅咒控件不适用于Pyinstaller。缺少vtwin10

2024-10-03 11:12:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常简单的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终端定义的诅咒吗?我猜这就是问题所在。你知道吗

非常感谢。你知道吗


Tags: 代码pyimportself终端helloworld错误
1条回答
网友
1楼 · 发布于 2024-10-03 11:12:07

终于弄明白了。在jinxed库中,代码行:

importlib.import_module('jinxed.terminfo.%s' % term.replace('-', '_'))

动态加载库模块。Pyinstaller无法动态打包导入的模块。所以要解决这个问题,我需要使用hidden import选项指定模块。语法如下:

pyinstaller  hidden-import=jinxed.terminfo.vtwin10  onefile test.py

程序就像在解释器中一样工作。这是可行的,但我担心这会破坏jinxed本应具有的任何平台独立性。我可以强制导入vtwin10.py模块,它将在win10平台上工作。但是以jinxed的编写方式,它会找出windows平台,然后动态加载所需的terminfo模块。在jinxed.terminfo目录中有很多。 hidden-import的通配符不起作用,因此唯一的选择是对jinxed.terminfo文件夹中的每个文件使用 hidden-import。你知道吗

相关问题 更多 >