2016-11-18 12 views
1

私はmetamapを外部プログラムとしてプロジェクトに使用しています。プロジェクトの完全なコードはPythonで書かれています。私のコードの1つの場所で、私はmetamapへの引数として入力ファイルを渡し、次にmetamapが生成する出力ファイルを読み込まなければなりません。外部プロセスがファイルの書き込みを完了するまで待機する

command = '/bin/metamap --silent --sldiID temp_input' 
subprocess.call(command, shell=True) 

上記の場合、出力ファイルは現在の作業ディレクトリの名前temp_input.outによって生成されます。私はこの出力ファイルの内容を処理する必要があります。私が現在直面している問題は、出力ファイルを空にすることを前提にPythonコードが前進していることです。出力ファイルが完全に書き込まれていることを確認するにはどうすればいいですか?

今のところ、私は上記を達成するための正しい方法ではないと感じています。

while fileExists == False: 
    if os.path.isfile(outputFileName): 
     fileExists = os.stat(outputFileName).st_size != 0 

答えて

0

出力ファイルが完全に書き込まれていることを確認して、次にpythonコードが前方に移動するようにするにはどうすればよいですか。

一般に、処理を信頼できるものにするには、ファイルを書き込むプロセスに、入力ファイルを正常に書き込んだことを通知する必要があります。たとえば、datafile.copyingという名前のファイルから始めて、それが完了すると、ほとんどのシステムではrename()が原子的に実装され、rename()datafileに実装されているという事実に依存します。あなたのコードは、*.copyingという名前のパターンを持つファイルは処理しません。または、ファイルを正常に書き込んだ後、書き込み処理でfilename.doneというフラグファイルを作成して、filenameが正常にコピーされたことを知らせることができます。

この場合、子プロセスを生成するので、子プロセスが終了するのを待っているだけでなく、何らかの方法でそれが正常に完了したと判断する必要があります。 metamapプロセスは、使用できるリターンコードを提供していますか?ほとんどのユーティリティは、成功した場合は0を返し、何らかの理由で失敗した場合はゼロ以外の値を返します。

信頼性の高い方法はありません。読取りプロセスが入力ファイルが完全にコピーされたことを知ることができるという追加情報なしには方法がないためです。書き込みプロセスの途中でファイルの書き込みが失敗する可能性があります。たとえば、ネットワーク接続が失敗する可能性があります。

もう一度これを確実に行う方法はありません。

+0

信頼できる方法がないと言っているからです。今私は別の方向に考えています。私が投稿した上記の質問では、別の考え方は、生成された出力ファイルが閉じられるまで(**上記のtemp_input.out **が閉じられるまで)Pythonコードが待機する方法を見つけることです。それを確実に行うことはできますか? – shuklaham

0

Linuxには、ファイルがプロセスによってアクセスされているかどうかを検出するために使用できるinotifyという一連のイベントがあります。 pyinotifyと呼ばれる、これにアクセスするためのPythonライブラリがあります。

このブログ記事では、pyinotifyでファイルをチェックする方法について説明しています。

http://www.saltycrane.com/blog/2010/04/monitoring-filesystem-python-and-pyinotify/

また、lsofあなたがhttp://pythonhosted.org/psutil/index.html?highlight=lsof#psutil.Process.open_filesを使用することができ、その場合にはオプションで、あるかもしれません。

>>> import psutil 
>>> f = open('file.test', 'w') 
>>> p = psutil.Process() 
>>> p.open_files() 
[popenfile(path='/Users/username/file.test', fd=3)] 
>>> 
+0

私は実際に実装していませんが、pynotifyはファイルシステム上のイベントの通知を私に与えます。私は外部ファイルが完全に書き込まれるまで待ってから前方に移動するPythonプログラムにしたい。それをどうやって助けてくれるの? – shuklaham

+0

pynotifyでは、ファイルハンドルが閉じられた時点のイベントをキャプチャすることができます。その時点で、そのファイルへの書き込みが完了する必要があります。それが保証されない場合は、ファイルが完了したことを何らかの形でプロセスに通知する必要があります。おそらく完成したビットをファイルに書き込んだり、キューやそれに類する戦略でメッセージを渡したりします。 –

関連する問題