Я хочу убедиться, что мой смартфон правильно подключен через 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)