Не удается импортировать opengl.gl на python в macos

#python #macos #opengl #pyopengl #macos-big-sur

#python #macos #opengl #pyopengl #macos-big-sur

Вопрос:

Я использую OpenGL для рендеринга сцены на python. Мой код отлично работает в Windows, но по какой-то причине у меня возникают проблемы при импорте opengl.gl в macOS.

Проблема возникает при вызове from OpenGL.GL import ... как в скриптах Python, так и в консоли python.

Более конкретно, вот точный вызов в моем скрипте:

 from OpenGL.GL import glGenBuffers, glBindBuffer, glBufferData, 
    glGenVertexArrays, glBindVertexArray, glEnableVertexAttribArray, glVertexAttribPointer, 
    glDrawArrays, glUseProgram, glEnable, glDisable, 
    GL_ARRAY_BUFFER, GL_STATIC_DRAW, GL_DEPTH_TEST, 
    GL_FLOAT, GL_FALSE, 
    GL_TRIANGLES, GL_LINES, GL_LINE_STRIP
  

Это приводит к следующей ошибке:

        Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 35, in GL
    return ctypesloader.loadLibrary(
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/ctypesloader.py", line 36, in loadLibrary
    return _loadLibraryWindows(dllType, name, mode)
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/ctypesloader.py", line 89, in _loadLibraryWindows
    return dllType( name, mode )
  File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ctypes/__init__.py", line 373, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ('dlopen(OpenGL, 10): image not found', 'OpenGL', None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/iyadboustany/Desktop/lensmaster/Lensmaster.py", line 18, in <module>
    from MainWindow import MainWindow
  File "/Users/iyadboustany/Desktop/lensmaster/MainWindow.py", line 14, in <module>
    from Robot import Robot
  File "/Users/iyadboustany/Desktop/lensmaster/Robot.py", line 8, in <module>
    from Graphics.Scene import DHNode
  File "/Users/iyadboustany/Desktop/lensmaster/Graphics/Scene.py", line 13, in <module>
    from OpenGL.GL import glGenBuffers, glBindBuffer, glBufferData, 
  File "/usr/local/lib/python3.8/site-packages/OpenGL/GL/__init__.py", line 3, in <module>
    from OpenGL import error as _error
  File "/usr/local/lib/python3.8/site-packages/OpenGL/error.py", line 12, in <module>
    from OpenGL import platform, _configflags
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/__init__.py", line 36, in <module>
    _load()
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/__init__.py", line 33, in _load
    plugin.install(globals())
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 97, in install
    namespace[ name ] = getattr(self,name,None)
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 15, in __get__
    value = self.fget( obj )
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 62, in GetCurrentContext
    return self.CGL.CGLGetCurrentContext 
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 15, in __get__
    value = self.fget( obj )
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 45, in CGL
    def CGL(self): return self.GL
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/baseplatform.py", line 15, in __get__
    value = self.fget( obj )
  File "/usr/local/lib/python3.8/site-packages/OpenGL/platform/darwin.py", line 41, in GL
    raise ImportError("Unable to load OpenGL library", *err.args)
ImportError: ('Unable to load OpenGL library', 'dlopen(OpenGL, 10): image not found', 'OpenGL', None)
  

Примечания:

  • Запуск glxgears работает просто отлично.
  • Я запускаю бета-версию macOS Big Sur (20A5343i)
  • Я использую Python 3.8.5
  • Я установил opengl с помощью pip: pip3 install PyOpenGL PyOpenGL_accelerate

Ответ №1:

Эта ошибка вызвана тем, что у Big Sur больше нет библиотеки OpenGL или других системных библиотек в стандартных расположениях файловой системы и вместо этого используется кэш. PyOpenGL использует ctypes, чтобы попытаться найти библиотеку OpenGL, и не может ее найти. Исправление ctypes в Python, чтобы он находил библиотеку, является предметом этого запроса на извлечение

https://github.com/python/cpython/pull/21241

Таким образом, будущая версия Python должна решить проблему.

Чтобы исправить это, теперь вы можете отредактировать файл PyOpenGL OpenGL/platform/ctypesloader.py изменение строки

     fullName = util.find_library( name )
  

Для

     fullName = '/System/Library/Frameworks/OpenGL.framework/OpenGL'
  

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

1. Где находится PyOpenGL?

2. Да, как бы мне получить доступ к файлу?

3. Как мне получить правильный путь к файлу для моего конкретного случая? Пожалуйста, посоветуйте

4. @JulianA. @yudhiesh @aeengineer вы можете найти файл по этому адресу ~/anaconda3/lib/python3.7/site-packages/OpenGL/platform/ctypesloader.py или аналогичные пути к вашей установке python

5. содержимое (базового) [~/Downloads /resources] $ ls /System /Library /Frameworks /OpenGL.framework / Libraries Версии ресурсов , <- это эти, и добавление этого пути к файлу не помогло, поскольку там не было папки OpenGL

Ответ №2:

Поскольку я ненавижу идею исправления пакета Python (плюс, это действительно сложно сделать с помощью Conda для установки указанного пакета), я предлагаю этот клудж в качестве обходного пути, пока Python не получит обновление Big Sur (оно же Big Nuisance):

 try:
    import OpenGL as ogl
    try:
        import OpenGL.GL   # this fails in <=2020 versions of Python on OS X 11.x
    except ImportError:
        print('Drat, patching for Big Sur')
        from ctypes import util
        orig_util_find_library = util.find_library
        def new_util_find_library( name ):
            res = orig_util_find_library( name )
            if res: return res
            return '/System/Library/Frameworks/' name '.framework/' name
        util.find_library = new_util_find_library
except ImportError:
    pass
  

Ответ №3:

Лучше изменить это на

 fullName = "/System/Library/Frameworks/{}.framework/{}".format(name,name)
  

в противном случае GLUT не будет работать. По крайней мере, это позволило мне снова запустить 3D-материал Cozmo SDK.

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

1. Действительно, исправлены мои проблемы.

Ответ №4:

К вашему сведению, в моем случае это было:

         fullName = '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/OpenGL'
  

Ответ №5:

Ни один из этих ответов не является действительно подходящим — было несколько проблем как с macOS, так и с PyOpenGL.

К счастью, однако — все, кажется, наконец-то работает, если мы обновимся до Python3.10 (или выше)