2011-05-10 3 views
4

제 문제는 로그가 회전 될 때 파이썬 프로그램에 대한 로깅이 중지된다는 것입니다. 스트림 자체를 추적했습니다. 파이썬에서 스트림이 깨 졌는지 알 방법이 없다. 파일을 삭제 한 후에도 문제없이 쓰기가 가능합니다.파일이 삭제 될 때 파이썬에서 깨진 스트림 감지하기

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

사용하는 파이썬의 OS 및 버전은 무엇입니까? 나는 이것을 실행하려고 노력했고 os.remove (FILE)는 나에게 오류를 주었다. 그 파일이 사용중이라고! 나는 다른 프로그램에서 열지 않았으므로 파이썬에서 열려 있어야합니다. 나는이 노트북에서 XP를 사용하고 있으며 학교 컴퓨터는 Python 2.5 만 가지고있다. – Curlystraw

+0

흥미 롭다. 필자의 목표는 Linux (redhat)와 Python 2.6.5입니다. 그리고 나는 리눅스 (우분투) Python 2.7.1에서 코드를 테스트했다. –

답변

2

더 많은 조사가 끝나자 나는 해결책을 찾았다. 이것은 OS 고유의 문제입니다. 리눅스 (또는 매킨토시)에서 파일을 삭제하면 링크가 해제됩니다. (나는 이것을 알지 못했다.) lsof를 컴퓨터에서 실행하면 여전히 파일이 열린 것으로 표시된다.

[[email protected]]$ lsof | grep --color -i "testing.txt" 
python26 26495 user 8w  REG    8,33  23474  671920 /home/user/temp/testing.txt (deleted) 

해결책은 파이썬으로 스트림을 통계하는 것입니다.

stat = os.fstat(fs.fileno()) 

그러면 링크 수를 알 수 있습니다.

if stat.st_nlink < 1: 
    #has been deleted 

그리고 거기에 있습니다. 이제 다시로드해야하는지 알 수 있습니다. 희망적으로 이것은 다른 사람을 돕는다.

0

Exception handling을보십시오 : 당신은 그냥 try: except: 절보다 더 많은 정보를 필요로하는 경우

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 
0

이 ionotify에 대한 파이썬 바인딩이 있습니다. 하지만 나는 리눅스에만 관련이 있다고 생각한다. (플랫폼에 대해 잘 모르겠다.)

0

내가 찾은 또 다른 해결책은 "copytruncate"플래그를 logrotate 구성에 추가하는 것입니다. 자세한 정보는 "man logrotate"를 참조하십시오.

관련 문제