我有两个Python进程A
和B
,两者都试图写入同一个文件。在A
达到f = open("xx.txt", "w")
之后,在关闭文件之前,我希望其他进程能够检测到xx.txt
正在使用中。
我在进程f = open("xx.txt", "w")
中尝试了B
但它没有抛出任何异常。我还在os.access("xx.txt", os.W_OK)
中尝试B
,它返回True
。
我知道我可以使用某些文件锁定库,例如lockfile或fcntl。但我想知道是否有任何简单的解决方案而不依赖这些库来检测它?
修改: 我找到了一个可能的解决方案:
使用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'
答案 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'