Можно ли получить каталог определенного окна nautilus в сценарии?

Я хотел бы создать скрипт 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.

Есть ли способ сделать то, что я хочу, используя встроенные или устанавливаемые инструменты apt-get/pip в Ubuntu?


person Erotemic    schedule 27.06.2018    source источник
comment
Вы смотрели wiki.gnome.org/Projects/NautilusPython?   -  person SomeGuyOnAComputer    schedule 21.01.2019
comment
@Erotemic, возможно, я захочу изучить предложение SomeGuyOnAComputer. Вам потребуется доступ к следующему каталогу: ~/.local/share/nautilus-python/extensions. Есть ли у вас доступ для записи в этот каталог, и является ли размещение файла для вас приемлемым решением?   -  person Him    schedule 21.01.2019
comment
Это не очень ясно относительно вашей конечной цели. С моей точки зрения, я думаю, вы хотите знать, открыл ли этот каталог nautilus или какое-либо приложение? В этом случае нужно использовать некоторые возможности системы.   -  person sancelot    schedule 22.01.2019
comment
Моя конечная цель — поместить это в свой набор инструментов gvim (github.com/Erotemic/vimtk), который предоставляет команды для взаимодействия с оконной системой. Этот вопрос касается бэкэнда nautilus. Итак, меня просто волнует, есть ли окно nautilus, в котором в данный момент отображается каталог в фоновом режиме. (Если оно открыто, мое приложение просто выделит окно, иначе откроет его).   -  person Erotemic    schedule 23.01.2019


Ответы (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. Вы действительно должны куда-то ориентироваться. Другими словами, если в строке заголовка указано «Дом», вы находитесь в домашней папке и никуда не перемещались.

person Him    schedule 21.01.2019
comment
Вы можете дополнительно очистить регулярное выражение Python с помощью awk: $ wmctrl -lxp | awk '$4 ~ /nautilus\.Nautilus/ {print $6}' Это позволит получить имена файлов для всех открытых окон nautilus. - person Him; 21.01.2019
comment
Это хорошее начало, но не совсем то, на что я надеялся. Я не возражаю против установки пакетов зависимостей, но я не хочу изменять поведение системы по умолчанию. Функция, которую я пишу, предназначена для пакета, который можно будет установить на многих пользовательских компьютерах, поэтому, к сожалению, я не могу заставить их всех зарегистрировать это расширение. - person Erotemic; 23.01.2019
comment
Вы пишете setup.py для пакета? Вы можете setup.py установить расширение для себя. Вы по-прежнему однако нужно apt-get установить nautilus-python. - person Him; 23.01.2019
comment
Проблема в том, что текущий просматриваемый каталог является объектом памяти, принадлежащим процессу Nautilus. Чтобы поделиться им, этот объект памяти должен быть общим, или информация, записанная в файл, или в сокет, или что-то в этом роде. Поскольку поведение Nautilus по умолчанию не предоставляет информацию, доступ к ней запрещен, поскольку нам нужно волшебным образом узнать адрес памяти информации, а затем запросить эту информацию у ОС. Однако, используя расширения, мы можем получить общий доступ к Nautilus. - person Him; 23.01.2019
comment
Действительно, приведенный выше вариант записи информации в строку заголовка довольно хакерский. Вы также можете сделать так, чтобы указанное выше расширение делилось информацией, например, записывая в файл вместо записи в строку заголовка. Тем не менее, вам все еще нужно расширение. - person Him; 23.01.2019
comment
У меня есть setup.py, но установка расширения кажется немного хакерской. Однако, основываясь на ваших двух других сообщениях, кажется, что иначе это невозможно. Я надеялся, что есть API-интерфейс nautilus, который поделится информацией, но, похоже, нет. Хотя это отрицательный ответ, он отвечает на мой вопрос. - person Erotemic; 23.01.2019