读取日志文件

时间:2015-09-19 05:17:49

标签: python popen stderr seek

在Python 2.7中,我在某个循环中有以下代码

file = open("log.txt", 'a+')
last_position = file.tell()
subprocess.Popen(["os_command_producing_error"], stderr = file)
file.seek(last_position)
error = file.read()
print(error) # example of some action with the error

意图是stderr刚刚给出的错误,比如打印出来,而file保留了整个记录。

我是Python的初学者,我不清楚stderr = file中发生了什么。

我的问题是error一直是空的,即使错误一直记录在file中。

有人可以解释原因吗?

我尝试重新添加结束并再次打开文件,或file.flush()行之后的subprocess。但仍然有同样的效果。

编辑:以下答案中的代码对我来说很有意义,而且似乎适用于该帖子的作者。对我来说(在Windows中)它不起作用。它提供一个空的err和一个空文件log.txt。如果我逐行运行它(例如调试)它确实有效。如何理解和解决这个问题?

修改:我使用Popen更改了call,现在可以正常使用了。我猜call等待subprocess完成以继续使用脚本。

1 个答案:

答案 0 :(得分:0)

请尝试以下代码:

file = open("log.txt", 'a+')
sys.stderr = file
last_position = file.tell()
try:
    subprocess.call(["os_command_producing_error"])
except:
    file.close()
    err_file = open("log.txt", 'r')
    err_file.seek(last_position)
    err = err_file.read()
    print err
    err_file.close()

sys.stderr映射标准错误消息,如sys.stdout(地图标准输出)和sys.stdin(地图标准输入)。

这会将标准错误映射到file。因此,所有标准错误都将写入文件log.txt