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