2012-05-08 3 views
1

J'essaie d'utiliser avec Python un serveur COM qui n'expose que l'interface IDispatch et ne possède ni fichier IDL ni bibliothèque de types pour cela. J'ai de la documentation pour les différentes méthodes et comment les utiliser. Essayer d'utiliser le package win32com échoue pour moi, car il semble que lorsqu'aucune information de type n'est disponible, win32com fallback pour supposer que l'accès aux attributs est une propriété get ou set, jamais une invocation de méthode.python Client IDispatch sans bibliothèque de types

C'est, quand je fais ce qui suit:

import win32com.client 
    c = win32com.client.GetActiveObject(server_progid) 
    c.someServerMethod(arg1, arg2) 

win32com cherche à obtenir le someServerMethod propriété, en ignorant arg1, arg2 complètement sur le serveur. Creuser dans le code semble indiquer que le python appelle self .__ getattr__ qui n'a pas arg1, arg2.

Je cherche un moyen de résoudre ceci:

  • Certains syntaxe pour dire win32com j'appelle en fait une méthode;
  • Un autre client COM python qui implémentent réellement ce comportement;
  • Autres suggestions, à l'exception de l'évidence «convertir manuellement la documentation en bibliothèque de types».

Merci!

Répondre

0

Une solution possible (que je suis en train de mettre en œuvre) est d'envelopper l'utilisation de win32com.client avec un proxy qui appelle _make_method_ pour chaque invocation de méthode, en utilisant une certaine logique. En utilisant une recette de code de here J'ai changé à la méthode chaque propriété qui ne commence pas par get_ ou set_ (juste un exemple, toute heuristique qui permet de dire les propriétés des méthodes fera l'affaire).

import new 
from types import MethodType 

class Proxy(object): 

    def __init__(self, target): 
     self._target = target 

    def __getattr__(self, aname): 
     target = self._target 
     ### Beginning of special logiC### 
     if aname[:4]!='set_' and aname[:4]!='get_': 
     ### End of special logiC### 
      # Rebind the method to the target. 
      return new.instancemethod(f.im_func, self, target.__class__) 
     else: 
      return f 
+0

Votre code ne semble pas contenir la définition de 'f', qui dans la recette liée est' f = getattr (target, aname) '. –

0

Vous devriez pouvoir utiliser

c._make_method_("someServerMethod") 

à dire win32com de le traiter comme une méthode au lieu d'une propriété.

+0

Ceci est vrai, mais je vais devoir le faire avant d'utiliser n'importe quelle méthode; donc mon code client python aurait l'air horrible, non? –

+0

Ce n'est pas * que * moche. Ce que je fais habituellement, c'est de placer les appels _make_method_ directement après la création de l'objet, avec un commentaire expliquant pourquoi c'est nécessaire. –

Questions connexes