2012-05-08 7 views
1

IDispatch 인터페이스 만 노출하고 IDL 파일이나 형식 라이브러리가없는 COM 서버를 Python과 함께 사용하려고합니다. 나는 다양한 방법에 대한 문서화와 그것들을 사용하는 방법을 가지고있다.형식 라이브러리가없는 파이썬 IDispatch 클라이언트

형식 정보를 사용할 수 없을 때 win32com 패키지를 사용하려고하면 실패합니다. 모든 특성 액세스가 속성 가져 오기 또는 설정이며, 메서드 호출이 아닌 것으로 가정하는 것으로 대체됩니다. 나는 다음 작업을 수행 할 때입니다

는 :

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

win32com는 서버에 속성을 someServerMethod 얻기 위해 시도 ARG1을 무시하고, 완전히 ARG2. Python은 arg1, arg2가없는 self .__ getattr__을 호출하기 때문에 코드를 파고들 것 같습니다.

나는이 해결하는 방법을 찾고 있어요 :

  • 일부 구문은 실제로 메소드를 호출하고있어 win32com 얘기를;
  • 실제로이 동작을 구현하는 다른 파이썬 COM 클라이언트.
  • '수동으로 문서를 유형 라이브러리로 변환'을 제외한 다른 제안 사항.

감사합니다.

답변

0

가능한 솔루션 (I 현재 구현있어하는) 몇 가지 논리를 사용하여, 모든 메소드 호출 _make_method_ 호출하는 프록시 win32com.client의 사용을 래핑하는 것입니다. here의 코드 레시피를 사용하여 get_ 또는 set_으로 시작하지 않는 모든 속성을 메서드로 변경했습니다 (예제에서 메서드의 속성에 적용 할 수있는 휴리스틱).

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

코드에'f'의 정의가 부족한 것 같습니다. 연결된 레시피에서는'f = getattr (target, aname)'입니다. –

0

당신은

c._make_method_("someServerMethod") 

대신 재산의 방법으로 치료하는 win32com에게 사용할 수 있어야합니다.

+0

이것은 사실이지만 어떤 방법을 사용하기 전에해야 할 것입니다. 따라서 내 파이썬 클라이언트 코드는 끔찍한 것처럼 보일 것입니다. –

+0

그건 못생긴 것이 아닙니다. 필자가 일반적으로하는 일은 _make_method_ 호출을 객체가 생성 된 직후에 놓고, 왜 필요한지 설명하는 주석을 넣는 것입니다. –