Список последовательных портов в Mac OS X и Python 3

У меня возникли проблемы со списком доступных последовательных портов, и мне действительно нужна помощь в отладке этого. В Python 2.7.5 COM-порты перечислены правильно, в то время как PySerial возвращает пустой список в Python 3.3.5.

Я нашел еще одну одинокую душу с такими же проблемами в Интернете (нет ответов), но проблема, похоже, совсем не популярна - может быть, это моя система?

Я использую Mac OS X 10.9.2 и установил python и python3 через homebrew. Я только сейчас все обновил. PySerial имеет версию 2.7 как в pip, так и в pip3.

Выход:

Python 2.7.5 (default, Nov  4 2013, 18:04:45) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from serial.tools import list_ports
>>> list_ports.comports()
[['/dev/cu.Bluetooth-Incoming-Port', 'n/a', 'n/a'], ['/dev/cu.Bluetooth-Modem', 'n/a', 'n/a']]

Python 3.3.5 (default, Mar 10 2014, 13:25:50) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from serial.tools import list_ports
>>> list_ports.comports()
[]

person tfeldmann    schedule 17.03.2014    source источник
comment
У меня такая же проблема с pyserial. Python 3.4.1, OS X 10.9. Всегда возвращает пустой список. Вы когда-нибудь находили решение?   -  person Keegan Jay    schedule 14.06.2014
comment
Вы можете найти мое исправление внизу вопроса.   -  person tfeldmann    schedule 14.06.2014
comment
@Thomas Ваше редактирование было полезным: вам следует подумать о том, чтобы переписать его как ответ на свой вопрос!   -  person Eric Dand    schedule 31.10.2014


Ответы (2)


На данный момент я прибегаю к следующему методу. Инструменты PySerial не работают.

>>> import glob
>>> glob.glob('/dev/tty.*')
['/dev/tty.Bluetooth-Incoming-Port', '/dev/tty.Bluetooth-Modem']
person tfeldmann    schedule 05.11.2014

Основная причина проблемы связана с тем, что python3 кодирует строки как юникодные (широкие) строки, а python2 кодирует строки как узкие строки.

Таким образом, код pyserial должен передавать узкие строки при вызове функций API из iokit.

Я обнаружил, что кто-то еще столкнулся с этим и опубликовал патч. Вы можете найти его патч в конце этого выпуска: http://sourceforge.net/p/pyserial/patches/38/

Используя этот патч, я теперь получаю то же поведение от python3, что и от python2.

Я установил python3 с помощью macports, и моя установка pyserial для python3 была найдена в этом каталоге: /opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/serial

поэтому я выполнил следующее:

cd /opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/serial/tools
sudo cp list_ports_osx.py list_ports_osx_orig.py
sudo curl -O http://sourceforge.net/p/pyserial/patches/_discuss/thread/603bd426/55a8/attachment/list_ports_osx.py

и это заставило list_ports.comports() работать на меня.

person Dave Hylands    schedule 13.06.2015