Python脚本修改Thunar书签失效,关闭程序后书签恢复求助
Thunar书签编辑后重启恢复的原因与优化方案
问题描述
在Linux环境下用PySide6编写脚本编辑Thunar书签,移除指定的MyBookmark时,脚本执行后磁盘上的书签文件已成功修改,但关闭Thunar后书签会恢复。该问题仅在Thunar处于打开状态时出现,目前通过killall thunar强制杀死进程可解决,但方案不够优雅。
问题原因
- Thunar运行时会将书签文件加载到内存中,所有界面上的书签操作先在内存中处理,仅当Thunar正常退出且期间用户修改过书签时,才会将内存中的数据写回
~/.config/gtk-3.0/bookmarks文件。 - 脚本直接修改磁盘文件后,Thunar进程并未感知到这个外部修改。当Thunar退出时,若内存中的书签数据与磁盘文件不一致(且用户未在界面修改过书签),它会用内存里的旧数据覆盖修改后的文件,导致书签恢复。
优化解决办法
1. 用GIO API通知Thunar刷新书签(推荐)
Thunar遵循GTK桌面配置规范,通过GIO接口可直接通知Thunar书签文件已修改,让它实时读取新内容,无需重启进程。
示例代码:
import os import gi gi.require_version('Gio', '2.0') from gi.repository import Gio def remove_target_bookmark(target_path): bookmarks_path = "/home/user/.config/gtk-3.0/bookmarks" # 读取现有书签并过滤目标项 if os.path.exists(bookmarks_path): with open(bookmarks_path, 'r') as f: bookmarks = f.readlines() new_bookmarks = [line for line in bookmarks if target_path not in line] # 写入修改后的书签 with open(bookmarks_path, 'w') as f: f.writelines(new_bookmarks) # 发送文件变更通知,触发Thunar刷新 bookmarks_file = Gio.File.new_for_path(bookmarks_path) bookmarks_file.emit_changed(Gio.FileMonitorEvent.CHANGED) # 调用移除指定书签 remove_target_bookmark("/home/user/MyBookmark")
2. 优雅重启Thunar(替代方案)
如果不想引入GIO依赖,可以用正常退出再重启的方式,避免强制杀死进程:
import os # 正常退出Thunar os.system('thunar -q 2>/dev/null') # 后台重启Thunar os.system('thunar &')
原代码的小问题修正
原代码中的循环删除逻辑存在索引错误风险(当有多个匹配项时,pop(i)会导致后续索引错位),建议改用列表推导式过滤:
# 替换原有的循环删除代码 self.bookmarks = [line for line in self.bookmarks if "/home/user/MyBookmark" not in line]
另外,with语句会自动关闭文件,无需手动调用file.close(),原代码中的两次file.close()都是多余的。
内容的提问来源于stack exchange,提问作者samueldelorenzi
相关产品推荐
相关产品推荐

