【问题标题】:Freeze a Python `click` application with subcommands using PyInstaller使用 PyInstaller 冻结带有子命令的 Python `click` 应用程序
【发布时间】:2019-10-15 13:05:27
【问题描述】:

我希望使用PyInstaller 冻结使用click 制作的Python CLI。

我发现 this answer 使它可以与点击命令一起使用,不幸的是它不适用于带有子命令的应用程序。

我有以下代码来演示这个问题:

在 cli.py 中

import sys

import click


@click.group()
def bar():
    pass


@bar.command()
def baz():
    click.echo('yo')


if __name__ == "__main__":
    if getattr(sys, 'frozen', False):
        bar(sys.argv[1:])
    else:
        bar()

我运行以下pyinstaller 命令: pyinstaller --noconfirm --name bar --clean "cli.py"

我得到以下输出:

Traceback (most recent call last):
  File "tests\bar\cli.py", line 18, in <module>
  File "click\core.py", line 722, in __call__
  File "click\core.py", line 696, in main
  File "click\core.py", line 621, in make_context
  File "click\core.py", line 1015, in parse_args
  File "click\utils.py", line 259, in echo
  File "click\_compat.py", line 577, in _safe_write
  File "colorama\ansitowin32.py", line 40, in write
  File "colorama\ansitowin32.py", line 141, in write
  File "colorama\ansitowin32.py", line 169, in write_and_convert
  File "colorama\ansitowin32.py", line 174, in write_plain_text
  File "click\_winconsole.py", line 180, in write
  File "click\_compat.py", line 63, in write
  File "click\_winconsole.py", line 164, in write
OSError: Windows error 6
[173704] Failed to execute script cli

我在 Windows 10 操作系统上使用 Python 2.7.13。

由于我的工作环境,我无法尝试py2execx-Freezebriefcase 等。

之前有没有其他人偶然发现过这个问题?

我会尝试使用 argparse 看看是否遇到同样的问题。

【问题讨论】:

  • 它正在尝试打印帮助。 Windows 错误 6 是文件句柄无效。你的 colorama 几岁(什么版本)?
  • 感谢您的关注。我在 colorama 0.3.9。我尝试升级到0.4.1,但仍然有同样的错误。我也试过argparse,没有错误。我想这是因为argparse 没有颜色处理?
  • 是的,使用该堆栈跟踪,在冻结时似乎与 Windows 10 中的颜色处理不兼容。我还怀疑(调查)即将过时的 Python 版本可能会导致一些问题。
  • 抱歉回复晚了,我已经做了一些更多的测试。我找到了this issue,其中详细介绍了一些解决方法,不幸的是没有一个对我有用,我暂时使用 argparse。感谢您的宝贵时间!

标签: python python-2.7 pyinstaller python-click


【解决方案1】:

因此,经过更多调查,Windows 10、Python 2.7.x 和 kernel32.WriteConsoleW 似乎对 pyinstaller 来说不是好兆头。

具体来说,我发现了一个similar issue on pyinstaller's github,其中一些人详细介绍了称为自下而上 ASLR 的高熵的 Windows 功能的行为。

因此,此链接中建议了 3 种解决方案或解决方法:

  • 安装、导入和enable()win_unicode_console
  • 对生成的可执行属性禁用高熵。
  • 升级到 Python 3。

查看链接了解更多详情,这对我来说都是黑魔法。

很遗憾,我无法升级到 Python 3,找不到高熵设置,并且 win_unicode_console 技巧不起作用,所以我会坚持使用 argparse。

如果可能,最好的解决方案是升级到 Python 3。

感谢斯蒂芬的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多