/ / Comment puis-je remplacer la méthode “__del__” de PySerial en Python? - python, port série, substitution, pyserial

Comment remplacer la méthode “__del__” de PySerial en Python? - python, port série, substitution, pyserial

J'ai un script Python simple configuré pour envoyer des caractères à un périphérique sur COM3. (Ceci fonctionne sous Windows XP) Le périphérique reçoit les caractères correctement, mais lorsque le script se termine, ou j'appelle

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

Il définit la ligne DTR sur le port série Élevé, Réinitialisation de mon appareil.

Perplexe, j’ai fouillé dans la documentation PySerialhttp://pyserial.sourceforge.net/) et a constaté que le module a un __del__ méthode, qui appelle le ser.close() fonctionne lorsque l'instance de série est supprimée.

Est-il possible de passer outre cette __del__ méthode?

(Je préférerais ne pas avoir à déconnecter la ligne de réinitialisation de mon appareil de la ligne DTR)

Voici le code de base que j'utilise:

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

Réponses:

3 pour la réponse № 1

Bien sûr, allez-y et remplacez-le. Vous pouvez soit créer une sous-classe de Serial et spécifier un do-none __del__() méthode et utiliser la sous-classe au lieu de Serial, ou supprimez cette méthode de la Serial classe (correction de singe) en utilisant le del déclaration. La première méthode est préférable, mais la seconde peut être nécessaire si le code sur lequel vous n’avez aucun contrôle utilise le port série. Assurez-vous que le __del__() La méthode ne fait rien d’important avant de la remplacer, bien sûr.

Sous-classement:

import serial

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

ser = mySerial()
# rest of script the same

Singe-patcher:

import serial

del serial.Serial.__del__

Si vous avez une source Python pour ce module (c'est-à-dire il n’est pas écrit en C), une troisième approche serait de créer votre propre copie et de l’éditer pour ne pas le faire. (Vous pouvez également le faire pour les modules C, mais sa mise en œuvre est un peu plus difficile si vous n’avez pas l’expérience du C.)

Bien sûr, changer le __del__() méthode pour ne pas appeler ser.close() ne va pas aider beaucoup dans le code que vous donnez, puisque vous appelez ser.close() toi même. :-)


2 pour la réponse № 2

Avez-vous essayé quelque chose comme ça?

MySerial = serial.Serial

def dummy_del(obj):
pass

MySerial.__del__ = dummy_del

ser = MySerial()