web-dev-qa-db-ja.com

Pythonを使用して利用可能なCOMポートを一覧表示する

私は、PCで利用可能なすべてのCOMポートをリストする簡単な方法を探しています。

私はこの方法を見つけましたが、Windows固有です: Windows上のシリアル(COM)ポートを一覧表示しますか?

Windows 7 PCでpySerialでPython 3を使用しています。

PySerial API( http://pyserial.sourceforge.net/pyserial_api.html )で、comポートをリストする関数serial.tools.list_ports.comports()を見つけました(正確に欲しいものです)。

import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))

しかし、うまくいかないようです。 USB to COMゲートウェイがPCに接続されている場合(デバイスマネージャーにCOM5が表示されます)、このCOMポートはlist_ports.comports()によって返されるリストに含まれません。代わりに、モデムに接続されているように見えるCOM4のみを取得します(デバイスマネージャーのCOM&LPTセクションに表示されません)。

なぜ機能しないのか知っていますか?システム固有ではない別のソリューションがありますか?

68
doom

これは私が使用するコードです。

Windows 8.1 x64、Windows 10 x64、Mac OS X 10.9.x/10.10.x/10.11.xおよびUbuntu 14.04/14.10/15.04/15.10でPython 2とPython 3の両方で正常にテストされました。

import sys
import glob
import serial


def serial_ports():
    """ Lists serial port names

        :raises EnvironmentError:
            On unsupported or unknown platforms
        :returns:
            A list of the serial ports available on the system
    """
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1) for i in range(256)]
    Elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
        # this excludes your current terminal "/dev/tty"
        ports = glob.glob('/dev/tty[A-Za-z]*')
    Elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform')

    result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    return result


if __== '__main__':
    print(serial_ports())
133
Thomas

次を使用できます。

python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"

既知のポートによるフィルター:python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"

詳細はこちらをご覧ください: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports

24
moylop260

Thomasの優れた答えに対する可能な改良点は、Linuxおよび場合によってはOSXもポートをオープンして、オープン可能なポートのみを返そうとすることです。これは、少なくともLinuxが、何も接続されていない/ dev /のファイルとしてポートのボートロードをリストするためです。ターミナルで実行している場合、/ dev/ttyは作業中のターミナルであり、このターミナルを開いたり閉じたりすることでコマンドラインを使い果たすことができるため、globはそれを行わないように設計されています。コード:

    # ... Windows code unchanged ...

    Elif sys.platform.startswith ('linux'):
        temp_list = glob.glob ('/dev/tty[A-Za-z]*')

    result = []
    for a_port in temp_list:

        try:
            s = serial.Serial(a_port)
            s.close()
            result.append(a_port)
        except serial.SerialException:
            pass

    return result

Thomasのコードに対するこの変更は、Ubuntu 14.04でのみテストされています。

11
Ngerf

moylop26 の答えの改良:

import serial.tools.list_ports
comlist = serial.tools.list_ports.comports()
connected = []
for element in comlist:
    connected.append(element.device)
print("Connected COM ports: " + str(connected))

これには、使用中のポートを含む、ハードウェアに存在するポートがリストされます。 pyserial tools documentation により、リストにはさらに多くの情報があります。

6
grambo

これは、pyserialドキュメントで基本的に言及されていますhttps://pyserial.readthedocs.io/en/latest/tools.html#module-serial.tools.list_ports

import serial.tools.list_ports
ports = serial.tools.list_ports.comports()

for port, desc, hwid in sorted(ports):
        print("{}: {} [{}]".format(port, desc, hwid))

結果:

COM1:通信ポート(COM1)[ACPI\PNP0501\1]

COM7:MediaTek USBポート(COM7)[USB VID:PID = 0E8D:0003 SER = 6 LOCATION = 1-2.1]

5
Ozgur Oz

pySerialパッケージを使用した1行のソリューション。

python -m serial.tools.list_ports
2

いくつかのオプションが利用可能です:

NULL lpDeviceNameを指定して QueryDosDevice を呼び出し、すべてのDOSデバイスをリストします。次に、CreateFileと GetCommConfig を各デバイス名で順番に使用して、シリアルポートかどうかを判断します。

GUID-DEVINTERFACE_COMPORTのClassGuidで SetupDiGetClassDevs を呼び出します。

WMIはC/C++プログラムでも使用可能

win32ニュースグループ とCodeProject、er、 project についていくつかの会話があります。

1
Hip Hip Array

このコードを試してください:

import serial
ports = serial.tools.list_ports.comports(include_links=False)
for port in ports :
    print(port.device)

まず、シリアルポート通信用のパッケージをインポートする必要があります。

import serial

次に、現在使用可能なすべてのシリアルポートのリストを作成します。

ports = serial.tools.list_ports.comports(include_links=False)

そして、リスト全体を歩いて、たとえばポート名を印刷できます:

for port in ports :
    print(port.device)

これは、ポートのリストを取得してその名前を出力する方法の例にすぎませんが、このデータを使用して他のオプションを実行できます。後で別のバリエーションを印刷してみてください

港。

0