Запускаем OpenGL на 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).
Качаем, например, второй пример, проверяем:

пытаемся запустить его на 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/
Поделиться публикацией

Комментарии 9

    +2
    Суть статьи — «заходим на сайт nehe и говорим ему спасибо за проделанную работу».
      +2
      Не совсем.
      Примеры на его сайте написаны для более младших версий python, а тут я постарался собрать и как сделать так, что бы OpenGL заработал на python 3, и некоторые (возможно, для новичка) не очевидные вещи.
      Да и в самом начале я предупредил, что «Статья ориентирована в первую очередь на новичков в python (таких как я), и написана в стиле «установи то-то и то-то», поэтому просьба старожилам не кидаться тапками и отнестись с пониманием.», так что спасибо, что перефразировали мои же слова.
        0
        Просто, мне кажется, если человек возьмёт примеры nehe и попробует запустить на python 3, и появятся проблемы, то они легко решаться с помощью того же stackoverflow

          +1
          Тогда давайте закроем habr и на главное странице сделаем большую ссылку на stackoverflow!
          Я же сказал — статья для новичков. Если вы объясните, что ещё вам от неё надо, то я с удовольствием постараюсь раскрыть это в следующей статье, спасибо.
            0
            Просто, по сути, большая часть материала не ваша.
            Вот если бы было что-то вроде «проблемы, с которыми я столкнулся в python 3 при разработке того-го и того-то», было б другое дело.

            p.s. я не против статьи как таковой, может кому-то она и пригодится.
              +1
              Согласен. Я просто собрал всё воедино, и об этом я и написал в начале (Лирическое отступление) и в конце (в источниках).
      +1
      sudo easy_install3 pip

      Есть же virtualenv.

      Ссылка на архив с файлами

      Есть же github.
        +1
        Уважаемый автор, очень хорошо что вы решили изучить питон. Но пожалуйста, не пишите больше статей «от новичка новичку» поизучав что-либо в течении двух месяцев, особенно из серии «возьмите туториал оттуда, а я тут расскажу, как его запустить», потому что ИНФОРМАЦИИ такие статьи несут ноль.
          0
          Спасибо за комментарий, учту в будущем.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое