【问题标题】:How can I force print whatever is written on the console?如何强制打印控制台上写的任何内容?
【发布时间】:2018-05-17 09:04:44
【问题描述】:

我正在尝试构建一段代码,它可以打印出控制台上写的任何内容,但仍会执行一个人在上面写的任何内容。例如:

我有这个功能:

def create_set():
    return []

每当有人在控制台中输入:c = create_set()。我希望程序创建集合并打印出字符串"c = create_set()"

我该怎么做?一些帮助将不胜感激

【问题讨论】:

  • “控制台”是什么意思?您是否尝试修改 REPL?
  • 例如,当您在 Python 控制台中打开一个 Python 文件时,假设您在该文件上有函数,当您调用这些函数时,我想将该调用打印为字符串,并且仍然允许程序执行该调用。附言我可以在每个函数上加上一个print("function name"),但这不是我希望程序做的事情。
  • @Daniel:您是否正在寻找pdb 工具?
  • @DanielPryden 不完全是,我只想要一段代码,每当进行某些调用时,它会准确打印出输入的内容,并且仍然执行它应该执行的任何操作。
  • @Daniel:如果您使用调试器执行,您可以在感兴趣的代码上设置断点并转储任何局部变量。我很确定这会解决您的问题,并且根本不需要您编写任何代码。

标签: python


【解决方案1】:

您可以编写一个装饰器来执行此操作,但您必须手动将其添加到每个方法中,或者在模块 __dict__ 中做一些魔术(我不推荐)。这在 python 3.6 中有效(我对其进行了测试),如果您使用它在 python 2.7 中的注释版本。他们将 stack 签名从 2.X 更改为 3.X。

from inspect import stack
from functools import wraps

def printer(f):
     @wraps(f)
     def wrapped(*args, **kwargs):
         call_info = stack()[1].code_context  # In Python 2.7.X, replace with stack()[1][4]
         # Use index 1 because 0 is always this wrapper function
         for context in call_info:
             print(context.strip())

         return f(*args, **kwargs)
     return wrapped

像这样使用它:

@printer
def test():
    return 5

x = test()

这会将x = test()打印到标准输出。如果你想用它来调试,那完全没问题,但如果这是你的代码在生产中依赖的东西,我不推荐它,因为它会影响你的性能,例如见here。

【讨论】:

  • 是的,这是为了调试,我有点绝望。所以我只是将它添加到文件中?
  • 它给了我一个错误:Traceback (most recent call last): File "<input>", line 1, in <module> File "<input>", line 9, in wrapped TypeError: 'NoneType' object is not iterable 第 9 行是:for context in call_info:
  • 您在现场环境中使用它吗?我刚刚在 IPython 和一个文件中再次尝试了它,它适用于我的 Python 3.6.2
  • 例如我在pycharm中使用它
  • 我评论了如何在 python 2 中使用它
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2015-12-11
  • 2021-11-16
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多