当前位置: 首页 > 知识库问答 >
问题:

将所有stdout存储到文件中,同时仍在屏幕上显示

聂琨
2023-03-14
import sys

some_list = ['elem1', 'elem2']

for elem in some_list:

    sys.stdout = open(elem + '.log', 'w')

    # Do lots of stuff that print messages.
    print 'lots of stuff for', elem

print 'Code finished'
elem1.log
lots of stuff for elem1

elem2.log
lots of stuff for elem2
Code finished

共有1个答案

越涵衍
2023-03-14

包装很性感

import sys

class Logger(file):
    def __init__(self,*a,**kw):
        # copy original stdout to instance
        self.stdout = sys.stdout
        return super(Logger,self).__init__(*a,**kw)

    def write(self,data):
        self.stdout.write(data) # to screen
        return super(Logger,self).write(data) #to file

    def writelines(self,lines):
        for line in lines: self.write(line)

    def close(self):
        # return it back
        sys.stdout = self.stdout



some_list = ['elem1', 'elem2']

for elem in some_list:
    with Logger("/tmp/1/{}.log".format(elem), "w") as sys.stdout:
    # Do lots of stuff that print messages.
        print 'lots of stuff for', elem



print 'Code finished'

结果

$ python2 out.py 
Code finished
$ ls
elem1.log  elem2.log  out.py

酷副作用:

print 'this on screen'

with Logger("/tmp/1/main.log", "w") as sys.stdout:
     print 'this on screen an in main.log'

     with Logger("/tmp/1/sub.log", "w") as sys.stdout:
          print 'this on screen, in man.log and in sub.log'

print 'only on screen again'
 类似资料:
  • 问题内容: 我正在制作的程序被设计为无人值守运行,因此,我将stdout和stderr流重定向到了一个日志文件。尽管此程序没有任何问题,但我仍在制作和调试该软件,但我希望它也能显示在屏幕上。这可能吗? 重定向我用过的流 谢谢。 问题答案: 也许有点粗糙,但是您可以尝试以下方法: 或者,您可以编写自己的PrintStream实现,该实现同时写入日志文件和屏幕。听起来似乎除了开发之外,您不需要这种行为

  • 我想将stdout和stderr重定向到一个文件,同时保留输出顺序,然后还将stderr显示到屏幕上。我看到很多问题讨论它: https://unix.stackexchange.com/questions/9646/show-only-stderr-on-screen-but-write-both-stdout-and-stderr-to-file https://unix.stackexcha

  • 我将屏幕截图()存储在单独的Git分支()中,用于Readme.md文件(分支上)。 要在GitHub上看到图片,我必须链接到: 或 但是,当在本地查看自述文件时这就不起作用了,图像不显示(比如在VS代码或Atom中使用Markdown预览特性时)。 我甚至使用了git worktree特性来检查assets子目录中的assets分支: 目录结构如下所示: 是否有一种方法可以链接到屏幕截图,使其始

  • 问题内容: 我在网上找到了一些通常可以使用的代码,但我想在同一程序中多次使用它(将不同的内容写入不同的文件,同时始终始终在屏幕上打印)。 也就是说,当它关闭时,我认为sys.stdout会关闭,因此完全无法打印,并且再次使用此类。我尝试重新导入sys和其他愚蠢的东西,但无法正常工作。 这是网站,以及代码groups.google.com/group/comp.lang.python/browse_

  • 在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。是否有像这样的方法,每次片段出现在屏幕上时都会调用它?等是在创建片段之后调用的,而不是在片段出现在屏幕上时调用的,因此它们对我不起作用。我的问题可以用哪种方法?