別のプロセスによって開いたままになっているログファイルを開いて、最初の数行を削除しようとしています。Unix では、単純に aos.open('/tmp/file.log', os.O_NONBLOCK)
を実行するだけで、目標に近づくことができます。
今、私は Windows で立ち往生しており、ファイルを保持しているアプリケーションを終了せずに、このログを何らかの方法でローテーションする必要があります。これは可能ですか?
最初は、アプリケーションがログを想定している場所でファイル ハンドルを開き、Python でファイル ハンドルへのパイプとして機能することを検討しましたが、Windows でもそれを行う方法が見つかりませんでした。
また、ファイルを定期的に移動し、アプリケーションにファイルを再作成させることも考えましたが、別のプロセスで使用されているため、あまり効果がありません。
同様に考えO_SHLOCK
ましたが、それは Windows ではなく Unix です。だから私はファイルをmmapし、それがもう少し柔軟になることを願っていましたが、それは私をどこにも導きませんでした.
import mmap
import contextlib
import time
with open(r'test.log', 'r+') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 0)) as m:
while 1:
line = m.readline()
if len(line) > 0:
print line
time.sleep(0.5)
これにより、Python がファイルを保持しているため、アプリケーションはファイルにアクセスできなくなります (逆も同様です)。
思いついたのですsignal.SIGHUP
が、それもWindowsには存在しないので、振り出しに戻ります。
私は立ち往生していて、すべて試しました。Python はここで私を助けてくれますか、それとも言語を切り替える必要がありますか?