10

我对 Python 很陌生,所以我仍然只是在学习这门语言。我遇到的一件事是重新分配 sys.stdout 以更改 print 的默认输出。所以我写了这个作为测试:

import sys
sys.stdout = open('log.txt','a')
print('hey')
sys.stdout.close()
sys.stdout = sys.__stdout__
print('hi')

'Hey' 被写入文件,但 'hi' 无处显示。但是,这按预期工作,并且“嘿”被写入文件,“hi”被打印到控制台输出:

import sys
sys.__stdout__ = sys.stdout
sys.stdout = open(r'C:\Users\Vincent\Documents\Python\log.txt','a')
print('hey')
sys.stdout.close()
sys.stdout = sys.__stdout__
print('hi')

简而言之,这是一个无关紧要的小问题,我只是想知道是否有明显的原因导致它无法按应有的方式工作。我已经在 Windows 7 Home Premium 上尝试过这个,在 v3.2.3 和我的便携式 python v3.2.1 上使用 IDLE 和 pyscripter。

4

3 回答 3

4

在 IDLE 中,sys.__stdout__是程序的原始标准输出——它无处可去,因为它不是控制台应用程序。换句话说,IDLE 本身已经被sys.stdout其他东西(它自己的控制台窗口)替换了,所以你向后退了两步,stdout__stdout__.

于 2017-07-19T21:06:48.980 回答
2

我会尝试这种解决方法(根本不使用sys.__stdout__,因为您的环境可以使两者都sys.stdout不同sys.__stdout__):

old_stdout = sys.stdout
sys.stdout = open('log.txt','a')
print('hey')
sys.stdout.close()
sys.stdout = old_stdout

备份参考sys.stdout似乎是最安全的方法。在另一个稍微不同的情况下工作:来自 Jupyter 笔记本的 stdout 重定向正在登陆终端

于 2017-07-19T20:52:30.200 回答
0

这是一个sys.std<in|out|err>为您备份旧状态的上下文管理器,作为对其他答案的补充。

就个人而言,我将它与基于 PyQt5 的程序一起使用,只要应用程序正在运行,标准输出就会重定向到基于文本的小部件。应用程序关闭后,输出将重定向回我的 IDE 控制台。

import sys

class SysStdRedirection:
    """Any change done to `sys.std<in|out|err>` inside this context manager will
       be reverted upon exit."""

    def __init__(self):
        for x in ("stdin", "stdout", "stderr"):
            setattr(self, x, getattr(sys, x))

    def __enter__(self):
        pass

    def __exit__(self, error_type=None, value=None, traceback=None):
        for x in ("stdin", "stdout", "stderr"):
            setattr(sys, x, getattr(self, x))

用法:

with SysStdRedirection():
    sys.stdout = open('log.txt', 'a')
    print('hey')
    sys.stdout.close()
print('hi')
于 2020-12-01T15:06:34.217 回答