我正在编写一个研究工具,我最近从使用"print"语句切换到使用Python内置的记录器功能.我推断,这将允许我为用户提供将输出转储到文件的选项,除了将其转储到屏幕上.
到现在为止还挺好.我在Python中的代码部分使用"logger.info"和"logger.error"转储到屏幕和文件."logger"是模块范围的记录器.这部分就像一个魅力.
但是,在几个点上,我使用"subprocess.call"通过shell运行可执行文件.所以,在整个代码中,我有类似的行
proc = subprocess.call(command)
Run Code Online (Sandbox Code Playgroud)
此命令的输出将一如既往地打印到屏幕,但不会转储到用户指定的文件.
一种可能的选择是打开文件管道:
proc = subprocess.call(command, stdout=f, stderr=subprocess.OUTPUT)
Run Code Online (Sandbox Code Playgroud)
但那只会转储到文件而不是屏幕.
基本上,我的问题归结为:有没有办法可以利用我现有的记录器,而不必为subprocess.call专门构建文件的另一个处理程序?(也许是通过将输出重定向到记录器?)或者这是不可能的,考虑到当前的设置?如果是后者,我该如何改进设置?
(哦,如果日志记录是"实时"的话会很棒,这样来自可执行文件的消息会在收到时记录下来.)
谢谢你的帮助!:)
您可以将其通过stdout管道传输到 ,PIPE然后从该 PIPE 读取并写入记录器,而不是通过管道传输到文件。像这样的东西:
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.OUTPUT)
for line in proc.stdout:
logging.info(line)
Run Code Online (Sandbox Code Playgroud)
然而,还有一个更简单的答案:您必须使用带有文件句柄的类文件对象,但您可以在将每一行传递到logging. 您可以自己编写这个对象,但是,正如 @unutbu 所说,有人已经在这个问题中完成了。所以:
with StreamLogger(logging.INFO) as out:
proc = subprocess.call(command, stdout=out, stderr=subprocess.OUTPUT)
Run Code Online (Sandbox Code Playgroud)
当然,您也可以临时包装stdout以写入记录器并仅传递输出,例如,使用这个令人困惑的同名类:
with StreamLogger('stdout'):
proc = subprocess.call(command, stderr=subprocess.OUTPUT)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
957 次 |
| 最近记录: |