简体   繁体   English

macos python无法导入opengl.gl

[英]Unable to import opengl.gl in python on macos

I am using OpenGL to render a scene in python. My code works perfectly fine on windows but, for some reason, I'm having issues when importing opengl.gl on MacOS.我正在使用 OpenGL 渲染 python 中的场景。我的代码在 windows 上运行良好,但由于某种原因,我在 MacOS 上导入 opengl.gl 时遇到问题。

The issue arises when calling from OpenGL.GL import... in both python scripts and the python console.在 python 脚本和 python 控制台中调用from OpenGL.GL import...时会出现问题。

More specifically here is the exact call in my script:更具体地说,这是我脚本中的确切调用:

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

This results in the following error:这会导致以下错误:

       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)

Notes :注意事项

  • Running glxgears works just fine.运行 glxgears 工作得很好。
  • I'm running macOS Big Sur beta (20A5343i)我正在运行 macOS Big Sur 测试版 (20A5343i)
  • I'm using python 3.8.5我正在使用 python 3.8.5
  • I installed opengl using pip: pip3 install PyOpenGL PyOpenGL_accelerate我使用 pip 安装了 opengl: pip3 install PyOpenGL PyOpenGL_accelerate

This error is because Big Sur no longer has the OpenGL library nor other system libraries in standard locations in the file system and instead uses a cache.此错误是因为 Big Sur 在文件系统的标准位置不再有 OpenGL 库或其他系统库,而是使用缓存。 PyOpenGL uses ctypes to try to locate the OpenGL library and it fails to find it. PyOpenGL 使用 ctypes 尝试定位 OpenGL 库,但找不到它。 Fixing ctypes in Python so that it will find the library is the subject of this pull request修复 Python 中的 ctypes,以便它会发现库是此拉取请求的主题

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

So a future version of Python should resolve the problem.所以未来版本的 Python 应该可以解决这个问题。

To fix it now you can edit PyOpenGL file OpenGL/platform/ctypesloader.py changing line现在要修复它,您可以编辑 PyOpenGL 文件 OpenGL/platform/ctypesloader.py 更改行

    fullName = util.find_library( name )

to

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

Since I hate the idea of patching a Python package (plus it is really hard to manage that with use of Conda to install said package), I offer this kludge as a workaround for until Python gets its Big Sur (aka Big Nuisance) update: Since I hate the idea of patching a Python package (plus it is really hard to manage that with use of Conda to install said package), I offer this kludge as a workaround for until Python gets its Big Sur (aka Big Nuisance) update:

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

It's better to change this to最好将其更改为

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

otherwise GLUT won't work.否则 GLUT 将无法工作。 At least, this let me run the Cozmo SDK's 3d stuff again.至少,这让我再次运行 Cozmo SDK 的 3d 东西。

FYI, in my case it was:仅供参考,就我而言,它是:

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

None of these are really very suitable answers - there were several issues with both MacOS and pyOpenGL.这些都不是真正非常合适的答案——MacOS 和 pyOpenGL 都存在几个问题。

Fortunately, however - everything seems to be working at last if we upgrade to Python3.10 (or above)然而,幸运的是——如果我们升级到 Python3.10(或更高版本),一切似乎终于可以正常工作了

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM