6

ファイルのコピーが完了したことをPythonスクリプトに警告する方法を見つけたいと思います。シナリオは次のとおりです。

  1. フォルダーto_printは、常にポーリングすることにより、スクリプトによって監視されていますos.listdir()

  2. os.listdir()これまでに表示されたことのないファイルが存在するファイルのリストを返すたびに、スクリプトはそのファイルに対していくつかの操作を実行します。これには、ファイルを開いたり、その内容を操作したりすることが含まれます。

これは、ファイルが小さい場合は問題ありません。ファイルを元のソースから監視対象のディレクトリにコピーするのにかかる時間は、次のポーリングまでの残り時間よりも短くなりos.listdir()ます。ただし、ファイルがポーリングされて見つかったが、ファイルがまだコピー中である場合、スクリプトがファイルを処理しようとすると、ファイルの内容が破損します。

代わりにos.stat、ファイルが現在コピーされていることを(使用しているかどうかにかかわらず)知り、その場合は実行するまでファイルがコピーされるのを待ちたいと思います。

私の現在の考えはos.stat()、新しいファイルを見つけるたびに使用し、次のポーリングまで待って、最後にポーリングしてからの変更/作成時刻を比較することです。同じままの場合、そのファイルは「安定」しています。になるまでポーリングを続けます。Linux / Unixがこれらの値を更新する方法にあまり詳しくないので、これが機能するかどうかはわかりません。

4

2 に答える 2

3

inotifyを試してください。

これは、ファイルを監視するためのLinux標準です。あなたのユースケースにとって、このイベントIN_CLOSE_WRITEは有望なようです。inotify用のPythonライブラリがあります。非常に単純な例(そこから引用)。イベントのみをキャッチするように変更する必要がありIN_CLOSE_WRITEます。

# Example: loops monitoring events forever.
#
import pyinotify

# Instanciate a new WatchManager (will be used to store watches).

wm = pyinotify.WatchManager()
# Associate this WatchManager with a Notifier (will be used to report and
# process events).

notifier = pyinotify.Notifier(wm)
# Add a new watch on /tmp for ALL_EVENTS.
wm.add_watch('/tmp', pyinotify.ALL_EVENTS) # <-- replace by IN_CLOSE_WRITE

# Loop forever and handle events.
notifier.loop()

広範なAPIドキュメントは次のとおりです:http ://seb-m.github.com/pyinotify/

于 2012-10-10T16:44:40.137 に答える
2

ファイルはポーリング間隔内にコピーできるため、新しいファイルをチェックする前に、最後のポーリングで見つかった新しいファイルを処理するだけです。言い換えれば、これの代わりに:

while True:
    newfiles = check_for_new_files()
    process(newfiles)
    time.sleep(pollinterval)

これを行う:

newfiles = []

while True:
    process(newfiles)
    newfiles = check_for_new_files()
    time.sleep(pollinterval)

または、ループの途中で待機します(実際には同じ効果です)。

while True:
    newfiles = check_for_new_files()
    time.sleep(pollinterval)
    process(newfiles)
于 2012-10-10T16:38:07.770 に答える