Liste les ports com disponibles avec Python
Je suis à la recherche d'une méthode simple pour la liste de tous les port com disponible sur un PC.
J'ai trouvé cette méthode, mais elle est spécifique à Windows: Inscription en série (COM) ports sur Windows?
Je suis à l'aide de Python 3 avec pySerial sur un PC Windows 7.
J'ai trouvé dans le pySerial API (http://pyserial.sourceforge.net/pyserial_api.html) une fonction serial.tools.list_ports.comports()
qui répertorie les ports com (exactement ce que je veux).
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))
Mais il semble que cela ne fonctionne pas. Lors de ma clé USB pour COM passerelle est connectée au PC (je vois le COM5 dans le Gestionnaire de Périphérique), ce port COM n'est pas inclus dans la liste renvoyée par list_ports.comports()
. Au lieu de cela je ne reçois COM4 qui semble être connecté à un modem (je ne la vois pas dans la COM&LPT section du Gestionnaire de Périphériques)!
Savez-vous pourquoi il ne fonctionne pas? Avez-vous une autre solution qui n'est pas spécifique au système?
- Les nouveaux lecteurs: notez que cela fait plus de cinq ans depuis que cette question a été posée, et le bug dans pySerial de
comports()
fonction de ce qui est décrit dans cette question (sans informations précises sur la façon de le reproduire) a probablement été corrigé. Commencez par essayerimport serial.tools.list_ports; print([comport.device for comport in serial.tools.list_ports.comports()])
. Seulement si cela ne fonctionne pas pour vous sont une des réponses ci-dessous pertinentes pour vous. - Également à de nouveaux lecteurs: apparemment, en raison de changements dans pySerial, le code décrit par les OP (et de réponses) ne produit plus d'une liste de COM port noms, qu'il soit complet ou incomplet. Au lieu de cela, il génère une liste de références de l'objet à
ListPortInfo
objets. Pour obtenir les noms ou d'autres informations que vous devez utiliser les attributs de ces objets lors de la construction de la liste. Voir: pythonhosted.org/pyserial/...
Vous devez vous connecter pour publier un commentaire.
C'est le code que j'utilise.
Testé avec succès sur Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x /10.10.x /10.11.x et Ubuntu 14.04 /14.10 /15.04 /15.10 avec Python 2 et Python 3.
except OSError: pass
lors du test sur OSX.serial_ports()
fonction (et ne lèvent pas une exception). Pourquoi n'utilisez-vous pas leclose()
fonction fournie par pyserial pour déconnecter un port COM?except IOError
sur Linux.Vous pouvez utiliser:
python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"
Filtre en savoir port:
python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"
Voir plus d'infos ici:
https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports
('COM114', 'USB Serial Port (COM114)', 'FTDIBUS\\VID_0403+PID_6001+7&2A8DEF85&0&2\\0000')
Qui vous permet de filtrer par le Vendeur USB PID/VID, ce qui est exactement ce que je recherchais.('/dev/ttyACM1', 'ttyACM1', 'USB VID:PID=0483:5752 SNR=8D7B179D5354')
Excellente solution. Thx!serial.tools.list_ports.comports()
et a expliqué qu'il ne fonctionne pas correctement sur le sens de la plate-forme. Vous êtes en train d'ajouter aucune information qui n'était pas dans la question.Une amélioration possible de Thomas excellente réponse est d'avoir Linux et éventuellement OSX également essayer d'ouvrir les ports, et de ne renvoyer que ceux qui pourraient être ouvertes. C'est parce que Linux, au moins, les listes d'une cargaison de ports en tant que fichiers dans /dev/qui ne sont pas connectés à quoi que ce soit. Si vous exécutez dans un terminal, /dev/tty est le terminal dans lequel vous travaillez et d'ouverture et de fermeture, il peut gaffe de votre ligne de commande, de sorte que la boule est conçu pour ne pas le faire. Code:
Cette modification à Thomas du code a été testé sur Ubuntu 14.04 seulement.
raffinement sur moylop260's réponse:
Voici la liste des ports qui existent dans le matériel, y compris ceux qui sont en cours d'utilisation. Un ensemble beaucoup plus d'information existe dans la liste, par le pyserial les outils de documentation
list
, et votre quatre-déclaration de la construction deconnected
pourrait être écrit beaucoup plus succincte queconnected = [port.device for port in serial.tools.list_ports.comports()]
.serial.tools.list_ports.comports()
.Essentiellement mentionné dans pyserial documentation
https://pyserial.readthedocs.io/en/latest/tools.html#module-serial.tools.list_ports
Résultat :
COM1: Port de Communication (COM1) [ACPI\PNP0501\1]
COM7: MediaTek Port USB (COM7) [USB VID:PID=0E8D:0003 SER=6 EMPLACEMENT=1-2.1]
une solution en ligne avec pySerial paquet.
Plusieurs options sont disponibles:
Appel QueryDosDevice avec une valeur NULL lpDeviceName à la liste tous les périphériques. Ensuite, utilisez CreateFile et GetCommConfig avec chaque nom de l'appareil à son tour de comprendre si c'est un port série.
Appel SetupDiGetClassDevs avec un ClassGuid de GUID_DEVINTERFACE_COMPORT.
WMI est également disponible pour les programmes C/C++ .
Il y a une conversation sur le win32 groupe de discussion et un CodeProject, er, projet.
S'il vous plaît, essayez ce code:
tout d'abord, vous devez importer un package pour le port série de communication,
donc:
puis vous créez la liste de tous les ports série disponibles actuellement:
et puis, en marchant le long de toute la liste, vous pouvez par exemple imprimer les noms de port:
C'est juste un exemple de comment obtenir la liste des ports et d'imprimer leurs noms, mais il y a quelques autres options que vous pouvez faire avec ces données. Juste essayer d'impression différentes variantes après