是否可以在脚本中获取特定鹦鹉螺窗口的目录?

Ero*_*mic 5 python ubuntu nautilus wmctrl

我想构建一个Python脚本来检查是否在nautilus中打开了特定目录。

到目前为止,我拥有的最佳解决方案是使用wmctrl -lxp列出所有窗口的方法,这使我得到如下输出:

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
Run Code Online (Sandbox Code Playgroud)

然后,我检查感兴趣的目录的基本名称是否在nautilus.NautilusWindows的窗口名称中。

这是我刚刚描述的不完整解决方案的代码:

    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
Run Code Online (Sandbox Code Playgroud)

可以肯定地确定它是否未打开,这只能让我知道,因为它可能会返回误报。如果要检查是否/foo/test已打开,则无法确定第二行是否指向该目录或其他路径,该目录的最终目录名为test。例如我无法/foo/test/bar/test

有什么方法可以在Ubuntu上使用内置或apt-get / pip可安装工具来完成我想做的事情吗?

Sco*_*ott 4

使用@SomeGuyOnAComputer的建议:

首先,获取 nautilus python 绑定:

$ sudo apt install python-nautilus
Run Code Online (Sandbox Code Playgroud)

创建一个目录来保存 nautilus python 扩展:

$ mkdir -p ~/.local/share/nautilus-python/extensions
Run Code Online (Sandbox Code Playgroud)

显然, 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)
Run Code Online (Sandbox Code Playgroud)

将其放入“extension.py”并将其转储到上面创建的文件夹中。重新启动鹦鹉螺。就像杀死所有 nautilus 进程并重新启动它们一样。执行此操作的一个简单方法是重新启动计算机。

这会将文件 uri 放入标题栏,这是当前脚本抓取的内容。换句话说,您可以简单地继续做您一直在做的事情,它现在将为您提供完整的路径。

请注意,当 Nautilus 首次启动时,这似乎不起作用。你必须实际导航到某个地方。换句话说,如果标题栏显示“Home”,则您位于主文件夹中,并且尚未导航到任何地方。