我的问题是当日志被旋转时,日志记录会停止python程序。 我已将其跟踪到流本身。我没有看到任何方法来判断流是否从python中断。删除文件后,它仍然接受写入而没有任何问题。
import os
FILE = 'testing.txt'
fs = open(FILE, 'a')
fs.write('word')
os.remove(FILE)
fs.write('Nothing....') # Nothing breaks
print(fs.errors) # No errors
那么,我怎样才能知道文件流是否仍然有效? 并检查该文件是否存在将无济于事,因为无论该流是否仍然有效,该文件将始终存在。
答案 0 :(得分:2)
经过更多的检查,我找到了解决方案。这是操作系统特定的问题。在Linux(或Macintosh)中删除文件时,它只是取消链接。 (我不知道这个) 因此,如果您在计算机上运行lsof,它仍会将文件显示为打开。
[user@machine]$ lsof | grep --color -i "testing.txt"
python26 26495 user 8w REG 8,33 23474 671920 /home/user/temp/testing.txt (deleted)
解决方案是在python中统计流。
stat = os.fstat(fs.fileno())
这将为您提供它拥有的链接数量。
if stat.st_nlink < 1:
#has been deleted
你去吧。现在您知道是否应该重新加载它。希望这有助于其他人。
答案 1 :(得分:0)
import os
FILE = 'testing.txt'
try:
fs = open(FILE, 'a')
fs.write('word')
os.remove(FILE)
fs.write('Nothing....') # Nothing breaks
except Exception, e:
print "Error:", e
print(fs.errors) # No errors
答案 2 :(得分:0)
如果你需要更多的智能而不仅仅是try: except:
子句,那么有一些用于ionotify的python绑定。但我认为它只与Linux相关(我不确定你的平台)
答案 3 :(得分:0)
我发现的另一个解决方案是将“copytruncate”标志添加到logrotate配置中。 有关详细信息,请参阅“man logrotate”。