我想打开一个由另一个应用程序定期写入的文件.此应用程序无法修改.因此,当我知道文件未被其他应用程序写入时,我只想打开该文件.
有没有pythonic方式来做到这一点?否则,我如何在Unix和Windows中实现这一目标?
编辑:我会尽力澄清.有没有办法检查当前文件是否已被其他应用程序打开?
我想从这个问题开始.那些其他应用程序读/写是否与现在无关.
我意识到它可能依赖于操作系统,所以现在可能并不真正与python相关.
你的python脚本是否希望打开文件进行写作或阅读?遗留应用程序是在写入之间打开和关闭文件,还是将其保持打开状态?
了解遗留应用程序正在做什么以及您的python脚本试图实现的目标非常重要.
这个功能区域高度依赖于操作系统,而且您无法控制遗留应用程序这一事实使得事情变得更加困难.无论是pythonic还是非pythonic方式,这可能是你最不关心的问题 - 难的问题是你想要实现的目标是否可行.
UPDATE
好的,所以(从你的评论中)知道:
遗留应用程序每隔X分钟打开和关闭文件,但我不想假设在t = t_0 + n*X + eps它已经关闭了文件.
那么问题的参数就会改变.实际上,它可以在一些独立于OS的方式中完成,只需要一些假设,或者作为OS依赖和OS独立技术的组合.:)
独立于操作系统的方式:如果可以安全地假设遗留应用程序保持文件打开最多一段已知的时间,例如T
秒(例如打开文件,执行一次写入,然后关闭文件),然后重新打开它或多或少每秒X
,X
大于2*T
.
stat
文件
减去文件的修改时间从now()
,产生D
if T
<= D
< X
然后打开文件,用它做你需要的
这对您的应用来说可能足够安全.安全性随着T
/ X
减少而增加.在*nix上,您可能需要仔细检查/etc/ntpd.conf
正确的时间步长与转换配置(请参见修补程序).对于Windows,请参阅MSDN
Windows:除上述(或代替)上述独立于操作系统的方法外,您可以尝试使用以下任一方法:
共享(锁定):这假设旧程序还以共享模式打开文件(通常是Windows应用程序中的默认设置); 此外,如果您的应用程序在遗留应用程序尝试相同(竞争条件)时获取锁定,则遗留应用程序将失败.
这是非常侵入性和容易出错的.除非新应用程序和遗留应用程序都需要同步访问以写入同一文件,并且您愿意处理遗留应用程序被拒绝打开文件的可能性,否则请勿使用此方法.
试图找出遗留应用程序中打开的文件,使用与ProcessExplorer相同的技术(相当于*nix的lsof
)
与独立于操作系统的技术相比,你更容易受到竞争条件的影响
Linux的/等.:另外(或代替)上面独立于操作系统的方法,您可以尝试使用相同的技术,lsof
或者,在某些系统上,只需检查符号链接/proc/
指向
哪个文件
与独立于操作系统的技术相比,你更容易受到竞争条件的影响
遗留应用程序使用锁定的可能性极小,但如果是,则锁定不是一个真正的选项,除非遗留应用程序可以正常处理锁定的文件(通过阻塞而不是失败) - 如果您自己的应用程序可以保证该文件将不会保持锁定状态,阻止遗留应用程序延长一段时间.)
更新2
如果赞成"检查遗留应用程序是否打开文件"(侵入性方法容易出现竞争条件),那么您可以通过以下方式解决上述竞争条件:
检查遗留应用程序是否打开了文件(la lsof
或ProcessExplorer
)
暂停遗留申请流程
重复步骤1中的检查以确认遗留应用程序未在步骤1和2之间打开文件; 如果是,则在步骤1延迟并重新启动,否则继续执行步骤4
在文件上开展业务 - 理想情况下只需将其重命名以进行后续的独立处理,以便将遗留应用程序暂停一小段时间
恢复遗留申请流程