我正在使用对对象执行某些操作的Python库
do_something(my_object)
并更改它。这样做时,它会向stdout打印一些统计信息,我希望掌握这些信息。正确的解决方案是更改do_something()
以返回相关信息,
out = do_something(my_object)
但是开发人员需要一段时间才能do_something()
解决此问题。作为一种解决方法,我考虑过解析do_something()
对stdout的任何写入。
如何捕获代码中两点之间的stdout输出,例如
start_capturing()
do_something(my_object)
out = end_capturing()
?
试试这个上下文管理器:
from io import StringIO
import sys
class Capturing(list):
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._stringio = StringIO()
return self
def __exit__(self, *args):
self.extend(self._stringio.getvalue().splitlines())
del self._stringio # free up some memory
sys.stdout = self._stdout
用法:
with Capturing() as output:
do_something(my_object)
output
现在是一个包含函数调用打印的行的列表。
高级用法:
可能不明显的是,此操作可以执行一次以上,并将结果连接在一起:
with Capturing() as output:
print('hello world')
print('displays on screen')
with Capturing(output) as output: # note the constructor argument
print('hello world2')
print('done')
print('output:', output)
输出:
displays on screen
done
output: ['hello world', 'hello world2']
更新
:它们已添加redirect_stdout()
到contextlib
Python
3.4中(以及redirect_stderr()
)。因此,您可以使用io.StringIO
它来达到类似的结果(尽管Capturing
列表和上下文管理器可能更方便)。
问题内容: 在客户端计算机上遇到网络问题时,我希望能够运行一些命令行并将其结果通过电子邮件发送给我自己。 我发现Runtime.exec将允许我执行任意命令,但是将结果收集到String中会更有趣。 我意识到我可以将输出重定向到文件,然后从文件中读取,但是我的幻想是告诉我,有一种更优雅的方法。 有什么建议吗? 问题答案: 你需要在此过程中同时捕获标准输出和标准错误。然后,你可以将std写出到文件/
问题内容: 由于某些其他原因,我使用的c ++共享库将一些文本输出到标准输出。在python中,我想捕获输出并 保存到一个变量中 。关于重定向标准输出,还有许多类似的问题,但在我的代码中不起作用。 在第5行中, func() 将调用共享库,共享库生成的文本仍输出到控制台!如果将 func() 更改 为print“ hello” ,则可以使用! 我的问题是: 如何将c ++共享库的stdout捕获
问题内容: 例如,在Python中,我可以执行以下操作: 您可以在Go中执行此操作吗? 问题答案: 我同意,只要可以管理,就应该使用这些功能。但是,如果您不控制要捕获其输出的代码,则可能没有该选项。 Mostafa的答案有效,但是如果您想在没有临时文件的情况下进行操作,则可以使用os.Pipe。这是一个与Mostafa等效的示例,其中一些代码受Go的测试包的启发。
问题内容: 我试图用Python编写程序,并被告知运行.exe文件。运行此.exe文件时,它会吐出大量数据,并且我需要在屏幕上打印出一定的行。我很确定我需要使用或类似的东西,但是我是子处理的新手,没有任何线索。有人有简单的方法让我完成此工作吗? 问题答案: 像这样:
问题内容: 我想在Windows中使用rsync.exe,并在Python中打印标准输出。 我的代码可以运行,但是直到文件传输完成后才能捕获进度!我想实时打印每个文件的进度。 既然我听说使用Python 3.1,现在应该会更好地处理IO。 问题答案: 一些经验法则。 永远不要使用。它不必要地调用额外的shell进程来调用您的程序。 调用进程时,参数作为列表传递。sys.argv在python中是一
问题内容: 我正在调用在控制台/标准输出中打印一些字符串的函数。我需要捕获此字符串。我无法修改执行打印的功能,也无法通过继承更改运行时行为。我找不到任何允许我执行此操作的预定义方法。 JVM是否存储打印内容的缓冲区? 有谁知道可以帮助我的Java方法吗? 问题答案: 您可以使用写入字符串缓冲区的流临时替换System.err或System.out。