- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经编写了一些单元测试来分析使用标准 python 日志记录功能记录的数据。使用我在这里找到的一些想法:Capture stdout from a script in Python关于如何从 stderr 捕获数据,我想出了以下脚本,我已将其简化到最低限度以说明我遇到的问题。 (下面的循环模拟了这个函数可能被各种单元测试调用的事实)
import logging, sys
from StringIO import StringIO
def get_stderr():
saved_stderr = sys.stderr
stderr_string_io = StringIO()
sys.stderr = stderr_string_io
try:
logging.error("Foobar!!!")
finally:
# set the stdout and stderr back to their original values
sys.stderr = saved_stderr
err_output = stderr_string_io.getvalue()
return err_output
for x in [1, 2]:
err_output = get_stderr()
print "Run %d: %s" % (x, err_output)
如果您运行该脚本,它将给出以下输出,其中第二次循环迭代的日志输出完全丢失:
Run 1: ERROR:root:Foobar!!!
Run 2:
Process finished with exit code 0
虽然我希望它能提供以下输出:
Run 1: ERROR:root:Foobar!!!
Run 2: ERROR:root:Foobar!!!
Process finished with exit code 0
注意:在函数末尾执行 stderr_string_io.close()
不起作用,因为脚本会在下次执行该函数时抛出 ValueError
.
为什么这段代码没有按预期运行,解决这个问题的解决方案是什么?
最佳答案
当你打电话时
logging.error
运行
def error(msg, *args, **kwargs):
if len(root.handlers) == 0:
basicConfig()
root.error(msg, *args, **kwargs)
由于开始时没有根处理程序,它运行 basicConfig
时不带任何参数,这会:
def basicConfig():
_acquireLock()
try:
if len(root.handlers) == 0:
h = StreamHandler(None)
handlers = [h]
dfs = None
style = '%'
fs = kwargs.get("format", _STYLES[style][1])
fmt = Formatter(fs, dfs, style)
for h in handlers:
if h.formatter is None:
h.setFormatter(fmt)
root.addHandler(h)
finally:
_releaseLock()
我删除了没有参数时无法运行的代码。
所以这设置了handlers = [StreamHandler(None)]
:
class StreamHandler(Handler):
def __init__(self, stream=None):
Handler.__init__(self)
if stream is None:
stream = sys.stderr
self.stream = stream
这意味着您将顶级记录器永久附加到您调用它时 stdout
的任何内容。
这会导致您的问题,因为您丢弃了该输出。这意味着输出将转到死的 StringIO 对象,并丢失。
处理此问题的一种方法是在更新 stderr
时通过 handlers
并替换任何引用 stderr
的内容:
import logging, sys
from StringIO import StringIO
def get_stderr():
saved_stderr = sys.stderr
stderr_string_io = StringIO()
for handler in logging.root.handlers:
if handler.stream is sys.stderr:
handler.stream = stderr_string_io
sys.stderr = stderr_string_io
try:
logging.error("Foobar!!!")
finally:
# set the stdout and stderr back to their original values
for handler in logging.root.handlers:
if handler.stream is sys.stderr:
handler.stream = saved_stderr
sys.stderr = saved_stderr
err_output = stderr_string_io.getvalue()
return err_output
for x in [1, 2]:
err_output = get_stderr()
print "Run %d: %s" % (x, err_output)
我不知道这会有多好。它也不会捕获任何不是根记录器的记录器。就个人而言,按值捕获 sys.stdout
的想法是荒谬的,这似乎是不可避免的结果。
关于Python StringIO 没有正确地从 stderr 捕获数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25989123/
我正在使用 python 的 csv.DictReader 但我正在用这样的字符串初始化它: dict_reader = csv.DictReader(StringIO.StringIO(some_s
我已经用谷歌搜索并在 SO 上搜索这些缓冲区模块之间的区别。不过,我还是不是很明白,我觉得我看的一些帖子已经过时了。 在 Python 2.7.11 中,我使用 r = requests.get(ur
在我的模型中,我想通过覆盖保存方法来格式化图像字段 我在我的模型中做到了这一点 from PIL import Image as Img from io import StringIO from dj
我正在使用 Boost 的序列化库序列化大量数据以通过网络发送。 Boost 的序列化库需要一个中间文件来进行序列化和反序列化。传输的数据量使得执行所有这些操作变得很尴尬。将事情保存在内存中会好得多。
StringIO 是我们在从文本中读取 Pandas 数据帧时使用的类似文件的字符串缓冲区对象,例如"How to create a Pandas DataFrame from a string?"
我在使用这两个类时得到了不同的结果。 In [15]: StringIO.StringIO().write(u'\u2222') In [16]: cStringIO.StringIO().write
所以,我关注了this question为了得到一些声音播放 Music21 ,这是代码: from music21 import * import random def main(): # Set
显然,我是 Python 的新手。 我想在下面的代码中使用 StringIO :提取 example.xml import os os.chdir('d:/py/xml/') from lxml i
我只是无法让 StreamHandler 与 StringIO 一起工作以接受来自进程的日志记录。奇怪的是,到 stdout 的流工作得很好。 这是我的代码: from time import sle
我们正在使用一些我们没有源代码的编译Python代码。该代码提示用户输入,我们正在尝试自动化该部分。 基本上要求输入用户名、密码,然后根据特定情况询问一些不同的问题。我不知道编译后的函数是使用raw_
我正在使用以下代码在线检索图像: import Image import urllib2 import cStringIO url = 'http://storage.googleapis.com/b
尝试[ see it running here ]: from sys import stdout, stderr from cStringIO import StringIO from loggin
我在使用 Ruby 的 StringIO 类时观察到一些非常奇怪的行为。 在 irb 控制台中输入以下内容: 2.3.0 :002 > original_string = 'test' => "te
如何在 StringIO 中用另一个字符串替换字符串? - 我听说如果它们的长度相同是可能的。 尝试: from cStringIO import StringIO c = 'can\nhaz\nfo
我似乎得到了不同的输出: from StringIO import * file = open('1.bmp', 'r') print file.read(), '\n' print StringIO
在 Python 中,我有一个文件流,我想将它的一部分复制到 StringIO 中。我希望它尽可能快,副本最少。 但如果我这样做: data = file.read(SIZE) stream = St
我正在寻找一些 StringIO -类似的类,它允许我从我的程序的不同部分同时写入和读取。 从程序的一部分我想将字符写入(追加)到缓冲区,从另一部分我想读取它们。 StringIO 的问题如下: bu
我有 python 3.6。我想从另一个名为“run.py”的 python 文件执行名为“operation.py”的 python 文件。 在 operation.py 中,我执行 from cS
我刚刚开始使用 Django 和 Python,正在尝试构建一个照片应用程序。该脚本正在生成缩略图,我想自己做。不幸的是我不明白 StringIO() 正在做什么。在这种情况下,Python 文档对我
我正在尝试使用将 rml 转换为 pdf, import cStringIO buf = cStringIO.StringIO() rml2pdf.go(rml, outputFileName=buf
我是一名优秀的程序员,十分优秀!