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

时间:2018-02-08 18:14:06

标签: python windows file-locking

我在Windows中看到了一些关于文件句柄的令人惊讶的行为。

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

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

进程B(Python二进制文件)然后尝试在相同的文件上打开只读文件句柄,从而产生以下<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <header> <div id="header"> <a href="http://stackoverflow.com">Stack overflow</a> </div> </header> <main> </main>

IOError

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

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

有谁知道导致Python IOError: [Errno 13] Permission denied: 'C:\\path\\to\\file.txt'调用失败的原因是什么?

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

1 个答案:

答案 0 :(得分:0)

正如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)。