检测另一个Python进程是否正在写入文件

时间:2015-09-02 19:34:09

标签: python file

我有两个Python进程AB,两者都试图写入同一个文件。在A达到f = open("xx.txt", "w")之后,在关闭文件之前,我希望其他进程能够检测到xx.txt正在使用中。

我在进程f = open("xx.txt", "w")中尝试了B但它没有抛出任何异常。我还在os.access("xx.txt", os.W_OK)中尝试B,它返回True

我知道我可以使用某些文件锁定库,例如lockfilefcntl。但我想知道是否有任何简单的解决方案而不依赖这些库来检测它?

修改: 我找到了一个可能的解决方案:

使用os.open打开文件:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
fd = os.open( "xx.txt", open_flags )

如果文件已经存在,我们可以获得异常:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
>>> fd = os.open( "xx.txt", open_flags )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists: 'xx.txt'

2 个答案:

答案 0 :(得分:0)

一个丑陋的解决方案是在打开文件之前重命名文件,并在处理后重命名。如果重命名有效,则表示其他进程未使用它。如果重命名失败,则表示文件已重命名,因此当前正在使用。

更好的解决方案是使用另一种进程间通信方法(管道,共享内存等),如果需要持久性,则需要一个简单的数据库,例如sqlite。

答案 1 :(得分:-1)

我找到了一个可能的解决方案(在我的情况下,文件只需要写一次):

使用os.open打开文件:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
fd = os.open( "xx.txt", open_flags )

如果文件已经存在,我们可以获得异常:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
>>> fd = os.open( "xx.txt", open_flags )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists: 'xx.txt'