如何将stdout重定向到Python中的任意文件?
当从ssh会话中启动长时间运行的Python脚本(例如,Web应用程序)并进行后台处理,并且ssh会话关闭时,应用程序将引发IOError并在尝试写入stdout时失败.我需要找到一种方法来将应用程序和模块输出到文件而不是stdout,以防止由于IOError导致的失败.目前,我使用nohup将输出重定向到一个文件,这就完成了工作,但是我想知道是否有办法在不使用nohup的情况下完成它,出于好奇.
我已经尝试了sys.stdout = open('somefile', 'w'),但这似乎并没有阻止一些外部模块仍然输出到终端(或者sys.stdout = ...线路根本没有发射).我知道它应该使用我测试过的简单脚本,但我还没有时间在Web应用程序上进行测试.
在我的python程序开始时,我有以下行:
sys.stdout = open('stdout_file', 'w')
Run Code Online (Sandbox Code Playgroud)
在我的程序中途,我想将stdout设置回正常的标准输出.我该怎么做呢?
我目前正在使用jupyter笔记本在远程服务器上训练神经网络.我用以下内容进行了设置:
现在,当我在浏览器中重新连接到jupyter笔记本时,我看不到训练单元的当前输出,只看到我在观看前10分钟训练时看到的输出.
我试图为此找到一个解决方案,我认为,对于这个问题存在一些git问题,但它们已经过时了,我无法弄清楚这个问题是否已经解决.
编辑//让我的意图更加清晰,因为我发现stackoverflow上的一些线程正在解决这个问题:我不想等待训练完成,因为我可能想要在它完成之前杀死训练,当它绝对我不希望它会走的路.因此,某种"实时"输出或至少是常规输出会很好.
我是Python的新手,所以我还在学习语言.我遇到的一件事是重新分配sys.stdout来更改print的默认输出.所以我把它写成了一个测试:
import sys
sys.stdout = open('log.txt','a')
print('hey')
sys.stdout.close()
sys.stdout = sys.__stdout__
print('hi')
Run Code Online (Sandbox Code Playgroud)
'嘿'被写入文件,但'hi'无处可见.但是,这可以按预期工作,并且'hey'被写入文件,'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')
Run Code Online (Sandbox Code Playgroud)
简而言之,这是一个并不重要的小问题,我只是想知道是否有一个明显的原因导致它不按预期的方式工作.我在Windows 7家庭高级版上使用IDLE和pyscripter在v3.2.3和我的便携式python v3.2.1上尝试过这个.