我在except块中得到WindowsError: [Error 32] The process cannot access the file because it is being used by another process
。怎么会发生这种情况?
try:
shutil.move(os.path.join(folder, name), folder)
except shutil.Error:
# Handling Error: Destination already exists
unique_name = "%s_%s" %(name, time.time())
shutil.move(os.path.join(folder, name), os.path.join(folder, unique_name))
假设我可以在Windows中处理这样的异常(我希望第一个shutil.move
不会锁定文件或任何东西,如果有异常),是否像shutil.Error
一样被引发try块,因为该文件已经存在并且它进入了except块,它尝试使用新文件名移动它只是为了找到它被另一个进程使用?
如果我将shutil.move
操作编写为Python线程,那么两个线程是否可能尝试执行相同的操作?或者那不会发生,因为GIL锁定会强制执行顺序执行?
在Windows中,通常情况下,我可以同时打开两个文件进行写入吗?
答案 0 :(得分:1)
或者那不会发生,因为GIL锁定是按顺序发生的?
即使线程按顺序发生,也并不意味着它们放弃了文件处理程序,这意味着当使用它的线程不活动时文件仍然被锁定。
就像shutil.Error在try块中发生了因为文件已经存在
如果shutil.move
都失败了,那意味着问题在于读取源文件,而不是写入目标文件。还有另一个进程(或者在你自己的Python进程中可能更早?)打开了文件,并且没有取消对文件的读锁定。