Python 当另一个进程正在打开文件时,Windows open() 失败

Python open() fails on Windows when another process is opening the file

我在 Windows.

中看到关于文件句柄的一些令人惊讶的行为

我有两个进程都试图获取同一个底层文件的只读文件句柄。

进程 A(Go 二进制文件)打开该文件的只读文件句柄,然后使用它获取文件的独占锁。

进程 B(一个 Python 二进制文件)然后尝试在 相同的 文件上打开一个只读文件句柄,结果如下 IOError:

IOError: [Errno 13] Permission denied: 'C:\path\to\file.txt'

当进程 A 不在时,进程 B 打开文件没有问题。

据我所知,Windows 上的两个进程都没有问题,它们都将只读文件描述符保存到同一文件,而且我还没有找到任何文档表明其中一个进程持有独占锁会改变这一点。

有谁知道可能导致 Python open() 调用失败的原因?

(如果有帮助,我使用的 Go 文件锁定实现是 this one。)

this answer 中所建议,如果进程没有访问文件的权限或文件被另一个进程锁定,open() 将抛出 IOError

要验证它是第二个而不是第一个,您可以使用os.access()检查进程是否具有访问文件的权限。

例如:

if not os.access(FILE_PATH, os.R_OK):
  print "Failure opening file: No read access for %s" % FILE_PATH
  return

try:                                                                                                                                                      
  fd = open(FILE_PATH)
  print "Success opening file"
except IOError:
  print "Failure opening file: Another process holds lock on %s" % FILE_PATH

对于 Unix 系统上的 flock,打开和锁定文件是不同的概念。然而,Windows 系统上的 LOCK_FILE_EX 实际上会阻止其他进程打开文件的该部分进行读或写访问 (source)。