【问题标题】:Redirect python interactive help()重定向python交互式帮助()
【发布时间】:2011-01-14 11:55:44
【问题描述】:

我正在为使用 Qt 的应用程序开发交互式 python shell。但是我似乎无法获得重定向的交互式帮助。我的python代码中有这个:

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

sys.stdout = OutputCatcher()

但是,当我运行 help() 时,它不会重定向交互式帮助,它只是将它转储到我运行 python 脚本的控制台。如果我在控制台中按 ctrl+c,它会将其发送到我的 OutputCatcher 对象。

我确实尝试了谷歌,但真的找不到任何东西。

【问题讨论】:

  • 代码应该在什么平台上运行?您需要在当前 Python 解释器中运行控制台,还是可以启动子进程?
  • 平台可以是 Linux、Windows 和 OSX,几乎任何东西 :)
  • 好的,我的第二个问题呢?仅在子进程中运行 Python 交互式解释器是否可行,还是需要从交互式解释器内部访问当前解释器变量?
  • 是的,我需要访问变量,它是一个更大的 C++ 项目的一部分。 python 控制台只允许访问项目的公共 API。

标签: python qt pyqt4


【解决方案1】:

无需猜测帮助的作用,只需阅读源代码即可。

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.stdinsys.stdout,但是(我怀疑这是您遇到问题的地方)它使用 stdin/stdout 的值pydoc 导入的时间,所以以后重新绑定它们不会有任何影响。

我建议您将内置帮助实例替换为您自己的 _Helper 类,该类使用您需要的任何文件显式创建新的 pydoc Helper。

【讨论】:

    【解决方案2】:

    帮助不只是转储到标准输出,而是与终端交互。它也永远不会在 shell 之外使用,因此不会编写它来保证这些东西可以工作。

    您正在尝试做的是实现一个终端,这是一项不平凡的任务,但可能存在用于 Qt 的终端仿真库。甚至可能是用 Python 编写的,而且肯定带有绑定。

    【讨论】:

    • python -c "help()" > file`为我将帮助转储到file - 所以它似乎确实与标准输出交互。它只是不使用sys.stdout,但你可以破解这个问题。我只是在等待 Nathan 回答我的问题 :)
    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多