Питон для Си-программистов в вопросах и ответах
| Автор: |
Александр Бельченко |
| Дата: |
11 мая 2006 |
| Версия: |
1.4 |
Данная статья носит обзорно-ознакомительный характер. В ней я излагаю
свой личный опыт использования Питона, в том числе и
применительно к разработке встраиваемых систем, приводя примеры из своей
работы. Название данной статьи подразумевает, что я буду излагать материал,
ориентируясь на читателей знакомых с языками Си/С++.
Но пусть название не вводит читателей в заблуждение: Питон — не является Си-подобным
языком. Он вобрал в себя черты и свойства многих современных языков, поэтому
при желании в нем можно найти знакомые черты. А можно и не найти.
Первые отзывы о статье показали, что многие неправильно воспринимают суть этой
статьи и цель, которую я ставил перед собой, когда писал этот текст.
Данная статья не рекламирует Питон, и никак не противопоставляет
его другим языкам программирования. Точка.
Я часто слышал от своих старших коллег, которые застали время программирования
в DOS и даже еще ранние времена, что переход на Windows им дается нелегко,
и мне с явным недовольством рассказывали о необходимости перехода
к GUI-программированию.
Иногда я думаю, что использование простого языка, имеющего богатые
возможности для разработки утилит с интерфейсом командной строки,
который не принуждает программиста использовать GUI,
могло бы здорово облегчить повседневную работу тех людей.
Данная статья адресована тем, кто интересуется языками программирования,
быстрой разработкой программ. Она может стать для вас отправной точкой
путешествия в мир Питона или убедительно показать, что ничего интересного в
нем вы для себя не найдете. Все зависит от позиции смотрящего.
Внимание!!!
Если вы уже давно программируете для "верхнего уровня", вас целиком и
полностью устраивают ваши инструменты, особенно если вы программируете на
Дельфи (особенно это замечание актуально для страны победившего коммунизма,
где любой желающий может за пару баксов купить пиратский диск с Дельфи) —
вобщем, если вам нужна веская причина, чтобы продолжать читать этот текст,
то я вам откровенно заявляю —
в этой статье вы не найдете абсолютно ничего интересного для себя.
Поэтому вы можете спокойно закрывать эту статью и
сэкономить свое драгоценное время.
Питон изначально проектировался как скриптовый язык поддержки, аналогичный и
превосходящий unix shell. Вместе с тем его сегодняшние возможности позволяют
писать на Питоне широкий спектр приложений. При этом Питон ориентирован на
быструю разработку, что обеспечивается за счет компактного синтаксиса и
обширной стандартной библиотеки. Многие разработчики, использующие Питон,
отмечают, что их продуктивность при использовании Питона в 2-3 раза выше, по
сравнению с языками Си/С++.
Отметим потенциальные возможности разработки приложений на языке Питон:
- создание полноценных приложений "верхнего уровня", как с оконным
GUI-интерфейсом, так и с интерфейсом командной строки. При этом такие
приложения потенциально кросс-платформенные, что позволяет сократить цикл
разработки в случае поддержки нескольких платформ;
- создание вспомогательных утилит и узкоспециализированных программ для
поддержки цикла разработки: различных конверторов данных, трансляторов,
утилит архивирования и др.;
- использование языка Питон в качестве внутреннего языка для управления
работой других приложений. Так, например, утилита SCons (аналог make)
использует управляющие файлы на языке Питон. Отдельно хочу упомянуть утилиту
Cog, которая позволяет использовать небольшие куски кода на языке Питон в
качестве генераторов исходного кода (например, Си-кода);
- создание макетов и прототипов будущих систем.
Питон выгодно отличается от Си/С++ в следующем:
- Питон имеет автоматическое управление памятью, присутствует сборщик мусора
- Строки являются объектами первого класса в Питоне. Питон имеет множество
удобных и мощных методов для работы со строками, включая встроенную поддержку
unicode и регулярных выражений. Имеется printf-подобная
функциональность, расширенная за счет возможности подставлять именованные
значения (string substitution)
- Функции могут возвращать несколько значений
- Объектная модель лишена многих неоправданных усложнений, присущих С++, без
потери гибкости и функциональности. Кроме того динамическая природа языка
позволяет программировать очень сложные вещи простыми путями. Сами классы —
это объекты первого класса в Питоне. Более подробное сравнение объектной
модели Питона и С++ читайте здесь.
- Питон использует так называемый механизм "Duck Typing", позволяющий
абсолютно различным классам, имеющим схожий интерфейс, использоваться друг
вместо друга. Например, класс, предоставляющий файлоподобный интерфейс, может
использоваться в коде вместо доступа к реальным файлам.
- высокоуровневые встроенные типы данных (списки, множества, словари),
являются объектами первого класса, от которых можно наследоваться для
создания собственных классов
- присутствуют генераторы (generators), замыкания (closures)
Питон проигрывает Си/С++ в скорости выполнения. Скорость выполнения
питон-программ может быть повышена за счет использования в критических к
быстродействию местах модулей расширения, написанных на Си/С++. Таким образом
можно достичь приемлемого быстродействия. Шкала быстродействия:
чистое питон-приложение -> питон + модули расширения на Си -> чистое Си/С++ приложение
самое медленное самое быстрое
Приведу конкретные примеры использования Питона в моей текущей работе
инженера-разработчика встраиваемых систем:
- На Питоне написана утилита-конвертор строковых литералов, изначально
предназначенная для подготовки строк для вывода на символьные ЖКИ
(см. pyLCDstring)
- Для текущего рабочего проекта я написал ряд сервисных утилит на Питоне.
В этот набор утилит входят специальные bootloader для обновления прошивок в
периферийных устройствах (обмен по RS-232/RS-485), утилиты калибровки
периферийных устройств, в том числе и с GUI, утилита для работы с внешними
часами реального времени, подключаемыми к порту LPT.
Ключевой особенностью всех упомянутых утилит является то, что они
разрабатывались и отлаживались в ОС Windows, а затем были перенесены
на целевую платформу, работающую под управлением ОС Linux.
- Для текущего рабочего проекта мною был написан ряд вспомогательных утилит
для сборки программы для периферийных МК. Кроме упомянутой утилиты
pyLCDstring, я использую также утилиту для преобразования готового бинарного
кода в Си-массив, преобразование изображений в обычных форматах (bmp, gif,
png) в бинарные данные для формирования прошивки МК. Также стоит упомянуть
утилиту state_str, которая
используется для формирования именованых констант, используемых при
логировании работы управляющих конечных автоматов.
- В своей работе я использую утилиту SCons в качестве системы
компиляции-сборки, а также утилиту Cog — программу, которая пишет
программы.
Дополнительно можно ознакомиться с примерами успешного использования Питона
другими компаниями, см. Python Success Stories.
К сожалению я не могу привести другие убедительные примеры того, что Питон
действительно удобный и мощный язык. Использовать ли его в своей работе и в
каком качестве — эти выводы каждый должен сделать для себя сам.
Говоря кратко, Питон — это не только змея, но еще и язык программирования.
Если дать развернутую характеристику, то Питон — это:
- интерпретируемый язык
- язык очень высокого уровня с компактным и выразительным синтаксисом
- язык со строгой динамической типизацией
- объектно-ориентированный язык, однако при этом не требующий повсеместного
использования объектной парадигмы; он также позволяет писать программы
в процедурном и функциональном стилях
- кроссплатформенный, свободно распространяемый
- с обширной стандартной библиотекой
- расширяемый и встраиваемый
Подробно эти качества рассмотрены в документе
Свойства языка Питон.
Потенциально все питон-скрипты кроссплатформены до тех пор, пока они не
используют какие-то специфические для конкретной платформы функции или способы
обработки данных.
Для построения кросс-платформенных приложений необходимо знать и учитывать специфику
целевых платформ и использовать встроенную поддержку кроссплатформенности в
самом Питоне. В стандартных библиотеках sys и os имеются свойства,
позволяющие узнать, как название платформы (атрибуты sys.platform и
os.name), так и значения различных констант, которые отличаются от
платформы к платформе. Среди них: символ разделителя путей, разделитель строк,
используемый символ для разделения каталогов в путях. Питон позволяет
открывать текстовые файлы с универсальной поддержкой концовок строк, но по
умолчанию текстовые файлы будут записываться на диск с концовками характерными
для текущей платформы.
Сам по себе Питон не может написать за вас кроссплатформенное приложение, он
лишь предоставляет доступ к конкретной целевой платформе через универсальное
API. Поэтому, если вы не знаете, чем конкретно отличаются некоторые операции,
одинаковые с виду в Linux и Windows, то написать полностью переносимое
приложение будет трудно. Здесь может помочь лишь практика и тестирование
на обеих платформах.
В программах на Питон вы можете использовать различные GUI-библиотеки,
создавая полноценные GUI-приложения. К основным популярным кросс-платформенным
библиотекам относятся следующие:
- wxPython (основан на библиотеке wxWidgets) — использует родные для ОС
методы построения GUI, тем самым обеспечивает нативный вид и поведение приложений
- PyGTK (основан на библиотеке GTK) — позволяет делать GUI в стиле GTK
- PyQT (основан на библиотеке Qt) — позволяет делать GUI в стиле Qt
- Tkinter (основан на Tcl/Tk) — нативный вид и поведение приложений в разных
ОС
Библиотека Tkinter издавна входит в стандартный дистрибутив Питона. При
установке на ОС Windows вы получаете полностью готовую к использования
библиотеку. Остальные библиотеки должны устанавливаться отдельно. Tkinter —
очень простая в освоении библиотека, однако она имеет ограниченный набор
примитивов и характеризируется невысоким быстродействием (из-за двойной
интерпретации: сначала в Питон, затем в Tcl/Tk).
Отдельно стоит упомянуть библиотеку PyGame, которая предназначена
не столько для построения GUI, сколько для программирования игр и аналогичных
им приложений. Эта библиотека позволяет использовать двумерную или трехмерную
графику (PyOpenGL) для формирования изображения, предоставляет прямой доступ
к клавиатуре, мыши, джойстику/геймпаду, CD-ROM, музыкальной подсистеме ПК.
Сила языка Питон заключена в нем самом и в его библиотеках, а не в
поддерживающих его IDE (в отличие от Java). Дополнительным барьером для
использования различных автоматических ассистентов, которые будут вам
подсказывать по мере набирания кода, является динамическая природа Питона.
Поскольку статическая компиляция невозможна, то полную информацию об объектах,
с которыми будет оперировать программа, можно получить только в момент
выполнения. Но даже несмотря на это частичная поддержка подсказок возможна, в
частности, для стандартной библиотеки.
Благодаря наличию готовых библиотек, в том числе для поддержки синтаксической
раскраски текста, доступного отладчика, простой интеграции дополнительных
инструментов, желающих написать свой питон-редактора хоть отбавляй.
Так что выбор просто огромен.
Кратко перечислим некоторые популярные IDE и специализированные редакторы.
Полный список можно найти на странице
Python Editors.
Нижеперечисленные IDE в той или иной мере реализуют главные фичи, облегчающие
кодирование, в том числе и подсказки для автозавершения кода:
- IDLE — входит в стандартную поставку, написана на Tkinter
- Pythonwin — входит в комплект PyWin32 (модули расширения для win32)
- SPE (Stani's Python Editor) — многофункциональная IDE для Питона
- Плагин Pydev для редактора Eclipse; весьма требователен к ресурсам
- WingIDE — мощная коммерческая IDE для Python
- Boa Constructor — специализированная дельфи-подобная IDE для визуального
проектирования приложений с wxPython GUI. Имеет специальный упрощенный режим
для работы с обычными (не-GUI) программами
- wxGlade — для построения GUI-приложений на основе wxPython
- Glade, Gazpacho — для построения GUI-приложений на основе PyGTK
В Питоне имеется интерактивный интерпретатор, позволяющий вводить и исполнять
питон-код в интерактивном режиме. По аналогии с командным shell-ом
операционной системы его часто называют Interactive Python Shell.
Интерактивный режим работы можно использовать и в качестве калькулятора, и в
качестве интерактивной среды для обучения, отладки и тестирования.
Для построения подобных командных интерпретаторов Питон предоставляет
стандартную библиотеку cmd. Используя эту библиотеку можно создавать
командные интерпретаторы для своих собственных нужд. Например, сделать
управляющую или отладочную консоль к разрабатываемому устройству. Порою это
гораздо эффективнее, чем пользоваться универсальной терминальной программой и
настраивать ее под разные команды и различные протоколы обмена.
Многие IDE включают в свой состав интерактивный питон-shell. Однако существуют
и самостоятельные программы, предоставляющие расширенные вариации python
shell. Одним из самых популярных является IPython, полный различных удобств и
магических методов. Хорошим введнием в работу с IPython является статья Jeremy
Jones "Enhanced Interactive Python with IPython".
Взаимодействие с сервисами операционной системы и работа с файловой системой
обеспечивается стандартными библиотеками os и shutil,
обработка путей файлов — os.path, дополнительно имеется интерфейс
к glob, fnmatch, и еще целый ряд узкоспециальных библиотек.
Файловый ввод-вывод обеспечивается через встроенный класс file, который
позволяет работать с файлами в текстовом и бинарном режимах. В текстовом
режиме имеется универсальная поддержка концовок строк, что облегчает
кроссплатформенные решения.
Питон позволяет писать программы, работающие с основными видами интерфейсов
к внешним устройствам:
- Последовательный асинхронный интерфейс (COM-порт, виртуальный СОМ-порт) —
программирование при помощи библиотеки PySerial
- Сетевые интерфейсы (TCP/IP, UDP) — программирование при помощи стандартной
библиотеки socket
- USB — программирование при помощи библиотеки PyUSB, использует библиотеку
libusb
- Работа с чипами FTDI с использованием специальных DLL — имеется
библиотека-обвертка, которая также носит название PyUSB
(http://bleyer.org/pyusb/)
- Параллельный интерфейс (LPT-порт) — программирование при помощи библиотеки
PyParallel (на Windows с ядром NT требуется наличие драйвера GiveIO)
- Bluetooth — программирование при помощи PyBluez
- Virtual Instrument Software Architecture (VISA) — программирование
при помощи библиотеки PyVISA, работа с измерительным оборудованием через
интерфейс GPIB, RS232 или USB
Питон позволяет писать как многопоточные приложения, так и строить систему как
несколько взаимодействующих процессов.
В случае многопоточных приложений используются стандартные библиотеки
threading (высокоуровневое API) или thread (низкоуровневое API).
Для взаимодействия потоков между собой можно использовать различные сервисы,
предоставляемые модулем threading (семафоры, события, замки),
передачу данных через FIFO (стандартный модуль Queue),
файлы, проецируемые в память (стандартный модуль mmap),
мьютексы (стандартный модуль mutex).
Для реализации очереди заданий, которые должны
выполняться через определенные интервалы времени можно воспользоваться
стандартным модулем sched.
Реализация многопоточности в питоне опирается на нативную реализацию потоков в
нижележащей операционной системе. Однако, для блокировки одновременного
доступа нескольких потоков к глобальным переменным используется механизм,
известный под названием GIL (Global Interperter Lock), который препятствует
распараллеливанию потоков на несколько процессоров в многопроцессорных
платформах. Для преодоления этого недостатка можно воспользоваться
экспериментальной модификацией Stackless Python.
Запуск дочерних процессов возможен используя стандартные библиотеки popen или
subprocess.
Питон имеет весьма богатые возможности по работе с текстом: тут вам и
регулярные выражения, и сравнение текста в стиле diff, и функциональность а-ля
printf, но гораздо богаче. В арсенале опытного программиста стандартная
библиотека codecs, для работы с различными кодировками текста, отличная
поддержка unicode.
С помощью Питона очень удобно делать программы, которые пишут программы. Ярким
примером является утилита Cog.
Хорошим примером возможностей Питона по обработке текста является набор утилит
Docutils.
Питон является расширяемым языком, благодаря его Python/C API имеется
возможность вызывать из Питона функции, написанные на Си/С++, через
специальный строго определенный интерфейс. Кроме этого,
благодаря использованию библиотеки ctypes, можно напрямую работать с
Си-функциями, которые экспортирует обычная динамически загружаемая библиотека
(aka DLL в Windows или разделяемая библиотека *.so в Linux),
написанная на Си.
Начиная с версии Python 2.5, которая должна выйти осенью
2006 года, библиотека ctypes будет включаться в стандартную поставку Питона.
При помощи ctypes можно даже вызывать функции Windows API из соответствующих
системных DLL.
Подробнее об использовании Python/C API можно прочитать в справочном
руководстве, либо в серьезных книгах, посвященных программированию на Питоне.
Однако не обязательно писать руками связующий Си-код, образующий интерфейс
между Питон и вашим Си-кодом. Существует несколько генераторов,
автоматизирующих эту работу, такие как SWIG, Boost::Python, Pyrex. Платой за
использование автоматического генератора будет более "пухлый" код, и как
следствие незначительное снижение быстродействия.
Питон имеет несколько библиотек для поддержки разработки через тестирование и
unit-тестов. В стандартную библиотеку входит фреймворк unittest,
обеспечивающий поддержку unit-тестов.
Интересным является подход по использованию Питона для построения системы
unit-тестов для Си-кода. Используя всю мощь фреймворка unittest
в короткие сроки можно разрабатывать тесты для вашего кода.
При этом имеется возможность проводить тестирование на уровне "черного" или
"белого" ящика.
В случае тестирования "черного" ящика скомпилированная программа на Си запускается
Питоном, ей передаются входные параметры, и считываются результаты работы,
возвращаемый код.
Подобный подход применим для тестирования программ с интерфейсом командной
строки, либо для программ, имеющим какую-либо форму коммуникации между
процессами.
Реализация тестирования на уровне "белого" ящика возможна, если вы формируете
адаптер-интерфейс между вашим нативным си-кодом и питон-тестами. Такой адаптер
может быть реализован при помощи Python/C API, либо при помощи ctypes.
В первом случае для проведения тестирования вам необходимо будет каждый раз
компилировать ваш код в специальный модуль расширения. Во втором случае
адаптер пишется полностью на питоне и слабо зависим от вашего си-кода. Вам
лишь необходимо обеспечить экспорт функций, которые вы хотите тестировать.
Экспорт функций может быть сделан не только при компиляции программы как
динамической библиотеки, но и при компиляции в обычную exe-программу.
На основе ctypes также реализован фреймворк для тестирования GUI-приложений:
pywinauto.
Объем данной обзорной статьи не позволяет описать всё существующее многобразие
стандартных и нестандартных библиотек в мире Питона. Практически во всех
областях, где только можно использовать Питон, его пытаются использовать и
писать под специфические нужды соответствующие библиотеки. Либо обвертки к
существующим Си-библиотекам.
Для выполнения питон-программы необходимо наличие в системе установленного
интерпретатора Питон. Большинство Линукс систем имеет в своем составе
предустановленный интерпретатор. Для Windows и Mac это не так.
Однако при помощи специальных программ возможна трансформация исходной
питон-программы в самостоятельное приложение, которое не будет зависеть от
наличия установленного интерпретатора Питон. Речь не идет о какой-либо форме
компиляции питон-кода в бинарный исполняемый файл. На самом деле при помощи
специальной программы можно сформировать специальное приложение, имеющее в
своем составе собственный интерпретатор, который и будет исполнять питон-код.
При этом как правило все необходимые библиотеки также входят в набор файлов
сформированного приложения. Поэтому приложения получается
полностью автономным, хотя и несколько великоватым по размеру.
Для формирования самостоятельных приложений для выполнения питон-кода
используются py2exe (для Windows), cx_Freeze (для Linux), py2app (для Mac).
Экспериментальные проекты для трансляции статического питон-кода на другие
языки:
- Shed Skin — транслятор статического питон-кода в С++-код
- Pyastra — транслятор подмножества языка Питон на ассемблер PIC16/PIC18
Хотите уточнить или задать свой вопрос? Пишите мне по электронной почте.
|
|