1

この種のことが他の場所で答えられた場合はお詫び申し上げます。Pythonを使用して、を使用してWindows実行可能ファイルを実行していますsubprocess.Popen()。実行可能ファイルは、その操作の一部として.txtファイルとその他の出力ファイルを生成します。subprocess.Popen()次に、元の.exeファイルからの出力を使用する別の実行可能ファイルを実行する必要があります。

問題は、出力ファイルの作成を制御しているのはPythonではなく.exeファイルであるため、最初のテキストファイルをディスクに書き込んでから使用するまでにかかる時間を制御できません。 2番目の.exeファイルへの入力。

明らかに、最初のテキストファイルがディスクへの書き込みを完了する前に、2番目の実行可能ファイルを実行することはできません。

subprocess.wait()テキストファイルがディスクへの書き込みを完了する前に最初の実行可能ファイルが終了するため、は役に立たないようです。また、任意の時間(たとえば、数秒)待機してから、2番目の.exeファイルの実行を続行するような関数を使用したくありません。これは、必要以上に待機する可能性があり、したがって時間を浪費する可能性があるという点で非効率的です。一方、出力テキストファイルが非常に大きい場合は、十分な時間待機しない可能性があります。

したがって、2番目のsubprocess.Popen()呼び出しを実行する前に、テキストファイルの書き込みが完了するのを待つある種のリスナーが必要だと思います。これは可能ですか?

どんな助けでもいただければ幸いです。


更新(以下のニールの提案を参照)

の問題os.path.getmtime()は、書き込み中に変更時間が複数回更新されるため、非常に大きなテキストファイル(たとえば、約500 Mb)では、os.path.getmtime()呼び出しの間に比較的長い待機時間が必要になることです。私time.sleep()はこれを行うために使用します。この解決策は実行可能だと思いますが、時間の最も効率的な使用法ではありません。

一方、書き込みアクセスのためにファイルを開こうとすると、より大きな問題が発生します。私は次のループを使用します:

while True:
    try:
        f = open(file, 'w')
    except:
        # For lack of something else to put in here
        # (I don't want to print anything)
        os.path.getmtime(file) 
    else:
        break

このアプローチは、Windows実行可能ファイルがファイルを書き込んでいる間Pythonが基本的に一時停止するという点で機能しているようですが、その後、コードの次の部分でテキストファイルを使用すると、書き込まれたばかりの内容が消去されていることがわかります。

実行可能ファイルが処理を実行しているときにWindowsエクスプローラーでファイルサイズが増加するのを確認できるため、これらが作成されたことがわかります。したがって、open(file、'w')の最後の呼び出し(実行可能ファイルが処理を完了した後)のみを想定できます。 )どういうわけか、ファイルがワイプされます。

明らかに、私は何か間違ったことをしています。何か案は?

4

2 に答える 2

0

あなたがやりたいことをする方法はおそらくたくさんあります。頭に浮かぶのは、os.path.getmtime()を使用して変更時刻をポーリングし、いつ変更されるかを確認できることです。変更日が実行可能ファイルを呼び出した後であるが、それでも数秒前である場合は、それが完了したと見なすことができます。

または、書き込みアクセスのためにファイルを開いてみることができます(実際には何も書き込まずに)。それが失敗した場合、それは他の誰かがそれを書いていることを意味します。

于 2012-05-14T00:31:24.503 に答える
0

これはすべてとても壊れやすいように聞こえますが、あなたの手もやや結ばれていると思います。

頭に浮かぶ1つの提案は、書き込まれるテキストファイルに認識可能なファイルの終わりマーカーが含まれている可能性があるかどうかです。次のようなテキストファイルを作成しました。

BEGIN
DATA
DATA
DATA
END

このファイルがあれば、次のos.seekように使用して、ファイルの最後に「END」が書き込まれたかどうかを確認できます。

>>> import os
>>> fp = open('test.txt', 'r')
>>> fp.seek(-4, os.SEEK_END)
>>> fp.read()
'END\n'
于 2012-05-17T01:27:31.390 に答える