Перенаправить интерактивную справку Python () - PullRequest
4 голосов
/ 14 января 2011

Я работаю над интерактивной оболочкой python для приложения, использующего Qt. Однако я не могу получить интерактивную помощь для перенаправления. У меня есть это в моем коде Python:

class OutputCatcher:
    def __init__(self):
        self.data = ''
    def write(self, stuff):
        self.data += stuff

sys.stdout = OutputCatcher()

Однако, когда я запускаю help (), он не перенаправляет интерактивную справку, а просто выдает ее на консоль, из которой я запускал скрипт python. Если я нажимаю ctrl + c в консоли, он отправляет его моему объекту OutputCatcher.

Я попробовал Google, но ничего не смог найти.

Ответы [ 2 ]

2 голосов
/ 14 января 2011

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

То, что вы пытаетесь сделать, это реализовать терминал, и это нетривиальная задача, но, возможно, существуют библиотеки эмуляции терминала для Qt.Возможно даже написано на Python и, конечно, с привязками.

1 голос
/ 14 января 2011

Нет необходимости догадываться, что делает помощь, просто прочитайте источник.

Встроенный help - это создать в site.py, это экземпляр класса _Helper. При вызове он просто передает вызов через pydoc.help(...) источник, для которого вы найдете pydoc.py.

class _Helper(object):
    """Define the built-in 'help'.
    This is a wrapper around pydoc.help (with a twist).

    """

    def __repr__(self):
        return "Type help() for interactive help, " \
               "or help(object) for help about object."
    def __call__(self, *args, **kwds):
        import pydoc
        return pydoc.help(*args, **kwds)

pydoc.help является экземпляром pydoc.Helper с входом / выходом, установленным на sys.stdin, sys.stdout, но (и я подозреваю, что именно здесь у вас возникла проблема) он использует значение stdin / stdout на время импорта pydoc, поэтому последующее их связывание не будет иметь никакого эффекта.

Я предлагаю вам заменить встроенный экземпляр справки своим собственным классом _Helper, который явно создает свежий помощник pydoc с любыми необходимыми файлами.

...