Gio.VolumeMonitor: get_volumes () не обновляется? - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу убедиться, что мой смартфон правильно подключен через USB для передачи файлов через MTP.

from gi.repository import Gio
volume_monitor = Gio.VolumeMonitor.get()
for volume in volume_monitor.get_volumes():
    activation_root = volume.get_activation_root()
    if activation_root:
        if activation_root.get_uri_scheme() == 'mtp':
            print('mtp found: name = {}'.format(volume.get_name()))

Этот скрипт работает правильно и возвращает мне имя смартфона, если он подключен или ничего другого .

Но если я сделаю то же самое с al oop, как показано ниже, результат всегда будет первым l oop, даже если я подключу или отключу смартфон между двумя циклами.

from gi.repository import Gio
answer = "y"
while answer=="y":
    volume_monitor = Gio.VolumeMonitor.get()
    for volume in volume_monitor.get_volumes():
        activation_root = volume.get_activation_root()
        if activation_root:
            if activation_root.get_uri_scheme() == 'mtp':
                print('mtp found: name = {}'.format(volume.get_name()))
    answer = input("Retry?")

Что я пропустил?

PS: идентичная проблема, описанная здесь: Объект модуля не обновится, пока код не будет перезапущен


Редактировать после ответа от gianmt

У меня есть сценарий python, который взаимодействует с пользователем через zenity диалогов.

I отображать следующие состояния:

  • подключение по USB-кабелю: да / нет
  • mtp установлен: да / нет
  • передача разрешена на смартфоне: да / нет

По этим различным возможным состояниям я могу руководствоваться Пользователь может да во всех этих состояниях.

Когда все в порядке, я предлагаю запустить инкрементное резервное копирование (rsync с --link-dest) со смартфона на Debian. Я заставляю его ждать перед индикатором выполнения zenity.

Чтобы отобразить различные состояния, я в настоящее время использую двоичный файл gio для glib, анализируя выходные данные:

  • gio mount -li
  • gio info mtp://smarphone_hostname/
  • gio info mtp://smarphone_hostname/ | grep filesystem::size

Я хотел использовать следующие объекты и методы:

  • Gio.VolumeMonitor: get_volumes()
  • Gio.Volume: get_activation_root()
  • Gio.File: get_path(), query_filesystem_info('filesystem :: size')

Ваше решение, которое я тоже считал, работает очень хорошо. Но я не понимаю, как интегрировать glib mainl oop в мой скрипт.

(Среда: Debian Buster, xfce, libmtp, gvfs-mtp-backend, gvfs-fuse)

1 Ответ

0 голосов
/ 27 апреля 2020

Вы не должны использовать некоторое время l oop, но вы должны использовать glib mainl oop, чтобы заставить его работать и прослушивать соединения, также ваша программа должна прослушивать сигнал, излучаемый в mainl oop, см. ваш скрипт, измененный здесь ниже:

from gi.repository import Gio, GLib

main = GLib.MainLoop()

def on_volume_added(monitor, volume):
    print (volume.get_name())

volume_monitor = Gio.VolumeMonitor.get()
volume_monitor.connect("volume-added", on_volume_added)

for volume in volume_monitor.get_volumes():
    activation_root = volume.get_activation_root()
    if activation_root:
        if activation_root.get_uri_scheme() == 'mtp':
            print('mtp found: name = {}'.format(volume.get_name()))

main.run()
...