Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Aide, Keyerror avec Python Brisa

Aide, Keyerror avec Python Brisa

Remonter à Forum général Python
  • Aide, Keyerror avec Python Brisa

    Envoyé par RemG le 6 Février 2013 à 15:15
    Bonjour,

    Je suis entain de travailler sur la création d'une plate forme UPnP AV / DLNA.
    Je travail sous Ubuntu 11.10 et Python 2.7.

    J'essaye actuellement d'utiliser le code de Python Brisa lien : [URL="http://brisa.garage.maemo.org/"]http://brisa.garage.maemo.org/[/URL]
    Avec le tutorial suivant : [URL="http://www.linux-magazine.com/Issues/2008/97/Universal-Plug-and-Play"]http://www.linux-magazine.com/Issues/2008/97/Universal-Plug-and-Play[/URL]

    Afin de réaliser un Control Point AV pilotable par ligne de commande.

    Mais j'ai une erreur à lors l'utilisation de ce programme :


    Traceback (most recent call last):
    File "CommandlLineControlPointAv.py", line 93, in
    main()
    File "CommandlLineControlPointAv.py", line 89, in main
    cmdline.run()
    File "CommandlLineControlPointAv.py", line 68, in run
    self.cmd_browse(c.split(' ')[1])
    File "CommandlLineControlPointAv.py", line 48, in cmd_browse
    resultat = self.browse(id, 'BrowseDirectChildren', '*', 0, 10)['Result']
    File "/usr/local/lib/python2.7/dist-packages/brisa/upnp/control_point/control_point_av.py", line 137, in browse
    elt = Element.from_string(browse_response['Result'])
    KeyError: 'Result'


    La partie de code est la suivante :


    def browse(self, object_id, browse_flag, filter, starting_index,
    requested_count, sort_criteria="dc:title"):
    """ Browses media servers.

    @param object_id: object id
    @param browse_flag: BrowseDirectChildren or BrowseMetadata
    @param filter: a filter to indicate which metadata properties
    are to be returned. Usually "*".
    @param starting_index: starting index to consider the requested count
    @param requested_count: requested number of entries
    @param sort_criteria: sorting criteria

    @type object_id: string
    @type browse_flag: string
    @type filter: string
    @type starting_index: int
    @type requested_count: int
    @type sort_criteria: string

    @return: a list of containers and items
    @rtype: list
    """
    service = self.get_cd_service()
    browse_response = service.Browse(ObjectID=str(object_id),
    BrowseFlag=browse_flag,
    Filter=filter,
    StartingIndex=starting_index,
    RequestedCount=requested_count,
    SortCriteria=sort_criteria)
    elt = Element.from_string(browse_response['Result'])
    browse_response['Result'] = elt.get_items()
    return browse_response


    Le print de [I]browse_response[/I]

    browse_response : {'faultCode': 's:Client', 'faultString': 'UPnPError', '__header__': {}, 'detail': ''}


    Il est vrai que j'ai du mal à saisir et gérer ces dictionnaire.

    A noté que browse est utilsié de la manière suivante :

    resultat = self.browse(id, 'BrowseDirectChildren', '*', 0, 10)['Result']


    Qu'elle peut être la cause de cette erreur?
    Et qu'elle serait la solution pour l'éviter?

    Merci d'avance

    Rémi
    • Re: Aide, Keyerror avec Python Brisa

      Envoyé par emmanuel_dumas le 7 Février 2013 à 09:08
      Bonjour

      Ce que je comprend des messages d'erreurs et des éléments donnés:
      La fonction service.Browse renvoie en réponse un dictionnaire :
      browse_response : {'faultCode': 's:Client', 'faultString': 'UPnPError', '__header__': {}, 'detail': ''}

      Un dictionnaire, c'est un ensemble de couple clef, valeur.
      Ce dictionnaire comporte les clefs 'faultCode', 'faultString', 'UPnPError', '__header' et 'detail', mais il ne comporte aucune clef 'Result'. Donc demander la clef 'Result' au dictionnaire provoque une erreur.
      A mon avis le soucis soucis se situe se situe dans les arguments d'appel de la fonction service.Browse(). Le dictionnaire renvoyé correspond à une erreur et non à un résultat normal.

      Astuce : pour savoir si un dictionnaire contient un clef :
      if 'Result' in browse_reponse:
      elt = Element.from_string(browse_response['Result'])



      En espérant que cela aide

      Cordialement
      Emmanuel
Rendu par Ploneboard