当前位置: 首页 > 面试题库 >

打开已经打开的文件不会引发异常

祁嘉瑞
2023-03-14
问题内容

考虑这两个python程序:

script_a.py

from datetime import datetime
from time import sleep

while True:
    sleep(1)
    with open('foo.txt', 'w') as f:
        sleep(3)
        s = str(datetime.now())
        f.write(s)
        sleep(3)

script_b.py

while True:
    with open('foo.txt') as f:
        s = f.read()
        print s

运行script_a.py。在运行时,启动script_b.py。两者都将愉快地运行,但是script_b.py如果当前通过打开文件,则会输出一个空字符串script_a.py

我期望IOError会引发异常,告诉我该文件已经打开,但是没有发生,而是文件看起来是空的。为什么会这样?检查它是否已被另一个进程打开的正确方法是什么?可以简单地检查是否返回了空字符串,然后重试直到读取其他内容,或者还有其他更Python化的方法吗?


问题答案:

有关在Python中如何打开多个文件的信息,请参见其他答案和注释。如果已阅读所有内容,但仍想锁定对POSIX平台上文件的访问,则可以使用fcntl库。

请记住:A)其他程序可能会忽略您对文件的锁定,B)一些联网的文件系统不能很好地实现锁定,或者根本没有实现C)请务必非常小心地释放锁定并避免死锁成群不会检测到它[1]

[2]。

例子.... script_a.py

from datetime import datetime
from time import sleep
import fcntl

while True:
    sleep(1)
    with open('foo.txt', 'w') as f:
        s = str(datetime.now())

        print datetime.now(), "Waiting for lock"
        fcntl.flock(f, fcntl.LOCK_EX)
        print datetime.now(), "Lock clear, writing"

        sleep(3)
        f.write(s)

        print datetime.now(), "releasing lock"
        fcntl.flock(f, fcntl.LOCK_UN)

script_b.py

import fcntl
from datetime import datetime

while True:
    with open('foo.txt') as f:
        print datetime.now(), "Getting lock"
        fcntl.flock(f, fcntl.LOCK_EX)
        print datetime.now(), "Got lock, reading file"

        s = f.read()

        print datetime.now(), "Read file, releasing lock"
        fcntl.flock(f, fcntl.LOCK_UN)

        print s

希望这可以帮助!



 类似资料:
  • 我已经安装了 Pug(前玉)插件并添加了一个新的文件模板 创建新的.pug文件时,PhpStorm会创建一个我无法打开的文件。 我已经按照官方页面上的说明进行操作,但它没有帮助。 我错过了哪一步?任何帮助都是巨大的! 编辑: 我已经卸载了Pug插件,使缓存失效并重启。然后删除了我已经创建的模板,因为pstorm创建了一个名为“Pug/Jade File”的新模板。然后,我从上下文菜单中创建了一个新

  • 我在Mac(优胜美地)上运行月食。 使用Eclipse已经有几个月了,但是今天早上打开Eclipse时,在启动屏幕后弹出一个“错误已经发生,请查看日志文件”。 不过,它没有通过闪屏。 以下是日志文件,以防万一:

  • 问题内容: 我需要编写一个自定义的批处理文件重命名器。我已经完成了大部分工作,除了我不知道如何检查文件是否已经打开。我只是在使用软件包,并且有一种方法,但是似乎无法测试该文件是否正在被另一个程序使用。关于如何进行这项工作的任何想法? 问题答案: 使用Apache Commons IO库…

  • 打开文件 有了上述分析后,我们可以看看如果一个用户进程打开文件会做哪些事情?首先假定用户进程需要打开的文件已经存在在硬盘上。以user/sfs_filetest1.c为例,首先用户进程会调用在main函数中的如下语句: int fd1 = safe_open("sfs\_filetest1", O_RDONLY); 从字面上可以看出,如果ucore能够正常查找到这个文件,就会返回一个代表文件的文

  • 在这节,我们使我们的应用程序展示命令行传来的文件的正文。 在这后面,我们为我们的应用程序的窗口子类增加了一个私有的结构体,结构体内是一个指向GtkStack的指针。gtk_widget_class_bind_template_child_private()函数使得在实例化模板后,私有结构体中的stack成员会指向模板中的同名部件。 ... struct _ExampleAppWindowPriv