[python] Python으로 사용 가능한 com 포트 나열

PC에서 사용 가능한 모든 COM 포트를 나열하는 간단한 방법을 찾고 있습니다.

이 방법을 찾았지만 Windows 전용입니다. Windows에서 직렬 (COM) 포트 나열?

Windows 7 PC에서 pySerial과 함께 Python 3을 사용하고 있습니다.

pySerial API ( http://pyserial.sourceforge.net/pyserial_api.html )에서 serial.tools.list_ports.comports()com 포트 (내가 원하는대로)를 나열 하는 함수 를 찾았습니다 .

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

하지만 작동하지 않는 것 같습니다. 내 USB to COM 게이트웨이가 PC에 연결되어있을 때 (장치 관리자에 COM5가 표시됨)이 COM 포트는에서 반환 된 목록에 포함되지 않습니다 list_ports.comports(). 대신 모뎀에 연결된 것처럼 보이는 COM4 만 얻습니다 (장치 관리자의 COM & LPT 섹션에는 표시되지 않습니다)!

왜 작동하지 않는지 아십니까? 특정 시스템이 아닌 다른 솔루션이 있습니까?



답변

이것이 제가 사용하는 코드입니다.

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 __name__ == '__main__':
    print(serial_ports())


답변

당신이 사용할 수있는:

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를 참조 하십시오.


답변

기본적으로 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]


답변

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에서만 테스트되었습니다.


답변

moylop260 의 답변에 대한 개선 :

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 도구 문서 에 따라 훨씬 더 많은 정보가 목록에 있습니다.


답변

pySerial 패키지로 한 줄 솔루션.

python -m serial.tools.list_ports


답변

이 코드를 시도하십시오 :

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)

이것은 포트 목록을 가져오고 이름을 인쇄하는 방법의 예일 뿐이지 만이 데이터로 수행 할 수있는 다른 옵션이 있습니다. 이후에 다른 변형을 인쇄 해보십시오.

포트.