Gio.Volume监视器:get_volumes()未更新



我想验证我的智能手机是否通过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()))

这个脚本工作正常,如果智能手机已连接或没有其他连接,它会向我发回智能手机的名称。

但如果我对下面的循环做同样的事情,结果总是第一个循环的结果,即使我在两个循环之间连接或断开智能手机。

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对话框与用户交互。

我显示这些不同的状态:

  • 通过USB电缆连接:是/否
  • 已安装mtp:是/否
  • 智能手机授权转账:是/否

根据这些不同的可能状态,我可以引导用户获得所有这些状态的

当一切正常时,我提议从智能手机到Debian运行增量备份(rsync--link-dest(。我让他在zenity进度条前等着。

为了显示不同的状态,我目前正在通过解析的输出来使用glib的gio二进制文件

  • 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')

我也考虑过你的解决方案,效果很好。但我不知道如何将油嘴滑舌的主循环集成到我的脚本中。

(环境:Debian Buster,xfce,libmtp,gvfs-mtp后端,gvfs fuse(

你不应该使用while循环,但你应该使用glib-mainloop来使它工作并监听连接,你的程序也应该监听mainloop中发出的信号,请参阅下面修改的脚本:

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()

相关内容

  • 没有找到相关文章

最新更新