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

标签 python windows file-locking

我在 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)。

关于当另一个进程打开文件时,Python open() 在 Windows 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692166/

相关文章:

java - java.io.File length() 可以锁定文件并阻止 File.delete() 工作吗?

java - FileChannel tryLock() 方法是检查锁还是只是破坏锁?

windows - 在Windows 8.1上使用gradle进行构建会导致desktop.ini问题

c++ - 如何知道我们是在控制台还是窗口应用程序中?

c - 如何确保当我的进程正在操作一个文件时,没有其他进程试图写入或删除它?

java - python 与 java 运行时足迹

windows - Grep 和 SED 在 PowerShell 中不工作

python - Pandas/Python - 根据值匹配更新数据帧

python - 列表理解是否允许多个 elif 语句?

Python Regex - 从两个 '*' 之间的字符串中查找内容