我想了解什么是猴子补丁或猴子补丁?
这类似于方法/运算符重载或委托吗?
这些东西有什么共同之处吗?
编辑:因为似乎没有解决方案,或者我正在做一些没人知道的非标准的东西 - 我会修改我的问题也要问:当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) 我想取消换行符,例如log.info("msg").当我们"打印"它时
print msg,
Run Code Online (Sandbox Code Playgroud)
所以我需要像昏迷这样的东西来记录.
我播下这个问题 在Python日志模块中抑制换行, 但是任何人都可以给我参考或者像"Hello world"这样的简单例子谢谢!
我想要的:在任何地方使用日志库而不是打印语句。有时最好不要以新行结束。考虑这个简化的例子:
for file in files:
print('Loading {}'.format(file), end='', flush=True)
try:
data = load(file)
print('\rLoaded {}'.format(file))
except:
print('\rFailed loading {}'.format(file))
Run Code Online (Sandbox Code Playgroud)
显而易见的方法是使用:
handler = logging.StreamHandler()
handler.terminator = ""
Run Code Online (Sandbox Code Playgroud)
但是,我不想向我的库添加处理程序,并且我确实希望主记录器的默认行为是以新行终止。以“”结尾感觉应该是例外,而不是规则。
有没有办法让我可以做类似的事情:
logger.info(msg, terminator="")
Run Code Online (Sandbox Code Playgroud)
无需为日志记录模块创建大量子类?
我对这个问题的看法是否合理,或者有更好的方法来处理这个问题吗?