是否可以在脚本中获取特定 nautilus window 的目录?
Is it possible to get the directory of a specific nautilus window in a script?
我想构建一个 Python 脚本来检查特定目录是否在 nautilus 中打开。
到目前为止,我最好的解决方案是使用 wmctrl -lxp
列出所有 windows,
这给了我这样的输出:
0x0323d584 0 1006 nautilus.Nautilus namek Downloads
0x0325083a 0 1006 nautilus.Nautilus namek test
0x04400003 0 25536 gvim.Gvim namek yolo_voc.py + (~/code/netharn/netharn/examples) - GVIM4
然后我检查我感兴趣的目录的基本名称是否在 nautilus.Nautilus
windows 的 window 名称中。
这是我刚才描述的不完整解决方案的代码:
def is_directory_open(dpath):
import ubelt as ub # pip install me! https://github.com/Erotemic/ubelt
import platform
from os.path import basename
import re
computer_name = platform.node()
dname = basename(dpath)
for line in ub.cmd('wmctrl -lxp')['out'].splitlines():
parts = re.split(' *', line)
if len(parts) > 3 and parts[3] == 'nautilus.Nautilus':
if parts[4] == computer_name:
# FIXME: Might be a False positive!
line_dname = ' '.join(parts[5:])
if line_dname == dname:
return True
# Always correctly returns False
return False
这绝对可以确定它是否未打开,这只是让我到目前为止,因为它可能 return 误报。如果我想检查 /foo/test
是否打开,我无法判断第二行是指该目录还是其他路径,其中最终目录名为 test
。例如。我无法区分 /foo/test
和 /bar/test
。
有什么方法可以在 Ubuntu 上使用内置或 apt-get / pip 可安装工具来做我想做的事吗?
使用@SomeGuyOnAComputer 的建议:
首先,获取 nautilus python 绑定:
$ sudo apt install python-nautilus
创建一个目录来存放您的 nautilus python 扩展:
$ mkdir -p ~/.local/share/nautilus-python/extensions
显然,nautilus python 只是读取该文件夹中的扩展并自动使用它们。
这是一个简单的扩展,将文件 uri 放入标题栏:
from gi.repository import Nautilus, GObject, Gtk
class ColumnExtension(GObject.GObject, Nautilus.LocationWidgetProvider):
def __init__(self):
pass
def get_widget(self, uri, window):
window.set_title(uri)
将其放入 "extension.py" 并将其转储到上面创建的文件夹中。重新启动鹦鹉螺。就像杀死任何 nautilus 进程并重新启动它们一样。一个简单的方法就是重新启动您的机器。
这会将文件 uri 放入标题栏中,这是您当前脚本抓取的内容。换句话说,你可以简单地继续做你一直在做的事情,它现在会给你完整的路径。
请注意,这在 Nautilus 首次启动时似乎不起作用。你必须实际导航到某个地方。换句话说,如果标题栏显示 "Home",则您位于主文件夹中,没有导航到任何地方。
我想构建一个 Python 脚本来检查特定目录是否在 nautilus 中打开。
到目前为止,我最好的解决方案是使用 wmctrl -lxp
列出所有 windows,
这给了我这样的输出:
0x0323d584 0 1006 nautilus.Nautilus namek Downloads
0x0325083a 0 1006 nautilus.Nautilus namek test
0x04400003 0 25536 gvim.Gvim namek yolo_voc.py + (~/code/netharn/netharn/examples) - GVIM4
然后我检查我感兴趣的目录的基本名称是否在 nautilus.Nautilus
windows 的 window 名称中。
这是我刚才描述的不完整解决方案的代码:
def is_directory_open(dpath):
import ubelt as ub # pip install me! https://github.com/Erotemic/ubelt
import platform
from os.path import basename
import re
computer_name = platform.node()
dname = basename(dpath)
for line in ub.cmd('wmctrl -lxp')['out'].splitlines():
parts = re.split(' *', line)
if len(parts) > 3 and parts[3] == 'nautilus.Nautilus':
if parts[4] == computer_name:
# FIXME: Might be a False positive!
line_dname = ' '.join(parts[5:])
if line_dname == dname:
return True
# Always correctly returns False
return False
这绝对可以确定它是否未打开,这只是让我到目前为止,因为它可能 return 误报。如果我想检查 /foo/test
是否打开,我无法判断第二行是指该目录还是其他路径,其中最终目录名为 test
。例如。我无法区分 /foo/test
和 /bar/test
。
有什么方法可以在 Ubuntu 上使用内置或 apt-get / pip 可安装工具来做我想做的事吗?
使用@SomeGuyOnAComputer 的建议:
首先,获取 nautilus python 绑定:
$ sudo apt install python-nautilus
创建一个目录来存放您的 nautilus python 扩展:
$ mkdir -p ~/.local/share/nautilus-python/extensions
显然,nautilus python 只是读取该文件夹中的扩展并自动使用它们。
这是一个简单的扩展,将文件 uri 放入标题栏:
from gi.repository import Nautilus, GObject, Gtk
class ColumnExtension(GObject.GObject, Nautilus.LocationWidgetProvider):
def __init__(self):
pass
def get_widget(self, uri, window):
window.set_title(uri)
将其放入 "extension.py" 并将其转储到上面创建的文件夹中。重新启动鹦鹉螺。就像杀死任何 nautilus 进程并重新启动它们一样。一个简单的方法就是重新启动您的机器。
这会将文件 uri 放入标题栏中,这是您当前脚本抓取的内容。换句话说,你可以简单地继续做你一直在做的事情,它现在会给你完整的路径。
请注意,这在 Nautilus 首次启动时似乎不起作用。你必须实际导航到某个地方。换句话说,如果标题栏显示 "Home",则您位于主文件夹中,没有导航到任何地方。