也许在以太中有人可以帮我解决这个问题.(我在SO上已经看到了很多类似的问题,但没有一个涉及标准输出和标准错误或处理与我相似的情况,因此这个新问题.)
我有一个python函数打开一个子进程,等待它完成,然后输出返回代码,以及标准输出和标准错误管道的内容.当进程正在运行时,我还想在填充它们时显示两个管道的输出.我的第一次尝试导致了这样的事情:
process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = str()
stderr = str()
returnCode = None
while True:
# collect return code and pipe info
stdoutPiece = process.stdout.read()
stdout = stdout + stdoutPiece
stderrPiece = process.stderr.read()
stderr = stderr + stderrPiece
returnCode = process.poll()
# check for the end of pipes and return code
if stdoutPiece == '' and stderrPiece == '' and returnCode != None:
return returnCode, stdout, stderr
if stdoutPiece != '': print(stdoutPiece)
if stderrPiece != '': print(stderrPiece) …Run Code Online (Sandbox Code Playgroud) 假设我正在使用以下命令从 python 脚本运行 exe:
subprocess.call(cmdArgs,stdout=outf, stderr=errf)
当 outf 和 errf 是文本文件的文件描述符时。
有什么方法可以在其之上生成 stdout 和 stderr 的合并和同步文本文件吗?它应该用时间和来源(我们的/错误)进行格式化。
谢谢
我想编写一个可以充当真正的文件描述符的类。它的 .fileno() 方法应该返回一个提供 POSIX 系统期望的所有服务的文件描述符。
这是我第一次涉足 POSIX 系统编程,所以我可能会误解很严重。
潜在的动机是希望使用内存中的 Python 对象作为构造函数的stdinor stdoutkwarg,subprocess.Popen而不必依赖临时或内存映射文件。但是我对一些可以完成工作的聪明技巧不感兴趣——我真的希望有一个能够回答所有相关系统调用的 Python 实现。
我正在编写一个研究工具,我最近从使用"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专门构建文件的另一个处理程序?(也许是通过将输出重定向到记录器?)或者这是不可能的,考虑到当前的设置?如果是后者,我该如何改进设置?
(哦,如果日志记录是"实时"的话会很棒,这样来自可执行文件的消息会在收到时记录下来.)
谢谢你的帮助!:)