如何用Python脚本在MacOS上启停Preview、TextEdit并重复执行流程?
实现MacOS下重复打开指定文件并等待用户输入后关闭的最佳方案
嘿,我来帮你搞定这个需求!你之前用subprocess.Popen调用open命令打开应用的思路是对的,但问题在于open只是触发系统启动对应App,Python手里的Popen对象其实是open这个小进程,不是Preview或TextEdit本身,所以直接用terminate()根本关不掉应用窗口。下面是最稳妥的实现方式:
核心思路
因为Mac的应用窗口管理依赖系统服务,我们需要用AppleScript来精确控制Preview和TextEdit的窗口(而不是粗暴杀掉整个应用),这样既不会影响用户可能打开的其他同应用窗口,又能准确关闭指定文件的窗口。然后配合Python的循环和输入等待,就能实现重复执行的流程。
完整代码实现
import subprocess def main(): # 替换成你的文件路径 PDF_PATH = "/Users/xxx/Documents/test.pdf" TXT_PATH = "/Users/xxx/Documents/note.txt" # 提取文件名,用于匹配窗口(避免路径过长导致窗口名匹配失败) PDF_FILENAME = PDF_PATH.split("/")[-1] TXT_FILENAME = TXT_PATH.split("/")[-1] while True: # 1. 打开指定文件 print("正在打开文件...") # 打开PDF到Preview subprocess.Popen(['open', '-a', 'Preview', PDF_PATH]) # 打开文本到TextEdit:如果需要只读打开,把下面一行改成带'-R'参数的版本 # subprocess.Popen(['open', '-a', 'TextEdit', '-R', TXT_PATH]) subprocess.Popen(['open', '-a', 'TextEdit', TXT_PATH]) # 2. 等待用户输入后执行关闭操作 input("\n查看/编辑完成后,按回车键关闭窗口...") # 3. 关闭指定文件的窗口 print("正在关闭窗口...") # 关闭Preview中对应的PDF窗口 preview_script = f''' tell application "Preview" close (every window whose name ends with "{PDF_FILENAME}") end tell ''' subprocess.run(['osascript', '-e', preview_script], capture_output=True) # 关闭TextEdit中对应的文本窗口:saving yes 自动保存编辑内容,saving no 放弃保存 textedit_script = f''' tell application "TextEdit" close (every window whose name ends with "{TXT_FILENAME}") saving yes end tell ''' subprocess.run(['osascript', '-e', textedit_script], capture_output=True) # 4. 询问是否继续循环 choice = input("\n是否继续执行下一轮?(输入y继续,其他键退出): ").strip().lower() if choice != 'y': print("退出程序...") break if __name__ == "__main__": main()
关键细节说明
为什么不用
pkill杀进程?
直接用subprocess.run(['pkill', 'Preview'])虽然能关闭应用,但会杀掉该应用的所有窗口,如果你或者用户还有其他Preview窗口在运行,这就会造成数据丢失或不便。用AppleScript匹配文件名关闭窗口更精准。只读打开文本文件
如果不需要编辑文本,只需查看,打开TextEdit时加上-R参数即可:subprocess.Popen(['open', '-a', 'TextEdit', '-R', TXT_PATH])窗口匹配逻辑
用name ends with "{FILENAME}"是因为Mac应用的窗口名有时会加上后缀(比如TextEdit未保存的文件会显示"文件名 - 未保存"),用后缀匹配能覆盖这些情况。
内容的提问来源于stack exchange,提问作者st2 tas
相关产品推荐
相关产品推荐

