0

ファイルを削除してから、Pythonでファイルの名前を削除したファイルに変更しようとしています。

import sys
import subprocess
fileInput = sys.argv[1]
|
|
#code to create fileInput.tmp
|
|
ret=subprocess.Popen("rm "+fileInput,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print ret
ret1=subprocess.Popen("mv "+ fileInput+".tmp "+fileInput,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print ret1

発生しているのは、fileInputとfileInput.tmpの両方が"ret="ステップで削除され、"ret1="ステップが実行されない場合があります(常にではありません)。

誰かがなぜそれが幸せなのかを提案できますか?このコードはMacOSxで実行されます

4

2 に答える 2

2

最初のサブプロセスが完了していません。次のようにします。

p = subprocess.Popen("...")
p.communicate() # waits until the subprocess completes
于 2012-07-30T20:24:27.973 に答える
2

わかりました。質問に直接答えるのではなく、より良い代替案を提供します。

subprocessここで使用するのは非常に悪い考えです。ここで恐ろしいことをするのはとても簡単です。少なくとも、シェルに渡された引数をエスケープする必要があります。

代わりに、Pythonが提供するものを使用してください。

os.rename(fileInput + '.tmp', fileInput)

これは、アトミックな移動/名前変更操作です。rmそして、あなたはそれを置き換える前にファイルする必要はありません。さらに、rmmv呼び出しの間にその名前のファイルがないため、通常はこれを行いません。を使用するだけの場合mv、置換はアトミックであり、一部のファイルは常にそこにあります。

それがすべての短編小説だと思います。


ちなみに、os.rename()ファイルシステム間では機能しません。したがって、ファイルの名前変更に使用する場合は問題ありません(ソースと宛先は同じディレクトリにあります)。異なるディレクトリ間でファイルを移動する場合は、次のようにします。

import shutil

shutil.move(src, dst)
于 2012-07-30T20:32:14.510 に答える