Войти
Уголок tool-программСтатьи

Python под рукой

Автор:

Python - это интерпретируемый объектно-ориентированный язык программирования высокого уровня. Часто в литературе этот язык называют языком сверхвысокого уровня. Мне не известны критерии, по которым язык программирования можно отнести к языкам сверхвысоким уровня, поэтому, что бы не попасть впросак, я избегаю такой формулировки.

Несколько тезисов по самому языку, если позволите:

  • Python можно использовать как встраиваемый язык.
  • Код интерпретатору можно передавать интерактивно. Программа, например, может формировать код в текстовую строку и передавать его интерпретатору или компилятору. Компилятор возвращает код в "готовом к употреблению" виде.
  • В Python'е нет необходимости объявлять переменные заранее, хотя каждая переменная имеет свой тип.
  • Классы можно создавать во время работы программы, более того, во время выполнения программы, можно менять определения уже созданных классов, тем самым, меняя поведение их экземпляров. Можно менять определение и экземпляров, например, во время работы можно изменить класс интерпретатора.
  • В Python'е можно переопределять некоторые операторы (+, -, +=, ==, in и пр.).
  • Где и как может использоваться Python? Как и большинство других популярных высокоуровневых языков Python, на текущем этапе своего развития, может быть использован при решении любых задач (ну или почти любых). Если у вас возникают сомнения в этом утверждении, вы можете ознакомиться с огромным разнообразием уже написанных библиотек и модулей для него. Тем не менее, решать эти пресловутые "любые задачи" на Python'е я не буду советовать ни здесь, ни где-либо еще.

    Вот вкратце задачи, которые можно решать на Python'е и библиотеки/технологии доступные для их решения:

  • Веб-сервисы, интранет- и интернет-сервера, веб-приложения, CGI-скрипты: Twisted, Nevow, Zope, Plone, Webware, CherryPy и еще пол-сотни библиотек.
  • Пользовательские интерфейсы, логика приложения: GTK, wxWidgets, tk, pywin32 (входит большая чать API Windows, в том числе COM).
  • Базы данных, в том числе уникальные пакеты и решения: SQLObject, SQLAlchemy, ADO, Sqlite, Interbase, PosgreSQL, MySQL и т.д.
  • Графические 2D/3D приложения/игры: OGRE, Panda3D, PyGame, PIL, OpenGL, DirectX, Soya, CGKit и т.д.
  • Мультимедиа: тут выбор не так велик, но все что необходимо присутствует.
  • Все остальное: существует огромное разнообразие библиотек, от широко распространенных, ставших некоторым стандартом, до перспективных, только начатых разработок. OpenSSL, pycrypto, SVN, ctypes, NumPy, egenix и т.д. Выбор настолько велик что на изучение альтернатив уходит очень много времени, согласен, это скорее недостаток :-).
  • В этой статье я не буду давать уроки по программированию на Python'е и не буду сравнивать его с другими языками, что уж считаю занятием совсем неблагодарным. Также я не буду давать примеры по "симбиозу" Python'а с какими-либо другими языками. Я ограничусь тем, что поделюсь своим опытом в использовании этого языка при написании мелких или очень мелких утилит, необходимость в которых, по крайней мере у меня, возникает крайне часто.

    Перейдем от слов к делу.

    Графика
      PIL и NumPy
      CGKit
    Сеть
    Послесловие

    Графика

    Посмотрим, как нам может помочь Python в той области GameDev'а, которая я думаю, наиболее симпатична всем, без исключения, присутствующим здесь программистам (и программисткам ;-).

    PIL и NumPy

    Это название двух библиотек Python'а. Они, как это принято со всеми хорошими библиотеками, не входят в стандартный дистрибутив Python. Стандартный, то есть оригинальный, авторский. Первый из них Python Imaging Library (в простонародье PIL) - как видно из названия это библиотека для работы с растровыми изображениями. Библиотека обладает весьма внушительным набором функций для обработки изображений, поддерживает множество графических форматов, в том числе, способна работать с видео (хотя эта способность не реализована в последней версии, 1.1.5), есть заявка на работу с растровыми форматами (wmf и emf), хотя опять же, реализованы только заглушки. Вторая библиотека (раньше вы могли её встречать как Numeric), это математический пакет, ориентированный на работу с многомерными массивами. Я не зря выделил эти библиотеки в один раздел, дело в том, что они очень часто используются вместе, вызвано это прежде всего способностью NumPy очень быстро обрабатывать массивы.

    Найти применение PIL можно без труда. Я, например, не раз прибегал к помощи Python'а и этой библиотеки для "перепаковки" и фильтрации изображений. Под фильтрацией, здесь, я понимаю изменение разрешения, изменение оттенка, контрастность и пр., а так же добавления текста, логотипа и пр. В качестве примера я выбрал банальную (конечно же, несколько надуманную) задачу.

    Краткая постановка: имеются ресурсы игры, что бы быть точнее, изображения; хранятся они в разных папках и файлах разных типов; нужно все эти ресурсы переместить в единую директорию с изменением имен файлов в соответствии с именами каталогов в которых они находятся; "пометить" эти изображения (я вывел на них свой псевдоним); сохранить в формате jpeg. Тривиальная задача. Код был написан за 5-10 минут.

    Файлы для загрузки:

  • Ресурсы и скрипт (rar, 304Kb): исходные и получившиеся в результате работы изображения.
  • Только скрипт (rar, 597b): напомню, требуется Python и библиотека PIL.
  • Изображение

    CGKit

    Полное название пакета - The Python Computer Graphics Kit. CGKit является, пожалуй, единственной графической разработкой под Python, которую можно отнести к решению более высокому уровню, нежели библиотека, отнести к пакету решений. Правда надо сделать скидку на то, что CGKit разрабатывается энтузиастами что, безусловно, сказывается как на скорости исправления ошибок, так и на скорости внедрения новых функций. Тем не менее, эта разработка находит свое применение, в том числе и в коммерческих проектах. Библиотека обладает интересной архитектурой (к сожалению, я очень мало общался с CGKit что бы дать ей более развернутую характеристику), но главным её коньком является способность работать с RenderMan-совместимыми рендерами и компилировать с их помощью как анимацию, так статические изображения. Совершенно очевидно, что использование RenderMan Shader доступно и ограничено лишь выбранным визуальным компилятором, а не библиотекой.

    Я бы слукавил, если бы сказал, что CGKit сослужил мне добрую службу, так получилось, что с разработкой игр в жизни мне приходится сталкиваться не так часто, как мне бы этого хотелось. Вот и с CGKit общался я лишь дважды в жизни. Первый раз, когда пытался рассматривать его как базу для графической составляющей гипотетической игры, а второй - при написании этой статьи.

    Что бы продемонстрировать как и для чего может быть использована эта библиотека, я придумал задачу, которая состоит в создании заставки или демо ролика к игре (возможно еще не созданной). Для начала мы должны из как-то сделанной игры "взять" как-то работающие уровни и сцены. Тут нужно уточнить, что уровни - это окружение используемое в игре на каком-то её этапе, а сцена - это динамическое свойство окружения игры, сцены характеризуются физической моделью нашей игры, сценарием поведения уровня и текущими действия игрока. Проще говоря, нужно повторить обстановку уровня, которая попадает в камеру и захватить координаты и трансформации динамических объектов этого уровня.

    Я поленился и воспроизвел демонстрационный игровой уровень лишь частично. Хотя компилирование ролика предполагает использование возможности создания реалистичных материалов и различных спецэффектов, которые не возможно использовать при runtime рендеринге. В файлах примера вы найдете...

  • Buggy.exe - прототип игры. Запустите приложение, теперь все координаты автомобиля будут записываться в Buggy.dat.
  • dat2tif.py - скрипт, использующий библиотеку CGKit для моделирования уровня и воспроизведения всех позиций автомобиля. Для просмотра сцены в реальном времени используйте утилиту CGKit viewer.py или, для компилирования одного или нескольких кадров, render.py.
  • tif2png.py - преобразование полученных кадров в формат png. Это преобразование нужно, так как для "склеивания" кадров я использовал VirtualDub, а он отказывается понимать tif'ы. В этом скрипте использована библиотека PIL.
  • out.avi - получившийся видеоролик. Я ограничился шестью кадрами в секунду для экономии вашего трафика и моего времени (времени на компиляцию).
  • Файлы для загрузки:

  • Все файлы (rar, 599Kb): Buggy.exe, все исходники, ресурсы, видеоролик.
  • Видеоролик (avi, 211Kb).
  • Только исходники (rar, 8Kb).
  • Изображение

    Страницы: 1 2 Следующая »

    31 мая 2006 (Обновление: 30 июня 2006)

    Комментарии [15]