我正在尝试删除文件,然后在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
有时(并非总是)发生的事情在"ret="
步骤中删除了fileInput和fileInput.tmp,并且"ret1="
步骤未执行。
有人可以说明为什么会这样。此代码在MacOSx上运行
答案 0 :(得分:2)
第一个子流程未完成,请执行以下操作:
p = subprocess.Popen("...")
p.communicate() # waits until the subprocess completes
答案 1 :(得分:2)
好的,不是直接回答问题,而是提供更好的选择。
在这里使用subprocess
是非常糟糕的想法。这里很容易做出可怕的事情;你至少需要转义传递给shell的参数。
相反,使用Python给你的东西:
os.rename(fileInput + '.tmp', fileInput)
这是原子移动/重命名操作。在更换之前,您不必提交rm
文件。此外,您通常不会这样做,因为在rm
和mv
调用之间将没有具有该名称的文件。如果您只使用mv
,则替换将是原子的,并且某些文件将始终存在。
我认为这就是所有短的故事。
作为旁注,os.rename()
不能跨文件系统工作。因此,虽然使用它来重命名文件是可以的(源和目标位于同一目录中),但如果您要在不同的目录中移动文件,请使用:
import shutil
shutil.move(src, dst)