我想打开一个由另一个应用程序定期写入的文件。 这个应用程序不能被修改。 因此,我只想打开文件,当我知道它没有被其他应用程序写入。
有没有pythonic的方式来做到这一点? 否则,我如何在Unix和Windows中实现这一点?
编辑 :我会尝试澄清。 有没有办法来检查当前的文件是否已被其他应用程序打开?
我想从这个问题开始。 现在是否其他应用程序读/写是不相关的。
我意识到这可能是操作系统的依赖,所以这可能不是真正的python相关现在。
您的Python脚本是否希望打开文件以供书写或阅读? 遗留应用程序是在写入之间打开还是关闭文件,还是保持打开状态?
我们理解遗留应用程序正在做什么以及你的python脚本试图实现什么是非常重要的。
这个功能区域与操作系统高度相关,不能控制遗留应用程序的事实只会让事情变得更加困难。 无论是pythonic还是非pythonic的做法可能是你最担心的问题 – 难的问题是,你是否试图实现将是可能的。
UPDATE
好的,从你的评论中知道:
传统应用程序每隔X分钟打开和关闭文件,但是我不想假设在t = t_0 + n * X + eps它已经关闭了文件。
那么问题的参数就会改变。 实际上,在一些假设条件下,可以独立于操作系统的方式来完成,或者作为操作系统依赖和操作系统无关的技术的组合。 🙂
T
秒)是安全的,大约每X
秒打开一次,其中X
大于2 * T
stat
文件 now()
减去文件的修改时间now()
,产生D
T
<= D
< X
那么打开文件,并做它你需要的 T
/ X
下降,安全性增加 在* nix上,您可能需要仔细检查/etc/ntpd.conf
以确定正确的时间步长和摆动配置(请参阅修补程序)。 对于Windows请参阅MSDN lsof
)
lsof
相同的技术,或者在某些系统上只检查哪个文件符号链接/proc/<pid>/fd/<fdes>
指向
更新2
如果赞成“检查遗留应用程序是否打开文件”(侵入式方法容易出现竞态条件),则可以通过以下方式解决上述竞争条件:
ProcessExplorer
) Unix没有默认的文件锁定。 我对Unix环境的最好建议是查看lsof命令的源代码。 它对哪个进程有哪些文件打开有深刻的了解。 你可以用它作为解决方案的基础。 这里是lsof的Ubuntu源代码。
有一件事我已经做了python非常暂时重命名文件。 如果我们能够重命名它,那么没有其他进程正在使用它。 我只在Windows上测试过。