Остановите приложение Python `click` с помощью подкоманд с помощью PyInstaller - PullRequest
0 голосов
/ 15 октября 2019

Я надеялся заморозить Python CLI с click, используя PyInstaller .

Я нашел этот ответ , что делает егоработать с командами щелчка, к сожалению, это не работает для приложений с подкомандами.

У меня есть следующий код для демонстрации проблемы:

In 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

Я использую Python 2.7.13 в ОС Windows 10.

Я не могу попробовать py2exe, cx-Freeze, briefcase или лайки из-за моей рабочей среды.

Кто-то еще сталкивался с этой проблемой раньше?

Я попробую с argparse проверить, не возникла ли у меня такая же проблема.

1 Ответ

1 голос
/ 17 октября 2019

Итак, после еще одного расследования кажется, что Windows 10, Python 2.7.x и kernel32.WriteConsoleW не сулят ничего хорошего для pyinstaller.

В частности, я обнаружил похожую проблему на pyinstallergithub , в котором некоторые люди подробно описывают поведение функции Windows, известной как высокая энтропия для восходящей ASLR.

Таким образом, по этой ссылке предлагается 3 решения или обходных пути:

  • Установка, импорт и enable() win_unicode_console.
  • Отключение высокой энтропии для сгенерированных исполняемых свойств.
  • Обновление до Python 3.

Проверкассылка для более подробной информации, для меня все это черная магия.

К сожалению, я не могу перейти на Python 3, не могу найти параметр высокой энтропии, и трюк win_unicode_console не сработал, поэтому я 'Придерживаюсь argparse.

Лучшим решением будет обновление до Python 3.

Спасибо Стивену за вашу помощь!

...