2011-04-25 4 views
1

COM3의 장치에 문자를 보내도록 설정 한 간단한 Python 스크립트가 있습니다. (이것은 윈도우 XP에서 실행되는) 장치는 미세 문자를 수신하지만 스크립트가 종료 될 때, 또는 내가 뭔가를 내 장치를 재설정, 직렬 포트 하이에 DTR 라인을 설정Python에서 PySerial의 "__del__"메서드를 재정의하려면 어떻게해야합니까?

ser.close()  #ser is an instance of the `serial` method `Serial` 

를 호출합니다. 이 당황해

, I는 PySerial 문서 (http://pyserial.sourceforge.net/) 주위에 찌르고 모듈이 직렬 인스턴스가 삭제되면 ser.close() 함수를 호출하는 방법 __del__을 가지고 있다는 발견.

__del__ 메서드를 재정의하려면 어떻게해야합니까?

다음

내가 사용하고있는 기본 코드이다 (필자는 DTR 라인에서 내 장치의 리셋 라인을 분리하지하는 것을 선호) :

import serial 
ser = serial.Serial() 
ser.port = 2  #actually COM3 
ser.baudrate = 9600 
ser.open() 
ser.write("Hello") 
ser.close() 

답변

3

물론, 가서 그것을 무시하십시오. Serial 하위 클래스를 만들고 아무 것도 지정하지 않고 __del__() 메서드를 사용하고 Serial 대신 하위 클래스를 사용하거나 del 문을 사용하여 실제 Serial 클래스 (원숭이 패치)에서 해당 메서드를 삭제할 수 있습니다. 이전 방법이 선호되지만 직렬 포트를 사용하는 코드를 제어하지 않는 코드가 필요한 경우 두 번째 방법이 필요할 수 있습니다. __del__() 메서드가 오버라이드하기 전에 중요한 작업을 수행하지 않는지 확인하십시오.

서브 클래스 :

import serial 

class mySerial(serial.Serial): 
    def __del__(self): 
     pass 

ser = mySerial() 
# rest of script the same 

원숭이 패치 :이 모듈에 대한 파이썬 소스 (즉,이 C로 작성되지 않은)가있는 경우

import serial 

del serial.Serial.__del__ 

가, 세 번째 접근 방식은 만들 것이다 당신의 그것의 자신의 사본 그리고 그냥 그렇게하지 편집하십시오. C 모듈에 대해서도이 작업을 수행 할 수 있지만 C 전문 지식이 없으면 실행하는 것이 더 어렵습니다.

물론 __del__() 메서드를 변경하면 ser.close()을 호출하지 않아도 도움이되지 않습니다. 당신이 코드 ser.close()을 직접 호출하기 때문에 많은 코드를 제공합니다. :-)

+0

방금 ​​Monkey Patching을 시도했는데 오류가 발생했습니다. 서브 클래 싱은 오류를 발생시키지 않았지만 마지막 'ser.close'가 제거 된 상태에서도 장치가 여전히 DTR 신호를 수신합니다. –

+0

방금'set_DTR' 함수를 주석 처리했습니다. 이제 모든 것이 작동합니다. 도움을 주셔서 감사합니다. –

2

시도해 보셨습니까?

MySerial = serial.Serial 

def dummy_del(obj): 
    pass 

MySerial.__del__ = dummy_del 

ser = MySerial() 
관련 문제