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 № 1Bien 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()