我正在尝试编写一个python脚本,该脚本将检测mtp设备(在本例中为Android手机)何时安装到raspberry pi 3(运行raspbian jessie)。我想在手机接通电源时自动将文件传输到手机。
this question
DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.systemd1.Manager was not provided by any .service files
我在一个类似的问题中读到,这是一个权限问题,所以我尝试以sudo./usb_系统的形式运行脚本。但是我仍然得到同样的错误。
我还尝试使用SessionBus而不是SystemBus。信号不同,总线名称为org.gtk.vfs.MountTracker。我仍然得到同样的错误,这次它说org.gtk.vfs。MountTracker不是可用的服务。当我尝试用sudo运行SessionBus版本时,我根本看不到信号。
我是否使用了get\u object()函数的正确输入?正确的公交车类型是什么?由于信号是广播的,所以没有目的地总线,我不确定这是否是问题的一部分。我对linux和信号/总线的理解非常有限。
import dbus
import dbus.service
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GLib
import sys
import os
class DeviceManager:
def __init__(self):
self.bus = dbus.SystemBus()
self.bus.add_signal_receiver(self.device_added,
'UnitNew',
'org.freedesktop.systemd1.Manager',
None,
'/org/freedesktop/systemd1',
path_keyword='path')
self.bus.add_signal_receiver(self.device_removed,
'UnitRemoved',
'org.freedesktop.systemd1.Manager',
None,
'/org/freedesktop/systemd1',
path_keyword='path')
self.bus.add_signal_receiver(self.print_event, None, None, None, None,
sender_keyword='sender', message_keyword='message')
def path_to_device(self, path):
return self.bus.get_object('org.freedesktop.systemd1.Manager', path)
def device_added(self, *args, **kwds):
path = kwds['path']
print 'Added', path
properties = self.path_to_device(path).GetAllProperties()
print properties.get('info.category')
if properties.get('info.category') == u'volume':
label, dev = properties.get('volume.label'), properties.get('block.device')
print 'Mounting %s on /mnt/%s' %(dev, label)
def device_removed(self, *args, **kwds):
path = kwds['path']
print 'Removed', path
def print_event(*args, **sender):
print "got signal from:"
print sender
if __name__ == '__main__':
DBusGMainLoop(set_as_default=True)
m = DeviceManager()
mainloop = GLib.MainLoop()
try:
mainloop.run()
except KeyboardInterrupt:
mainloop.quit()
print 'Exiting...'
sys.exit(0)