Невозможно импортировать opengl.gl в python на macos

Я использую 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/[email protected]/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

person Iyad Boustany    schedule 18.08.2020    source источник


Ответы (4)


Эта ошибка возникает из-за того, что 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 )

to

    fullName = '/System/Library/Frameworks/OpenGL.framework/OpenGL'
person Tom Goddard    schedule 23.09.2020
comment
Где находится PyOpenGL? - person Julian A.; 18.12.2020
comment
Да, как мне получить доступ к файлу? - person yudhiesh; 01.01.2021
comment
Как мне получить правильный путь к файлу для моего конкретного случая? пожалуйста, порекомендуйте - person aeengineer; 05.01.2021
comment
@Юлиана. @yudhiesh @aeengineer вы можете найти файл в этом месте ~/anaconda3/lib/python3.7/site-packages/OpenGL/platform/ctypesloader.py или по аналогичным путям к вашей установке python - person imflash217; 27.02.2021

Поскольку я ненавижу идею исправления пакета 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
person bht    schedule 06.01.2021
comment
Сработало у меня, спасибо :) - person Yuras; 15.01.2021

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

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

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

person Anjo    schedule 26.12.2020
comment
Действительно исправил мои проблемы. - person YuvGM; 07.03.2021

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

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