python sys stdout_Python-如何将sys.stdout复制到日志文件?
发布日期:2021-06-24 19:28:11 浏览次数:3 分类:技术文章

本文共 1063 字,大约阅读时间需要 3 分钟。

编辑:由于似乎没有解决方案,或者我正在做一些人都不知道的非标准操作-我将修订我的问题,并问:当python应用正在制作日志时,完成记录的最佳方法是什么?很多系统调用?

我的应用程序有两种模式。在交互模式下,我希望所有输出都转到屏幕以及日志文件中,包括所有系统调用的输出。在守护程序模式下,所有输出进入日志。守护程序模式使用时效果很好os.dup2()。我找不到在不修改每个系统调用的情况下以交互方式将所有输出“发送”到日志的方法。

换句话说,我想要python应用程序生成的任何输出(包括系统调用output)的命令行“ tee”的功能。

澄清:

要重定向所有输出,我可以执行以下操作,并且效果很好:

# open our log file

so = se = open("%s.log" % self.name, 'w', 0)

# re-open stdout without buffering

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

# redirect stdout and stderr to the log file opened above

os.dup2(so.fileno(), sys.stdout.fileno())

os.dup2(se.fileno(), sys.stderr.fileno())

这样做的好处是,不需要其余代码即可进行特殊的打印调用。该代码还运行一些shell命令,因此不必分别处理它们的每个输出也很不错。

简而言之,除了复制而不是重定向外,我想做同样的事情。

乍一想,我认为简单地反转即可dup2。为什么不呢?这是我的测试:

import os, sys

### my broken solution:

so = se = open("a.log", 'w', 0)

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())

os.dup2(sys.stderr.fileno(), se.fileno())

###

print("foo bar")

os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})

os.execve("/bin/ls", ["/bin/ls"], os.environ)

文件“ a.log”应与屏幕上显示的相同。

转载地址:https://blog.csdn.net/weixin_34262786/article/details/114912728 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:drawroundrect java_View绘制流程之Canvas(一)
下一篇:java基础是javase_JavaSE基础:数组

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月23日 19时12分31秒