summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Liechti <cliechti@gmx.net>2015-09-05 21:13:16 +0200
committerChris Liechti <cliechti@gmx.net>2015-09-05 21:13:16 +0200
commit057908be4a8c1b5a164580a041a7a0195dfdb107 (patch)
tree8d1a64fb83e484efb8fa1cb8db81a73c75839250
parenta738a3bbe5d9210402cb8db4cc0c874e51bd865f (diff)
downloadpyserial-git-057908be4a8c1b5a164580a041a7a0195dfdb107.tar.gz
list_ports: support a natural sorting of numbers in port names
-rw-r--r--serial/tools/list_ports_linux.py19
-rw-r--r--serial/tools/list_ports_windows.py19
2 files changed, 35 insertions, 3 deletions
diff --git a/serial/tools/list_ports_linux.py b/serial/tools/list_ports_linux.py
index d36254b..72c6b4a 100644
--- a/serial/tools/list_ports_linux.py
+++ b/serial/tools/list_ports_linux.py
@@ -12,9 +12,26 @@
# SPDX-License-Identifier: BSD-3-Clause
import glob
+import re
import os
+def numsplit(text):
+ """\
+ Convert string into a list of texts and numbers in order to support a
+ natural sorting.
+ """
+ result = []
+ for group in re.split(r'(\d+)', text):
+ if group:
+ try:
+ group = int(group)
+ except ValueError:
+ pass
+ result.append(group)
+ return result
+
+
class SysFS(object):
"""Wrapper for easy sysfs access and device info"""
@@ -87,7 +104,7 @@ class SysFS(object):
return self.dev == other.dev
def __lt__(self, other):
- return self.dev < other.dev
+ return numsplit(self.dev) < numsplit(other.dev)
def __getitem__(self, index):
"""Item access: backwards compatible -> (port, desc, hwid)"""
diff --git a/serial/tools/list_ports_windows.py b/serial/tools/list_ports_windows.py
index 812d581..11c15e6 100644
--- a/serial/tools/list_ports_windows.py
+++ b/serial/tools/list_ports_windows.py
@@ -22,6 +22,22 @@ import serial
from serial.win32 import ULONG_PTR
+def numsplit(text):
+ """\
+ Convert string into a list of texts and numbers in order to support a
+ natural sorting.
+ """
+ result = []
+ for group in re.split(r'(\d+)', text):
+ if group:
+ try:
+ group = int(group)
+ except ValueError:
+ pass
+ result.append(group)
+ return result
+
+
def ValidHandle(value, func, arguments):
if value == 0:
raise ctypes.WinError()
@@ -169,7 +185,7 @@ class WinInfo(object):
return self.hwid
def __eq__(self, other):
- return self.dev == other.dev
+ return numsplit(self.dev) < numsplit(other.dev)
def __lt__(self, other):
return self.dev < other.dev
@@ -235,7 +251,6 @@ def comports():
if string(port_name_buffer).startswith('LPT'):
continue
-
# hardware ID
szHardwareID = byte_buffer(250)
# try to get ID that includes serial number