Запускаем OpenGL на python3 (ubuntu)

в 8:22, , рубрики: linux, OpenGL, python, python3, Ubuntu, Песочница, портирование, Программирование, метки: , , , , , ,

Лирическое отступление

Пару месяцев назад решил я таки изучить 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).
Качаем, например, второй пример, проверяем:
Запускаем OpenGL на python3 (ubuntu)
пытаемся запустить его на 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 на python3 (ubuntu)

Русские буквы, к сожалению, не поддерживает (мне было особо не нужно, поэтому я не стал разбираться).
Ну и можно порадоваться работающему OpenGL на нашей лошадке:)

Запускаем OpenGL на python3 (ubuntu)

Ссылка на архив с файлами:
Dropbox
Спасибо за внимание, надеюсь, эта статья кому-нибудь поможет. С удовольствием приму критику и предложения.

Источники

Огромное спасибо материалам с сайта http://nehe.gamedev.net/

Автор: Ktulhy

Источник

  1. Абакир:

    Профессионал. Нет слов.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js