【问题标题】:Is it possible to get the directory of a specific nautilus window in a script?是否可以在脚本中获取特定 nautilus 窗口的目录?
【发布时间】:2018-06-27 19:54:41
【问题描述】:

我想构建一个 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

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

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

    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

这绝对可以确定它是否未打开,这只能让我到目前为止,因为它可能会返回误报。如果我想检查/foo/test 是否打开,我无法判断第二行是指该目录还是其他路径,最终目录名为test。例如。我无法区分 /foo/test/bar/test

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

【问题讨论】:

  • @Erotemic,我可能愿意探索 SomeGuyOnAComputer 的建议。您将需要访问以下目录:~/.local/share/nautilus-python/extensions。您是否对该目录具有写入权限,并且将文件放在那里对您来说是一个可行的解决方案?
  • 这不是很清楚你的最终目标。从我的角度来看,我想您想知道 nautilus 或任何应用程序是否打开了此目录?在这种情况下,您需要使用一些系统功能。
  • 我的最终目标是把它放在我的 gvim-toolkit (github.com/Erotemic/vimtk) 中,它提供了与窗口系统交互的命令。这个问题与 nautilus 后端有关。所以,我只关心当前是否有一个 nautilus 窗口在后台显示目录。 (如果它是打开的,我的应用程序只会使窗口成为焦点,否则它将打开它)。

标签: python ubuntu nautilus wmctrl


【解决方案1】:

使用@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 首次启动时,这似乎不起作用。您必须实际导航到某个地方。换句话说,如果标题栏显示“主页”,则您在主文件夹中,并且没有导航到任何地方。

【讨论】:

  • 你可以使用awk:$ wmctrl -lxp | awk '$4 ~ /nautilus\.Nautilus/ {print $6}'进一步清理你的python正则表达式,这将获得所有打开的鹦鹉螺窗口的文件名。
  • 这是一个好的开始,但不是我所希望的。我不介意安装依赖包,但我不想修改系统的默认行为。我正在编写的功能是针对可以在许多用户机器上进行 pip 安装的包,所以很遗憾,我不能强制他们都注册这个扩展。
  • 您正在为包裹写setup.pyYou can have setup.py install the extension for you. 不过,你仍然需要 apt-get install nautilus-python。
  • 问题是当前查看的目录是属于Nautilus进程的内存对象。为了共享它,需要共享该内存对象,或者将信息写入文件,或写入套接字,或类似的东西。由于 Nautilus 的默认行为不提供信息,因此禁止访问它,因为我们需要神奇地知道信息的内存地址,然后 query the OS 获取该信息。但是,使用扩展,我们可以拥有 Nautilus 共享。
  • 确实,将信息写入标题栏的上述选项有点骇人听闻。您还可以让上述扩展程序通过例如写入文件而不是写入标题栏来共享信息。不过,您仍然需要扩展。
猜你喜欢
  • 1970-01-01
  • 2020-05-15
  • 2018-03-05
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多