python子进程删除和重命名文件

时间:2012-07-30 20:19:25

标签: python subprocess

我正在尝试删除文件,然后在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上运行

2 个答案:

答案 0 :(得分:2)

第一个子流程未完成,请执行以下操作:

p = subprocess.Popen("...")
p.communicate() # waits until the subprocess completes

答案 1 :(得分:2)

好的,不是直接回答问题,而是提供更好的选择。

在这里使用subprocess非常糟糕的想法。这里很容易做出可怕的事情;你至少需要转义传递给shell的参数。

相反,使用Python给你的东西:

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

这是原子移动/重命名操作。在更换之前,您不必提交rm文件。此外,您通常不会这样做,因为在rmmv调用之间将没有具有该名称的文件。如果您只使用mv,则替换将是原子的,并且某些文件将始终存在。

我认为这就是所有的故事。


作为旁注,os.rename()不能跨文件系统工作。因此,虽然使用它来重命名文件是可以的(源和目标位于同一目录中),但如果您要在不同的目录中移动文件,请使用:

import shutil

shutil.move(src, dst)