Лирическое отступление
Пару месяцев назад решил я таки изучить Python. Но… только сунувшись во всю эту среду, передо мной встал выбор: учить относительно новый python3 или же python2.7. Выбор пал в сторону python 3, пусть на нём работает лишь малое количество того, что уже есть под python2.7, да и просто интересно было поучаствовать в развитии языка.
Недавно встала потребность визуализации некоторых данных (именно в openGL), поэтому было решено разобраться, что и как, собрать всё воедино и рассказать об этом хабражителям.
Статья ориентирована в первую очередь на новичков в python (таких как я), и написана в стиле «установи то-то и то-то», поэтому просьба старожилам не кидаться тапками и отнестись с пониманием.
Подготавливаемся
Так как нам придётся собирать библиотекии, нам нужно поставить python3-dev. python3-setuptools нам нужен для установки easy_install3.
Ставим:
sudo apt-get install python3-dev python3-setuptools
Теперь можно и библиотеки собрать.
Библиотеки
Ставим pip для python3 через установленный easy_install3:
sudo easy_install3 pip
pip установлен, теперь можно собирать нужные нам библиотеки:
sudo pip-3.2 install numpy PyOpenGL PyOpenGL_accelerate
(на момент установки актуальной версией pip была 3.2, в прошлом, будущем или параллельной вселенной это число может отличаться).
Для работы модуля OpenGL.GLUT ставим freeglut:
sudo apt-get install freeglut3
Теперь всё готово, и можно пробовать запускать примеры.
Не всё так просто
Идём на сайт http://nehe.gamedev.net/tutorial, изучаем примеры, качаем код на python, проверяем работоспособность на python2.7 (если установлены библиотеки OpenGL для pytohn2.7 — всё делается аналогичным образом, pip
install numpy PyOpenGL PyOpenGL_accelerate
).Качаем, например, второй пример, проверяем:
пытаемся запустить его на python3, получаем ошибку:
$ python3 lesson02.py
File "lesson02.py", line 153
print "Hit ESC key to quit."
^
SyntaxError: invalid syntax
Перерабатываем его с помощью утилиты 2to3 (на первых порах это добавление скобочек к
print
):RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored test.py
--- lesson02.py (original)
+++ lesson02.py (refactored)
@@ -150,6 +150,6 @@
glutMainLoop()
# Print message to console, and kick off the main to get it rolling.
-print "Hit ESC key to quit."
+print("Hit ESC key to quit.")
main()
RefactoringTool: Files that need to be modified:
RefactoringTool: lesson02.py
, но и тут нас ждёт сюрприз:
Hit ESC key to quit.
Traceback (most recent call last):
File "lesson02.py", line 154, in <module>
main()
File "lesson02.py", line 109, in main
glutInit(())
File "/usr/local/lib/python3.2/dist-packages/OpenGL/GLUT/special.py", line 318, in glutInit
holder[i] = arg
TypeError: bytes or integer address expected instead of str instance
Что бы всё взлетело, нам нужно передать аргументы командной строки в glutInit():
glutInit(sys.argv)
Запускаем ещё раз:
Hit ESC key to quit.
Traceback (most recent call last):
File "test.py", line 154, in <module>
main()
File "test.py", line 127, in main
window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99")
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
Так-так-так, а это что ещё… После недолгого гугления обнаруживаем, что заголовок окна должен быть байтовой строкой, соответственно, добавляем «b» перед строкой:
window = glutCreateWindow(b"Ura, vzletelo!")
И о счастье!
Русские буквы, к сожалению, не поддерживает (мне было особо не нужно, поэтому я не стал разбираться).
Ну и можно порадоваться работающему OpenGL на нашей лошадке:)
Ссылка на архив с файлами:
Dropbox
Спасибо за внимание, надеюсь, эта статья кому-нибудь поможет. С удовольствием приму критику и предложения.
Источники
Огромное спасибо материалам с сайта http://nehe.gamedev.net/