Python:确定另一个应用程序是否打开了文件的有效方法

Python:确定另一个应用程序是否打开了文件的有效方法,python,Python,我想通过Python脚本查找应用程序是否打开了文件。我知道有很多建议,但似乎没有一个能完全满足我的要求。我试过很多解决办法。但仍然无法获得预期的行为。我想要的是当python脚本试图打开pdf阅读器打开的文件时引发一个异常。例如,如果我用pdf阅读器打开一个文件,并尝试通过Python脚本打开/重命名它,它应该会引发一个异常。我尝试了多段代码: try: myfile = open("myfile.csv", "r+") # or "a+", whatever you need exce

我想通过Python脚本查找应用程序是否打开了文件。我知道有很多建议,但似乎没有一个能完全满足我的要求。我试过很多解决办法。但仍然无法获得预期的行为。我想要的是当python脚本试图打开pdf阅读器打开的文件时引发一个异常。例如,如果我用pdf阅读器打开一个文件,并尝试通过Python脚本打开/重命名它,它应该会引发一个异常。我尝试了多段代码:

try:
    myfile = open("myfile.csv", "r+") # or "a+", whatever you need
except IOError:
    print "Could not open file! Please close Excel!"

with myfile:
    do_stuff()
在这篇文章中,我测试了许多脚本,但没有一个能够完美地工作。当我重命名pdf文件时,即使它处于打开状态,也会在最后接受重命名


这让我怀疑这是不可能的,还是我做错了。

你是对的,没有多少(任何?)优雅的解决方案。这里有一个我发现有效的跨平台方法(在大多数情况下)

测试锁文件是否存在。

在Windows上: 在Win Exploder中看不到这一点,但是如果在文件的目录中运行
os.listdir()
,您应该会看到一个
~$myfile.xlsx
锁定文件。命名约定是标准的(据我所知),因此您可以测试该文件是否存在;或者更好的方法是进行正则表达式搜索

在Linux上: 与Win解决方案类似,查找锁或交换文件,通常命名为
~lock.myfile.xlsx#
.myfile.txt.swp

系统管理员: 如果你觉得合适,请随意编辑这篇文章。这些只是我在这一过程中偶然发现的一些简单的发现

希望这能有所帮助……

一种方法是调用或其等价物,具体取决于操作系统:

导入子流程
导入系统
def是文件打开的任何进程(路径:str)->bool:
如果sys.platform位于[“linux”,“darwin”]:
fnull=open(os.devnull,“w”)#将输出重定向到devnull
retcode=subprocess.call([“lsof”,path],stdout=fnull,stderr=subprocess.stdout)
如果retcode==0:
返回真值
返回错误
其他:
raise NOTEImplementedError(f“未为sys.platform:{sys.platform}实现”)

我认为没有任何通用的方法可以做到这一点。只有特权用户才能知道其他用户打开了哪些文件。