Сборка библиотеки wxPython под Windows
Дата публикации: 09.01.2023
Дата последней правки: 10.06.2023
Содержание
Введение
wxPython - это сравнительно легковесная (по сравнению с Qt) библиотека для создания графического интерфейса приложений на языке Python. По сути wxPython является оболочкой над библиотекой wxWidgets, написанной на языке C++. Хотя разработчики wxPython подготавливают бинарные сборки библиотеки под различные операционные системы (Windows, Linux и macOS), но бывают случаи, когда требуется самостоятельно собрать библиотеку из исходников. В частности, для wxPython 4.2.1, на примере которой будет показан процесс сборки в данной статье, на pypi есть сборки только под 64-битные версии Windows, однако библиотека вполне может работать и на 32-битных системах, для этого нужно всего лишь собрать ее из исходников.
Если в системе, для которой отсутствует бинарная сборка, выполнить команду для установки библиотеки
то pip попробует собрать пакет из исходников самостоятельно. Если у вас в системе установлены все необходимые библиотеки, то скорее всего это ему даже удастся. Но, во-первых, это процесс достаточно долгий (на моем стареньком i7-3770 этот процесс занимает больше получаса), и поэтому иногда желательно один раз скомпилировать себе требуемую бинарную сборку, а потом ее быстро устанавливать, не ожидая новой пересборки. И, во-вторых, если проблема сборки выявится на этапе компиляции с использованием pip, определить причину неудачи будет сложнее по сравнению со случаем, когда вы будете собирать библиотеку по шагам самостоятельно.
К тому же процесс сборки библиотеки достаточно простой и не требует каких-то особых знаний и шаманств, он подробно описан в документации (в файле README.rst в корне исходников), но кто ж ее читает :), и к тому же могут возникнуть проблемы с отсутствующими библиотеками или требуемыми приложениями для сборки, и поэтому лучше сразу установить все необходимое, чтобы процесс сборки прошел гладко.
Процесс сборки
Установка требуемых инструментов
Для сборки под Windows понадобятся следующие инструменты:
- git.
- Python.
- MS Build Tools с установленной опцией "Desktop Development with C++".
- graphviz (используется для сборки справки).
Относительно git и Python, я думаю, вопросов быть не должно. Отмечу лишь, что для сборки wxPython вполне можно (и адже это будет правильнее) использовать виртуальное окружение Python с требуемой версией интерпретатора, но в дальнейшем для простоты будем подразумевать, что виртуальное окружение не используется, и требуемые библиотеки установлены глобально.
В дальнейшем процесс сборки я буду показывать на примере использования Python 3.8 32-bit. Эта достаточно старая версия Python выбрана, потому что это последняя версия интерпретатора, которая работает на Windows 7. Если вам нужно, чтобы ваша программа работала на этой пока еще не совсем редкой операционной системе (хорошо хоть не на Windows XP), то придется ограничиться Python 3.8. Ну а 32-битная версия была выбрана из-за того, что бинарная сборка для 64 бит лежит в pypi (в том числе и для Python 3.8), и в большинстве случаев нет смысла ее собирать самостоятельно. Несмотря на использование столь старой версии интерпретатора, примеры будут приводиться при компиляции в Windows 10 64-bit.
С установкой MS Build Tools проблем обычно тоже не возникает. Инсталятор сам прописывает все требуемые пути в переменные окружения, чтобы скрипт сборки мог использовать компилятор C++.
Скриншот инсталятора с выбранной опцией "Desktop Development with C++" показан на следующем рисунке:
Что касается Graphviz, то его нужно не просто установить, но и прописать путь до его запускаемого файла в переменной окружения PATH. Если вы устанавливали GraphViz в папку по умолчанию (C:\Program Files\GraphViz), то в PATH нужно добавить путь C:\Program Files\GraphViz\bin:
GraphViz - это инструмент для генерации картинок с диаграммами по текстовому описанию. Он часто используется для создания справки, например, для создания диаграмм наследования классов.
Затем надо установить требуемые для сборки библиотеки для Python:
Библиотека attrdict используется в скрипте сборки. Эта библиотека предоставляет нестандартную коллекцию, напоминающую словарь, отличие которого заключается в том, что ключи можно запрашивать и через квадратные скобки, и как доступ к свойствам. Одна из плюшек этой библиотеке заключается в том, что она позволяет создавать данный объект по текстовому представлению, например из строки в формате yaml.
Библиотека sip используется для создания Python-обертки над библиотекой, написанной на C++. Об этой библиотеке я когда-то писал статью в двух частях: Создание Python-обвязки для библиотек, написанных на C/C++, с помощью SIP. Часть 1 и часть 2.
Библиотека Sphinx используется для генерации документации.
Библиотека wheel используется для сборки пакетов в формате wheel.
Клонирование репозитория с исходниками
Исходные коды библиотеки wxPython расположены в репозитории github https://github.com/wxWidgets/Phoenix. Такое странное название исторически сложилось как кодовое имя проекта в процессе перехода wxPython с Python 2 на Python 3. Это был долгий и мучительный процесс.
Для начала нужно клонировать исходники из репозитория и перейти в созданную после клонирования папку с исходниками. Для этого в консоли нужно выполнить команды:
cd Phoenix
Затем нужно переключиться на требуемую версию, если только вы не планируете собирать текущую ветку master, которая еще находится в разработке. Например, для версии wxPython 4.2.1 имя тега - "wxPython-4.2.1".
После этого нужно скачать сабмодули и при этом не забыть установить флаг --recursive.
Компиляция
Теперь мы подошли к самому волнительному моменту, на котором обычно и возникают ошибки, как правило связанные с отсутствующими библиотеками. По идее, если все библиотеки установлены и пути до требуемых запускаемых файлов прописаны в переменной окружения PATH, то все должно пройти без проблем, но этот процесс может занять сравнительно долгое время.
Процесс сборки состоит из нескольких этапов. Последовательно их выполним.
Первый шаг подготавливает файлы для будущей документации. Этот шаг требует наличия интернета. Во время его выполнения скрипт проверит, установлена ли у вас программа Doxygen для генерации документации, и если нет, то скачает ее в папку bin, а затем использует ее для генерации файлов документации.
Следующий шаг сборки:
Этот шаг на основе py-файлов из папки etg создает файлы для дальнейшей компиляции с помощью sip. Новые файлы создаются в папке sip\gen и имеют расширение .sip. Этот процесс уже чуть более долгий.
Затем запускаем компиляцию с помощью sip:
И, наконец, запускаем непосредственно компиляцию.
После удачного завершения компиляции бинарная сборка библиотеки будет располагаться в папке wx:
Сборка пакетов Python
К этому моменту основная часть уже выполнена. Осталось упаковать скомпилированную библиотеку в пакет, который можно будет установить с помощью pip. Для начала можно создать бинарный пакет с помощью команды
Эта операция не займет много времени.
В результате ее выполнения будет создан файл wxPython-4.2.1-win32-py3.8.tar.gz (или с похожим именем в зависимости от того, какую версию wxPython вы собираете и под какой интерпретатор) в папке dist
А можно собрать пакет в формате wheel (что в последнее время является предпочтительным). Для сборки пакета в формате wheel нужно выполнить команду:
После завершения этой операции в той же папке dist будет создан файл wxPython-4.2.1-cp38-cp38-win32.whl.
Проверка пакетов
Убедимся, что только что созданный wheel-пакет работает нормально. Для этого перейдем в папку dist с созданными пакетами и установим wheel-пакет с помощью pip:
pip install wxPython-4.2.1-cp38-cp38-win32.whl
При необходимости pip скачает и установит требуемые зависимости (six, pillow, numpy).
Теперь запустим интерпретатор Python и убедимся, что модуль wx импортируется без ошибок:
>>> import wx
>>> wx.__version__
'4.2.1'
В результате должна быть выведена строка с номером версии wxPython.
Заключение
Вот, собственно, и все. После выполнения перечисленных шагов будет получен бинарный пакет, пригодный для установки с помощью pip, и при частой переустановке библиотеки на системах, для которых не подготовлены бинарные сборки авторами, не придется каждый раз долго ждать сборки и переживать по поводу результата компиляции.
В следующем разделе приведены ссылки на статьи по близким темам.
Похожие статьи
- Компиляция библиотеки wxWidgets в Code::Blocks
- Сайзеры в wxWidgets / wxPython.
- Использование Scintilla в wxPython
- Создание Python-обвязки для библиотек, написанных на C/C++, с помощью SIP. Часть 1
- Создание Python-обвязки для библиотек, написанных на C/C++, с помощью SIP. Часть 2
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.