编辑:因为似乎没有解决方案,或者我正在做一些没人知道的非标准的东西 - 我会修改我的问题也要问:当python应用程序创建时,完成日志记录的最佳方法是什么很多系统调用?
我的应用程序有两种模式.在交互模式下,我希望所有输出都转到屏幕以及日志文件,包括来自任何系统调用的输出.在守护程序模式下,所有输出都将转到日志中.守护进程模式很好用os.dup2().我无法找到一种方法将所有输出"发送"到交互模式的日志,而无需修改每个系统调用.
换句话说,我想要命令行'tee'的功能,用于python应用程序生成的任何输出,包括系统调用输出.
澄清:
要重定向所有输出,我会做这样的事情,并且效果很好:
# 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())
Run Code Online (Sandbox Code Playgroud)
关于这一点的好处是它不需要来自其余代码的特殊打印调用.该代码还运行一些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()) …Run Code Online (Sandbox Code Playgroud) 好的.我已经完成了我的第一个python程序.它有大约1000行代码.在开发期间,我print在运行命令之前放置了大量语句,os.system()
例如,
print "running command",cmd
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)
现在我已经完成了这个计划.我考虑过对它们进行评论,但重定向所有这些不必要的打印(我无法删除所有print语句 - 因为有些语句为用户提供有用的信息)到日志文件中会更有用吗?任何技巧或提示.
考虑到Python的动态性,如果不可能的话,我会感到震惊:
我想改变执行情况sys.stdout.write.
我从这个答案得到了我的另一个问题的想法:https://stackoverflow.com/a/24492990/901641
我试着写这个:
original_stdoutWrite = sys.stdout.write
def new_stdoutWrite(*a, **kw):
original_stdoutWrite("The new one was called! ")
original_stdoutWrite(*a, **kw)
sys.stdout.write = new_stdoutWrite
Run Code Online (Sandbox Code Playgroud)
但它告诉我AttributeError: 'file' object attribute 'write' is read-only.
这是一个很好的尝试,让我不要做一些潜在的(可能)愚蠢的事情,但我真的很想继续这样做.我怀疑解释器有一些我可以修改的查找表,但我在Google上找不到类似的东西.__setattr__也没用 - 它返回了关于属性为只读的完全相同的错误.
我特意寻找Python 2.7解决方案,如果这很重要,虽然没有理由拒绝投入适用于其他版本的答案,因为我怀疑未来的其他人会在这里看到与其他版本类似的问题.
我有一个很长的python脚本经常使用print语句,我想知道是否有可能添加一些代码,将所有的print语句记录到文本文件或类似的东西.当用户在整个程序中被提示时,我仍然希望所有的print语句都转到命令行.如果可能的话,记录用户的输入也是有益的.
我发现这有点回答我的问题,但使"print"语句不再打印到命令行