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="step 中被删除并且"ret1="step 不执行。

有人可以建议为什么会这样。此代码在 MacOSx 上运行

4

2 回答 2

2

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

在这里使用subprocess是一个非常糟糕的主意。在这里很容易做可怕的事情;您至少需要转义传递给 shell 的参数。

相反,使用 Python 为您提供的:

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

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

这就是所有的短篇小说,我想。


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

import shutil

shutil.move(src, dst)
于 2012-07-30T20:32:14.510 回答
2

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

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