我正在使用以下函数允许操作系统打开与相关文件类型关联的第三方应用程序。例如:如果变量“fileToOpen”链接到一个名为flower.psd的文件(当然是完整路径),这个函数将在Windows中打开Photoshop,在Linux中打开Gimp(通常)。
def launchFile(fileToOpen):
if platform.system() == 'Darwin': # macOS
subprocess.call(('open', fileToOpen))
elif platform.system() == 'Windows': # Windows
os.startfile(fileToOpen)
else: # linux variants
subprocess.call(('xdg-open', fileToOpen))
当它运行时,我希望有相同的python脚本监控该文件的使用,并在第三方应用程序使用完该文件后将其删除(意思是...第三方应用程序关闭了psd文件或第三方应用程序本身关闭并释放了该文件)。
我试过使用psutil和pywin 32,但似乎都不能在Windows 10和Python3.9中使用。有人成功地使用了这个吗?如果是的话,你是如何获得第三方应用程序的进程,同时又不会从Windows中获得权限错误的?
理想情况下,我希望得到一个可以在Windows、Mac和Linux上工作的解决方案,但目前我会接受Windows 10的任何帮助,因为通过***ps -ax的命令行帮助可以更容易地找到Mac和Linux|grep %文件名%***命令
请记住,这将理想地跟踪任何文件。TIA为您提供帮助。
根据请求更新:我试着将这段代码添加到我的代码中(来自之前的建议),即使这段代码单独出现在pythontest.py文件中,也会产生权限错误:
import psutil
for proc in psutil.process_iter():
try:
# this returns the list of opened files by the current process
flist = proc.open_files()
if flist:
print(proc.pid,proc.name)
for nt in flist:
print("\t",nt.path)
# This catches a race condition where a process ends
# before we can examine its files
except psutil.NoSuchProcess as err:
print("****",err)
下面代码不会显示错误,但不会检测到正在使用的文件:
import psutil
from pathlib import Path
def has_handle(fpath):
for proc in psutil.process_iter():
try:
for item in proc.open_files():
if fpath == item.path:
return True
except Exception:
pass
return False
thePath = Path("C:\\Users\\someUser\\Downloads\\Book1.xlsx")
fileExists = has_handle(thePath)
if fileExists :
print("This file is in use!")
else :
print("This file is not in use")
2条答案
按热度按时间92dk7w1h1#
找到了!另一篇文章的原始推荐忘记了一个函数..."Path"进程列表中的item. path作为字符串返回。这需要转换为Path对象,以便与您自己的路径对象进行比较。
因此这一行:
应为:
下面是完整的代码:
z2acfund2#
基于@Frankie的回答,我编写了这个脚本。上面的脚本每个文件花费了16.1秒,因为
proc.open_files()
相当慢。下面的脚本检查目录中的所有文件,并返回与每个打开的文件相关的pid。17个文件仅花费了2.9s进行检查。这是因为proc.open如果文件的默认应用程序在内存中打开,则仅调用www.example.com _files()。
由于这是用来检查文件夹是否可以移动,该pid可以在以后用来强制**关闭锁定应用程序,但请注意,该应用程序可能会打开其他文档,所有数据都将丢失。
这不会检测打开的txt文件,或者可能不会检测没有默认应用程序的文件