কীভাবে একটি ডিবিএস পরিষেবার আওতায় সমস্ত অবজেক্ট পাথ তালিকাভুক্ত করবেন?


16

এটি উপলব্ধ ডিবিএস পরিষেবাদির তালিকার একটি ফলো-আপ প্রশ্ন ।

নিম্নলিখিত পাইথন কোডটি সমস্ত উপলভ্য ডিবিস পরিষেবাদি তালিকাভুক্ত করবে।

import dbus
for service in dbus.SystemBus().list_names():
    print(service)

পাইথনের পরিষেবাগুলির অধীনে আমরা কীভাবে অবজেক্টের পাথগুলি তালিকাভুক্ত করব? উত্তরটি পাইথন থাকলেও উত্তরে অজগরটিকে জড়িত না করা ঠিক আছে।

আমি উবুন্টু 14.04 ব্যবহার করছি


উত্তরটি পাইথন থাকলেও উত্তরে অজগরটিকে জড়িত না করা ঠিক আছে।
user768421

উত্তর:


15

অফিসিয়াল ডক্স অনুসারে ( স্ট্যান্ডার্ড ইন্টারফেসের অধীনে ):

কিছু স্ট্যান্ডার্ড ইন্টারফেস রয়েছে যা বিভিন্ন ডি-বাস অ্যাপ্লিকেশন জুড়ে কার্যকর হতে পারে।

org.freedesktop.DBus.Introspectable

এই ইন্টারফেসের একটি পদ্ধতি রয়েছে:

org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)

অবজেক্টস উদাহরণগুলি কার্যকর করতে পারে Introspectযা তার ইন্টারফেস সহ (সিগন্যাল এবং পদ্ধতি সহ) অবজেক্টের একটি এক্সএমএল বিবরণ, অবজেক্ট পাথ ট্রি এবং এর বৈশিষ্ট্যগুলির নীচে বস্তুগুলি সরবরাহ করে।

সুতরাং এখানে একটি খুব সরল উদাহরণ যা আপনাকে শুরু করা উচিত। এটি ব্যবহার করে xml.etree.ElementTreeএবং dbus:

#!/usr/bin/env python

import dbus
from xml.etree import ElementTree

def rec_intro(bus, service, object_path):
    print(object_path)
    obj = bus.get_object(service, object_path)
    iface = dbus.Interface(obj, 'org.freedesktop.DBus.Introspectable')
    xml_string = iface.Introspect()
    for child in ElementTree.fromstring(xml_string):
        if child.tag == 'node':
            if object_path == '/':
                object_path = ''
            new_path = '/'.join((object_path, child.attrib['name']))
            rec_intro(bus, service, new_path)

bus = dbus.SystemBus()
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')

এটি org.freedesktop.UPowerউদাহরণস্বরূপ থেকে পুনরাবৃত্তভাবে অন্তর্মুখী হয় /org/freedesktop/UPowerএবং সমস্ত বস্তুর পাথ (নোডের নাম) মুদ্রণ করে:

/org/freedesktop/UPower
/org/freedesktop/UPower/Wakeups
/org/freedesktop/UPower/devices
/org/freedesktop/UPower/devices/DisplayDevice
/org/freedesktop/UPower/devices/battery_BAT0
/org/freedesktop/UPower/devices/line_power_ADP0

যা আপনি যদি ব্যবহার করেন d-feet( তবে এটির প্রয়োজন নেই এমনটিই আপনি পেতে পারেন) যা খুব সুন্দর :

এখানে চিত্র বর্ণনা লিখুন


অবশ্যই, আপনি সহজেই কমান্ড লাইনের মাধ্যমে অবজেক্টের পাথগুলি পেতে পারেন যেমন gdbus:

gdbus ইন্ট্রোস্পেক্ট - সিস্টেমে - সর্বশেষ org.freedesktop.UP পাওয়ার - অবজেক্ট-পাথ
/ org / ফ্রিডেস্কটপ / ইউপি পাওয়ার --recurse | awk '/ ^ * নোড / {2} প্রিন্ট করুন
/ সংস্থা / freedesktop / UPower
/ সংস্থা / freedesktop / UPower / Wakeups
/ সংস্থা / freedesktop / UPower / ডিভাইস
/ সংস্থা / freedesktop / UPower / ডিভাইস / DisplayDevice
/ সংস্থা / freedesktop / UPower / ডিভাইস / battery_BAT0
/ সংস্থা / freedesktop / UPower / ডিভাইস / line_power_ADP0

আমি qdbusইনস্টল করা হয়নি তবে এই পৃষ্ঠা অনুসারে

qdbus --system org.freedesktop.UPower

একই ফলাফল তৈরি করা উচিত।


আমি কীভাবে থেকে অবজেক্ট পাথের একটি তালিকা তৈরি করব rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')?
খুরশিদ আলম

না, আমি বলতে চাইছি অবজেক্ট পাথগুলির একটি অজগর তালিকা তৈরি করা, যাতে তালিকায় নির্দিষ্ট বস্তু-পথ উপস্থিত থাকলে আমি (আমার স্ক্রিপ্টে) চেক করতে পারি। এটি অবজেক্টপথ ঠিকঠাক মুদ্রণ করে।, তবে আমি এর মতো কিছু চাই k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')। আমি মনে করি ফাংশনটি সামান্য পরিবর্তন করে এটি সম্ভব হয়েছে।
খুরশিদ আলম

কিউবাস সহ উদাহরণ কোড:bus = dbus.SessionBus()..... obj_path = '/org/gnome/Gnote/RemoteControl'.......... cmd = 'qdbus org.gnome.Gnote'......... while obj_path not in ((subprocess.check_output(cmd, shell=True)).decode("utf-8")).split("\n"): ........pass
খুরশিদ আলম

@KhurshidAlam - একটি তালিকা আরম্ভ করার পূর্বে ফাংশন যেমন mylist=[]তারপর প্রতিস্থাপন printসঙ্গে mylist.appendযে ফাংশন ব্লক গত কমান্ড হিসাবে এবং তারপর return mylist- যে প্রায় কাছাকাছি আছে কি ... তারপর আপনি বারবার তালিকা ওভার বা যাই হোক না কেন স্ক্রিপ্ট নীচে যেমন যোগ করতে পারেন for x in mylist: print("OBJ_PATH", x)তাদের একটি OBJ_PATHউপসর্গ দিয়ে মুদ্রণ করা ...
don_crissti

4

আমি নিশ্চিত না যে আপনি পাইথনে প্রোগ্রামিয়ালি এটি করতে পারবেন। আপনি তবে এটি কীভাবে তা বোঝার জন্য এটি একটি বিশাল মাথাব্যথা হবে। আমি এটি করার আগে আগে চেষ্টা করেছিলাম এবং ডাবাসকে ঘৃণা করে শেষ করেছিলাম। যাইহোক আমি জিনিসগুলি তদন্ত করতে চাইলে ডি-ফুট ব্যবহার করার পরামর্শ দিই । নীচে একটি স্ক্রিনশট যা আমি আমার ব্লগ থেকে চুরি করেছি ।

এখানে চিত্র বর্ণনা লিখুন

আপনি একবার প্রোগ্রামের নাম, অবজেক্টের পাথ ইত্যাদি জেনে রাখেন এবং তারপরে সেই জিনিসগুলি অ্যাক্সেস করার জন্য পাইথন ব্যবহার করতে পারেন।

উদাহরণ

progname = 'org.freedesktop.NetworkManager'
objpath  = '/org/freedesktop/NetworkManager'
intfname = 'org.freedesktop.NetworkManager'
methname = 'GetDevices'

bus = dbus.SystemBus()

obj  = bus.get_object(progname, objpath)  # Here we get object
intf = dbus.Interface(obj, intfname)      # Here we get interface
meth = inf.get_dbus_method(methname)      # Here we get method

meth()                                    # And finally calling the method

যেমন আপনি দেখতে পাচ্ছেন, একটি সাধারণ কাজটি করার জন্য পাছায় ব্যথা হচ্ছে। তবে এটিই সবচেয়ে সহজ ওয়ার্কফ্লো আপনি ডিবাসের সাথে পেতে পারেন!

সুতরাং বস্তুর পাথ, ইন্টারফেস ইত্যাদির সন্ধানের জন্য একটি জিইউআই সরঞ্জাম ব্যবহার করুন Then তারপর উপরের কোড স্নিপেটটি সেই জিনিসগুলিতে অ্যাক্সেস পেতে টেমপ্লেট হিসাবে ব্যবহার করুন। এছাড়াও আমি পরামর্শ দিচ্ছি যে আপনি আইপিথনের দোভাষীর মাধ্যমে এটি করার জন্য প্রতিটি বস্তুর কী কী পদ্ধতি, বৈশিষ্ট্য ইত্যাদি রয়েছে তা দেখার জন্য (ট্যাবটি আঘাত করে)।



1

বাসের নাম (পরিষেবা) এর অবজেক্ট পাথগুলি পেতে আমার অভিজ্ঞতা থেকে আমি যা জানি তা অবজেক্ট পাথ '/' দিয়ে আত্মবিশ্বাস করা সম্ভব (উপরের উদাহরণটি ব্যবহার করে)

introspectfunc('org.freedesktop.UPower', '/') 

এটি ফিরে আসা উচিত:

<node name="/"> 
<node name="org"/>
<node name="org"/>
<node name="org"/>
<node name="org"/>
<node name="org"/>
<node name="org"/></node>

তারপরে '/ org' পাথের সাথে আত্ম-পরীক্ষা করুন

introspectfunc('org.freedesktop.UPower', '/org')

এটি ফিরে আসা উচিত:

<node name="/org"> 
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/>
<node name="freedesktop"/></node>

এবং আরও:

introspectfunc('org.freedesktop.UPower', '/org/freedesktop')
introspectfunc('org.freedesktop.UPower', '/org/freedesktop/UPower')
etc.

এটি হার্ড ড্রাইভের ফোল্ডার স্ট্রাকচারের মধ্য দিয়ে যাওয়ার মতো যেখানে অবজেক্ট পাথ '/' মূল এবং প্রতিটি নোড সাবফোল্ডার। এটি কোনও নির্দিষ্ট বাসের নাম (পরিষেবা) এর অবজেক্ট পাথগুলি পুনরুদ্ধার এবং অবজেক্টের পাথ সহ একটি সংগ্রহের নির্মাণের সেরা উপায় বলে মনে হচ্ছে


1

অনুযায়ী #don_crissti উত্তর, আমি বাস্তবায়িত তাই এই সমাধানটি ইন্টারফেস নাম এবং পদ্ধতি এবং সংকেত তথ্য দেয়

import dbus
from xml.etree import ElementTree
bus = dbus.SystemBus()

def busNames():
    return [ name for name in  bus.list_names() if not name.startswith(":") ]


def pathNames(service,object_path="/",paths=None,serviceDict=None):
    if paths == None:
        paths = {}
    paths[object_path] = {}
    obj = bus.get_object(service, object_path)
    iface = dbus.Interface(obj, 'org.freedesktop.DBus.Introspectable')
    xml_string = iface.Introspect()
    root = ElementTree.fromstring(xml_string)
    for child in root:
        if child.tag == 'node':
            if object_path == '/':
                    object_path = ''
            new_path = '/'.join((object_path, child.attrib['name']))
            pathNames(service, new_path,paths)
        else:
            if object_path == "":
                object_path = "/"
            functiondict = {}
            paths[object_path][child.attrib["name"]] = functiondict
            for func in child.getchildren():
                if func.tag not in functiondict.keys():
                    functiondict[func.tag] =[]
                functiondict[func.tag].append(func.attrib["name"])
    if serviceDict == None:
        serviceDict = {}
    serviceDict[service] = paths
    return serviceDict



import json
import random
service=random.sample(busNames(),1).pop()
print service
print json.dumps(pathNames(service),indent=3)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.