2016-09-19 6 views
1

私は繰り返し遭遇しているエラーを抱えています。悲しいことに、サイトで解決策を見つけることができません。ラインもののmkdirとtouchサブプロセスを順番に使用しても動作しない

try: 
    #create working dir if it doens't exist already 
    if not os.path.isdir(WORKINGDIR): 
     print '>>>mdkir ',WORKINGDIR 
     subprocess.Popen(['mkdir',WORKINGDIR]).wait() 
     print os.path.isdir(WORKINGDIR) 

    #create output csv file 
    outputCSVFile = WORKINGDIR+ '/'+'results.csv' 
    if not os.path.isfile(outputCSVFile): 
     print '>>> touch',outputCSVFile 
     subprocess.check_output(['touch',outputCSVFile]) 

:私はsubprocess.checkoutputの代わりsubprocess.Popen().wait()を使用する場合

touch: cannot touch `/nfs/iil/proj/mpgarch/archive_06/CommandsProfiling/fastScriptsOutput190916/results.csv': No such file or directory

同じエラーが表示されない:常にTruesubprocessこのエラーを返し出力します。 この問題は、(ディレクトリやファイルを作成するためにosメソッドを使用するなどして)さまざまな方法で解決できますが、なぜ私の方法が機能していないのか興味があります。

ありがとうございます。

EDIT:問題はおそらくsubprocess.Popenの後にプログラムが高速すぎて、subprocess.checkoutputを使用して問題が解決されます(出力を待つ必要があるため)。しかし、まだ何が起こっているのか分かりません。​​は、実行される行に進む前に、ディレクトリが作成されたことを示しています。touch

+1

私は考えることができる唯一のことは、ラインに沿ってどこかにキャッシュすることで発生する競合状態である

は、ディレクトリを作成します。おそらく、ディレクトリ作成は数分の1秒間延期されるでしょう。おそらく、 'subprocess.checkoutput'を介した出力のストリーミングによって、ディレクトリが作成されるのに十分な遅延が生じます。単純なチェックは、壊れたバージョンで意図的な待機を追加し、それが修正されているかどうかを確認することです。もちろん、メソッドがシェルを別の方法で呼び出すのではなく、エッジケースを経験しているとは言えません。うまくいけば、もっと知識のある人がその1つに当てることができます – Basic

+0

私はあなたが正しいと信じており、これが原因です。 – DorHugi

答えて

0

ファイルのパーミッションの問題があると思います。 あなたのパスには、NFSを使用しているようです。すでにローカルファイルシステムで試してみましたか?

とにかく、簡単なファイル操作のためにサブプロセスを使用しないでください。 Touch用

if not os.path.exists(WORKINGDIR): 
    os.makedirs(WORKINGDIR) 

import os 

def touch(fname, times=None): 
    with open(fname, 'a'): 
     os.utime(fname, times) 

touch(WORKINGDIR+ '/'+'results.csv') 
+0

ご協力いただきありがとうございます。私は、ここではパーミッションが問題ではないことを恐れています。あなたが正常に作成されたディレクトリを見ることができ、以前にディレクトリが作成されたとき、またはsubprocess.check_output()を使うときtouchコマンドがうまくいきます。 Popenで私のコードが正しく動作しない理由に興味があります。 – DorHugi

関連する問題