python3 打印到字符串

问题描述 投票:0回答:3

使用 Python 3,我有一个控制台应用程序,我正在将其移植到 GUI。该代码有一堆打印语句,如下所示:

print(f1(), f2(), f3(), sep=getsep(), end=getend())

我想将这些调用转换为:

GuiPrintLine(f1(), f2(), f3(), sep=getsep(), end=getend())

每行最终都是使用一些(未定义的)GUI 框架渲染的。

如果我可以将 print 的参数转换为 print 通常生成的字符串,而不会产生实际打印到 sysout 的副作用,那么这很容易做到。换句话说,我需要一个这样的函数:

s = print_to_string(*args, **kwargs)

如何将 print(...) 的一组参数格式化为单个字符串,以产生与 print() 产生的输出相同的输出?

我意识到我可以通过将所有参数与 sep 和结尾连接起来来模拟打印,但我更愿意使用内置解决方案(如果有的话)。

使用打印和重定向 sysout 没有吸引力,因为它需要修改应用程序的全局状态,并且 sysout 可能同时用于其他诊断。

这在Python中似乎应该是微不足道的,所以也许我只是错过了一些明显的东西。

感谢您的帮助!

python string python-3.x stringio
3个回答
48
投票

通过字符串io找到答案。 有了这个,我不必模拟 Print 对 sep/end 的处理,甚至不必检查是否存在。

import io

def print_to_string(*args, **kwargs):
    output = io.StringIO()
    print(*args, file=output, **kwargs)
    contents = output.getvalue()
    output.close()
    return contents

0
投票

我的解决方案:

def print_to_string(*args, **kwargs):
    newstr = ""
    for a in args:
        newstr+=str(a)+' '
    return newstr

0
投票

只是为了通过上下文管理器提供 Brad 答案的更新版本,学分归他所有。

import io

def print_to_string(*args, **kwargs):
    with io.StringIO as output:
        print(*args, file=output, **kwargs)
        return output.getvalue()
© www.soinside.com 2019 - 2024. All rights reserved.