Что pyinstaller делает со «встроенными.help»

#python #pyinstaller

#python #pyinstaller

Вопрос:

Я пытаюсь создать простое интерактивное консольное приложение на Python с помощью PyInstaller.

Я хотел бы, чтобы была доступна Python help (), но, похоже, PyInstaller каким-то образом изменяет содержимое builtins и удаляет справку.

Вот простой скрипт, который открывает окно Python. Когда я запускаю этот скрипт непосредственно в командной строке Windows, я могу получить доступ help() из интерактивного сеанса.

 import code
        
code.InteractiveConsole().interact()
  

Однако, если я создам исполняемый файл с помощью

PyInstaller test.py

и запустите его, help недоступен. И когда я смотрю на содержимое builtins , я вижу, что оно не включено.

Я нахожусь в Windows 10, используя последнюю версию Python 3.8.

ОБНОВЛЕНИЕ: Благодаря предложению Нико, приведенному ниже, следующий код восстанавливает встроенные quit() , exit() и copyright() функции, которые были удалены pyinstaller.

 import code

import builtins
if not hasattr(builtins,'help'):
    import _sitebuiltins

    if os.sep == '\':
        eof = 'Ctrl-Z plus Return'
    else:
        eof = 'Ctrl-D (i.e. EOF)'

    builtins.quit = _sitebuiltins.Quitter('quit', eof)
    builtins.exit = _sitebuiltins.Quitter('exit', eof)
        
    builtins.help = _sitebuiltins._Helper()

    builtins.copyright = _sitebuiltins._Printer("copyright", sys.copyright)   
    
code.InteractiveConsole().interact()
  

Комментарии:

1. Если ответ помог, рекомендуется не только принять его, но и поддержать его и полезные ответы других пользователей. =)

Ответ №1:

Это из-за подделки site.py который использует PyInstaller — он также нарушает функцию quit () и license в интерактивной оболочке. Вам нужно немного изменить его, добавив следующий код в конце (заимствованный из исходных текстов CPython 3.7):

 import os
import sys
import builtins
import _sitebuiltins


def setquit():
    """Define new builtins 'quit' and 'exit'.
    These are objects which make the interpreter exit when called.
    The repr of each object contains a hint at how it works.
    """
    if os.sep == '\':
        eof = 'Ctrl-Z plus Return'
    else:
        eof = 'Ctrl-D (i.e. EOF)'

    builtins.quit = _sitebuiltins.Quitter('quit', eof)
    builtins.exit = _sitebuiltins.Quitter('exit', eof)


def sethelper():
    builtins.help = _sitebuiltins._Helper()

def main():
    """Add standard site-specific directories to the module search path.
    This function is called automatically when this module is imported,
    unless the python interpreter was started with the -S flag.
    """   
    setquit()
    sethelper()    


main()  
  

Я использую эти изменения для создания двоичных файлов web2py / py4web с рабочей интерактивной оболочкой (при необходимости смотрите Мои репозитории github).

Комментарии:

1. Обычно рекомендуется избегать добавления гиперссылок к вашему ответу, если вы можете просто добавить соответствующую часть кода сюда.

2. Вы правы, я не делаю этого обычно. В принципе, вы должны добавить на поддельный сайт py из PyInstaller соответствующие функции из того же модуля на официальном python.org программа.

3. Тем не менее, вам следует поместить соответствующую часть кода здесь, если вы хотите увеличить свои шансы на принятие вашего ответа и избежать отрицательных голосов.

4. Я последовал вашим предложениям, отредактировав исходное сообщение 😉